まずは平均値のデータでカーブフィッティングを行います。
ggplot2では非線形近似曲線を描いてくれるので、グラフの描画には実際には必要ありません。
しかし被験者ごと、あるいは群平均ごとに主観的等価点(PSE)や丁度可知差異(JND)を算出する場合には、モデルを作ってパラメータ(係数)の推定を行う必要があります。
非線形回帰分析には、nls()が使えます。
nlsは非線形最小二乗法(nonlinear least squere)でパラメータ推定を行います。
未知のパラメータa, bを求める際、初期値(start)を設定する必要があります。
Rによる非線形最小二乗法
fit <- nls(rate ~ a * log(duration) + b, start = c(a = 1, b = 1), data = d2) > fit Nonlinear regression model model: rate ~ a * log(duration) + b data: d2 a b 0.5136 0.3853 residual sum-of-squares: 0.5382 Number of iterations to convergence: 1 Achieved convergence tolerance: 3.706e-08
今回の例では、a = 0.5136、b = 0.3853と出力されます。
値を取り出す場合は、
a <- summary(fit)$coefficients[2] b <- summary(fit)$coefficients[1]
同じように、一般化線形モデルでもパラメータ推定を行うことができます。
fit2 < -glm(rate ~ log(duration), family = gaussian, data=d2) > fit Call: glm(formula = rate ~ log(duration), data = d2) Coefficients: (Intercept) log(duration) 0.3853 0.5136 Degrees of Freedom: 13 Total (i.e. Null); 12 Residual Null Deviance: 4.524 Residual Deviance: 0.5382 AIC: 0.11 a <- fit2$coefficients[2] b <- fit2$coefficients[1] # fit2$coefficients["(Intercept)"] でもOK。
なお、MatlabのCurve fitting toolboxのfittypeでも同じ結果を得ることができます。
Matlab ドキュメンテーション
これでパラメータ推定ができました。
Part 3へ続く。