R では、lm()
関数を介して線形最小二乗モデルが適合されます。数式インターフェイスを使用すると、subset
引数を使用して、実際のモデルに適合させるために使用されるデータ ポイントを選択できます。次に例を示します。
lin <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2))
linm <- lm(y ~ x, data = lin, subset = 2:4)
与える:
R> linm
Call:
lm(formula = y ~ x, data = lin, subset = 2:4)
Coefficients:
(Intercept) x
-1.633 1.500
R> fitted(linm)
2 3 4
-0.1333333 1.3666667 2.8666667
二重ログについては、2 つの選択肢があると思います。i) 上記のように 2 つの別々のモデルを推定するか、ii) ANCOVA を介して推定します。対数変換は、 を使用した式で行われますlog()
。
2 つの別々のモデルを介して:
logm1 <- lm(log(y) ~ log(x), data = dat, subset = 1:7)
logm2 <- lm(log(y) ~ log(x), data = dat, subset = 8:15)
または、指標変数が必要な ANCOVA を介して
dat <- transform(dat, ind = factor(1:15 <= 7))
logm3 <- lm(log(y) ~ log(x) * ind, data = dat)
これら 2 つのアプローチが同等かどうかを尋ねるかもしれません。そうですね、モデル係数を介してこれを示すことができます。
R> coef(logm1)
(Intercept) log(x)
-0.0001487042 -0.4305802355
R> coef(logm2)
(Intercept) log(x)
0.1428293 -1.4966954
したがって、別々のモデルの 2 つの勾配は -0.4306 と -1.4967 です。ANCOVA モデルの係数は次のとおりです。
R> coef(logm3)
(Intercept) log(x) indTRUE log(x):indTRUE
0.1428293 -1.4966954 -0.1429780 1.0661152
2つをどのように調整しますか?さて、私がセットアップした方法はind
、logm3
から推定される値をより直接的に与えるためにパラメータ化されていlogm2
ます。と の切片は同じであり、 の係数も同じlogm2
です。の係数に相当する値を取得するには、まず切片に対して操作を行う必要があります。logm3
log(x)
logm1
R> coefs[1] + coefs[3]
(Intercept)
-0.0001487042
ここで、 の係数indTRUE
は、グループ 1 の平均とグループ 2 の平均の差です。勾配については、次のようになります。
R> coefs[2] + coefs[4]
log(x)
-0.4305802
これは、得られたものと同じでありlogm1
、グループ 2 の勾配 ( ) に基づいており、coefs[2]
グループ 1 の勾配の差 ( ) によって修正されていcoefs[4]
ます。
プロットに関しては、簡単な方法はabline()
単純なモデルを経由することです。たとえば、通常のデータの例:
plot(y ~ x, data = lin)
abline(linm)
ログ データについては、もう少し工夫が必要かもしれません。ここでの一般的な解決策は、データの範囲を予測し、予測をプロットすることです。
pdat <- with(dat, data.frame(x = seq(from = head(x, 1), to = tail(x,1),
by = 0.1))
pdat <- transform(pdat, yhat = c(predict(logm1, pdat[1:70,, drop = FALSE]),
predict(logm2, pdat[71:141,, drop = FALSE])))
累乗することにより、元のスケールでプロットできるyhat
plot(y ~ x, data = dat)
lines(exp(yhat) ~ x, dat = pdat, subset = 1:70, col = "red")
lines(exp(yhat) ~ x, dat = pdat, subset = 71:141, col = "blue")
または対数スケールで:
plot(log(y) ~ log(x), data = dat)
lines(yhat ~ log(x), dat = pdat, subset = 1:70, col = "red")
lines(yhat ~ log(x), dat = pdat, subset = 71:141, col = "blue")
例えば...
この一般的なソリューションは、より複雑な ANCOVA モデルでもうまく機能します。ここで、前と同じように新しい pdat を作成し、インジケーターを追加します
pdat <- with(dat, data.frame(x = seq(from = head(x, 1), to = tail(x,1),
by = 0.1)[1:140],
ind = factor(rep(c(TRUE, FALSE), each = 70))))
pdat <- transform(pdat, yhat = predict(logm3, pdat))
predict()
ANCOVA を fit に使用しているため、への 1 回の呼び出しから必要なすべての予測を取得する方法に注目してくださいlogm3
。以前と同じようにプロットできます。
plot(y ~ x, data = dat)
lines(exp(yhat) ~ x, dat = pdat, subset = 1:70, col = "red")
lines(exp(yhat) ~ x, dat = pdat, subset = 71:141, col = "blue")