lm()関数の備忘録です。
出力されている内容は概ね理解していたのですが、具体的にどうやって出すんだっけ?と思って調べたのでまとめておきます。
以下は、定番の赤本を参考にしました。
手計算しやすいように例もとってもシンプル!
x <- c(1,2,3,4)
y <- c(3,5,5,6)
plot(x,y)
m <- lm(y ~ x)
summary(m)
Call:
lm(formula = y ~ x)
Residuals:
1 2 3 4
-0.4 0.7 -0.2 -0.1
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.5000 0.7246 3.450 0.0747 .
x 0.9000 0.2646 3.402 0.0766 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.5916 on 2 degrees of freedom
Multiple R-squared: 0.8526, Adjusted R-squared: 0.7789
F-statistic: 11.57 on 1 and 2 DF, p-value: 0.07662
とりあえず上から。
Residuals (残差)
Residuals:
1 2 3 4
-0.4 0.7 -0.2 -0.1
残差です。実際の値とモデルからの予測値との差
nの値が大きい(7以上の)時は、4分位数で表される。
y_pre <- predict(object = m, newdata = as.data.frame(x)) #予測値
Residuals <- y - y_pre
Residuals
[1] -0.4 0.7 -0.2 -0.1
Estimate
Coefficients:
Estimate
(Intercept) 2.5000
x 0.9000
---
最小自乗法での推定回帰係数の値。
ようは、の(上記出力ではx)と(同(Intercept))の値。数式で書くと以下になります。
Rで出力すると、以下になります。
> alpha <- (mean(y) * sum(x) - sum(x*y))/(mean(x)*sum(x) - sum(x^2));alpha
[1] 0.9
> Intercept <- mean(y) - alpha*mean(x);Intercept
[1] 2.5
Residual standard error
Residual standard error: 0.5916 on 2 degrees of freedom
諸事情により、少し飛ばして2乗誤差。
モデルから求めた予測値と実際の値との差の二乗の合計です。
この値は何かというと、の標準偏差を、標本から推定したものになります(母分布の標準偏差は未知のため)。ようは不偏標準偏差です。
> se <- sqrt(sum((y_pre - y)^2)/(length(x) - 2));se
[1] 0.591608
"2 degrees of freedom"の2は自由度です。
今回は、要素数が4つに対して2つの制約があるので、自由度は以下になります。
> free_val <- length(x) - 2;free_val
[1] 2
Std. Error
Coefficients:
Estimate Std. Error
(Intercept) 2.5000 0.7246
x 0.9000 0.2646
少し戻って、Interceptおよびalpha(xの係数)の標準誤差。検定に用いる(Interceptの方はあまり使わない)。
ようは、検定でよくやる標準化を実施したものです。数式を一応出しておきます。
(s.e.は、すでに導出したResidual standard errorのことです)
ここら辺のより詳しい解説は赤本の13章にしっかり書かれていますので、そちらを参照してください。
> se.Intercept <- se *sqrt(sum((x)^2) / (length(x) * sum((x-mean(x))^2))); se.Intercept
[1] 0.7245688
> se.x <- se / sqrt(sum((x-mean(x))^2)); se.x
[1] 0.2645751
t value
Coefficients:
Estimate Std. Error t value
(Intercept) 2.5000 0.7246 3.450
x 0.9000 0.2646 3.402
Interceptとxのt値です。
こちらも数式を書いておきます。は推定値で、ようは先ほど計算した0.9(Interceptの場合は2.5)が入ります。
は帰無仮説での値である。この場合帰無仮説は「yをxで説明できない」となるため、0が入ります。
先ほど「Interceptの方はあまり使わない」と述べたのは、こっちのに関する検定が主に行われるためです。
(ただし、lmでは両方の結果が出るので、両方計算しておきましょう。)
> tval.Intercept <- (Intercept - 0) / se.Intercept; tval.Intercept
[1] 3.450328
> tval.x <- (alpha - 0) / se.x; tval.x
[1] 3.40168
Pr(>|t|)
このくくりの最後のp値です。
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.5000 0.7246 3.450 0.0747 .
x 0.9000 0.2646 3.402 0.0766 .
ここまででp値まで求めているので簡単ですね。
当然ですが両側検定(先ほど述べたように、0かどうかを検定しているため)です。
ptのデフォルトは片側検定のため、2倍して両側検定とします。
また、lower.tail = FALSEをつけないと、5%の値でなく95%ラインの値が出るので注意してください。
> pr.Intercept <- pt(tval.Intercept, df = 2, lower.tail = FALSE)*2; pr.Intercept
[1] 0.07470849
> pr.x <- pt(tval.x, df = 2, lower.tail = FALSE)*2; pr.x
[1] 0.07661948
Multiple R-squared<
決定係数と呼ばれるものです。
Multiple R-squared: 0.8526
目的変数の予測値が、どれぐらい対象となる変数(y)を説明しているかです。
例えば、テストの結果が前日の勉強時間と前回の点数のみで決まる場合(普通はありえまえんが)、前日の勉強時間のみでテストの結果を予測しようとすると、50%になります。(前日の勉強時間と前回の点数の重みが50:50の時)
こちらも数式を書いておきます。
数式を元に別の説明をすると、変動の総和はで、xで説明できる変動はであり、説明できない変動はです。
今回は、85%を説明できていることから、大部分を説明できていることになります。
> Rsq <- 1 - sum((y_pre -y)^2)/sum((y-mean(y))^2); Rsq
[1] 0.8526316
なお、今回のように単回帰分析の場合は、相関係数からも求められます。
> cor(x,y)^2
[1] 0.8526316
F-statistic
最後に、F値になります。
F-statistic: 11.57 on 1 and 2 DF
これは、帰無仮説が「全ての因子は目的量(y)に対して効果がない」であり、対立仮説は「少なくても一つの因子は目的量(y)に対して効果がある」となります。
なお、これは通常単回帰分析では用いられません。なぜかというと、因子が一つであり、その因子に対する優位性のt検定を実施しているからです。
そのため、xのp値とF検定のp値が同じ値となっています。
ここで、は回帰残差の平方和であり以下である。
> S_0 <- sum((y-mean(y))^2)
> S_1 <- sum((y_pre -y)^2)
> p <-1 #因子の数 単回帰分析の場合は1
> n <- length(y) #要素数
> k <- 2 #自由度
> F_val <- ((S_0 - S_1)/p) / (S_1 / (n-k)); F_val
[1] 11.57143
終わりに
備忘録なのにとても長くなりました。
全てを参照する方はいないと思いますが、何かのお役に立てれば幸いです。
疲れた。。