我想復制 Rregression equation對以下資料的估計的計算:
set.seed(1)
Vec = rnorm(1000, 100, 3)
DF = data.frame(X1 = Vec[-1], X2 = Vec[-length(Vec)])
下面R報告系數的估計
coef(lm(X1~X2, DF)) ### slope = -0.03871511
然后我手動估計斜率的回歸估計
(sum(DF[,1]*DF[,2])*nrow(DF) - sum(DF[,1])*sum(DF[,2])) / (nrow(DF) * sum(DF[,1]^2) - (sum(DF[,1])^2)) ### -0.03871178
它們很接近,但仍然不完全匹配。
你能幫我理解我在這里遺漏了什么嗎?
任何指標都會非常有幫助。
uj5u.com熱心網友回復:
問題是 X1 和 X2 相對于長公式在 lm 中切換。
背景
lm(y ~ x) 中的斜率公式如下,其中 x 和 y 的長度分別為 n,x 是 x[i] 的縮寫,y 是 y[i] 的縮寫,并且總和超過 i = 1, 2 , ..., n.

問題的根源
因此,問題中的長公式也顯示在下面的 (1) 中,對應于 lm(X2 ~ X1, DF) 而不是 lm(X1 ~ X2, DF)。更改 lm 模型中的公式,如下面的 (1) 所示,或者通過將分母中每次出現的 DF[, 1] 替換為 DF[, 2] 來更改答案中的長公式,如下面的 (2) 所示。
# (1)
coef(lm(X2 ~ X1, DF))[[2]]
## [1] -0.03871178
(sum(DF[,1]*DF[,2])*nrow(DF) - sum(DF[,1])*sum(DF[,2])) /
(nrow(DF) * sum(DF[,1]^2) - (sum(DF[,1])^2)) # as in question
## [1] -0.03871178
# (2)
coef(lm(X1 ~ X2, DF))[[2]] # as in question
## [1] -0.03871511
(sum(DF[,1]*DF[,2])*nrow(DF) - sum(DF[,1])*sum(DF[,2])) /
(nrow(DF) * sum(DF[,2]^2) - (sum(DF[,2])^2))
## [1] -0.03871511
uj5u.com熱心網友回復:
這本身不是 StackOverflow 問題,而是姊妹網站的統計問題。
狹義的答案是您可以查看 R 源;它通常用于 LAPACK 和 BLAS,但回歸計算的一個關鍵部分是專門用于處理(以統計方式,而不是數值方式)低秩案例。
無論如何,在這里,我相信您“只是”沒有正確調整自由度,當您使用 1000 次觀察時,“幾乎但不完全”會消失。下面是一個更簡單的情況,以及一種“手動”計算系數的“更簡單”方法,該方法也具有匹配的優點:
> set.seed(1)
> Vec <- rnorm(5,100,3)
> DF <- data.frame(X1=Vec[-1], X2=Vec[-length(Vec)])
> coef(lm(X1 ~ X2, DF))[2]
X2
-0.322898
> cov(DF$X1, DF$X2) / var(DF$X2)
[1] -0.322898
>
uj5u.com熱心網友回復:
coef(lm(X1~X2, DF))
# (Intercept) X2
# 103.83714016 -0.03871511
您可以應用OLS 矩陣形式的系數公式,如下所示。
X = cbind(1,DF[,2])
solve(t(X) %*% (X)) %*% t(X)%*% as.matrix(DF[,1])
給予,
# [,1]
#[1,] 103.83714016
#[2,] -0.03871511
這與lm()輸出相同。
資料:
set.seed(1)
Vec = rnorm(1000, 100, 3)
DF = data.frame(X1 = Vec[-1], X2 = Vec[-length(Vec)])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/342987.html
