nls という関数があります。具体例を挙げて説明しましょう。
例: 表 1 のような x,y の測定値に対して,y = α / { 1 + β exp(-γx) } + δ という関数をあてはめ,パラメータ,α,β,γ,δを求める(同じ問題を Excel で解く方法)。
表 1. 二変数データ x y 0 98 5 97 10 96 15 94 20 92 25 84 30 78 35 73 40 61 45 53 50 43 55 37 60 30 65 28 70 24 75 22 80 21 85 20 90 20 95 20 100 18手順
# x は 0 から始まり,5 刻みで,100 までの 21 個の値を取る
> x <- seq(0,100,5)
# y は,順に 21 個の値を取る
> y <- c(98, 97, 96, 94, 92, 84, 78, 73, 61, 53, 43, 37, 30, 28, 24, 22, 21, 20, 20, 20, 18)
# データフレーム dat を作る
> dat <- data.frame(x, y)
> dat # 作ったのは,以下のようなデータ
x y
1 0 98
2 5 97
3 10 96
: 【中略】
19 90 20
20 95 20
21 100 18
# y ~ a/(1+b*exp(-c*x))+d が,あてはめるべき関数
# a, b, c, d はパラメータ(これを推定する)
# start= で,初期値を指定する 初期値の選び方
> nls(y ~ a/(1+b*exp(-c*x))+d, dat, start=list(a=1, b=1, c=1, d=1))
# 初期値が不適切な場合には,以下のようなエラーメッセージが出るので,初期値を変えてみる
Error in nls(y ~ a/(1 + b * exp(-c * x)) + d, dat, start = list(a = 1, :
singular gradient
# nls 関数の引用だけだと,モデル関数,推定されたパラメータ値,残差平方和が出力される
> nls(y ~ a/(1+b*exp(-c*x))+d, dat, start=list(a=-80, b=47, c=0.1, d=100))
Nonlinear regression model
model: y ~ a/(1 + b * exp(-c * x)) + d
data: dat
a b c d
-81.19250400 47.73105651 0.09353186 100.00271945
residual sum-of-squares: 16.63448
# nls 関数の結果をオブジェクトに付値(代入)すると,後で,いろいろな結果を選択して出力することができる
> result <- nls(y ~ a/(1+b*exp(-c*x))+d, dat, start=list(a=-100, b=50, c=0.2, d=100))
# オブジェクトに対して sumamry 関数を適用すると,パラメータの推定値,標準誤差,t 値,P 値,のほかに,残差標準誤差,パラメータ間の相関係数が出力される
> summary(result)
Formula: y ~ a/(1 + b * exp(-c * x)) + d
Parameters:
Estimate Std. Error t value Pr(>|t|)
a -81.19250 1.03708 -78.290 < 2e-16 ***
b 47.73111 6.52126 7.319 1.20e-06 ***
c 0.09353 0.00300 31.180 < 2e-16 ***
d 100.00272 0.76138 131.343 < 2e-16 ***
---
Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1
Residual standard error: 0.9892 on 17 degrees of freedom
Correlation of Parameter Estimates:
a b c
b 0.8328
c 0.8249 0.9709
d -0.8968 -0.8118 -0.7241