为什么R的lm()返回的系数估算值与我的教科书不同?


13

背景

我正在尝试了解拟合模型课程中的第一个示例(因此,这似乎很简单)。我已经手工完成了计算,并且它们与示例匹配,但是当我在R中重复计算时,模型系数不可用。我认为差异可能是由于总体方差使用教科书(),而R可以是使用样本方差(小号2),但我不能看到这些在计算中使用。例如,如果在 某处使用,请注意以下帮助部分:σ2S2lm()var()var()

分母n-1用于给出iid观测的(协)方差的无偏估计。

我已经看过了两者的代码lm()lm.fit()并且都没有使用var(),但是lm.fit()将数据传递给了z <- .Call(C_Cdqrls, x, y, tol, FALSE)我无法访问的已编译C代码()。

谁能解释R为什么给出不同的结果?即使样本方差与总体方差的使用有所不同,为什么系数估计也不同?

数据

设置一条线以根据学校年级预测鞋子的大小。

# model data
mod.dat <- read.table(
    text = 'grade shoe
                1    1
                2    5
                4    9'
    , header = T);

# mean
mod.mu  <- mean(mod.dat$shoe);
# variability 
mod.var <- sum((mod.dat$shoe - mod.mu)^2)

# model coefficients from textbook
mod.m  <- 8/3;
mod.b  <- -1;

# predicted values  ( 1.666667 4.333333 9.666667 )
mod.man.pred       <- mod.dat$grade * mod.m + mod.b;
# residuals         ( -0.6666667  0.6666667 -0.6666667 )
mod.man.resid      <- (mod.dat$shoe - mod.man.pred)
# residual variance ( 1.333333 )
mod.man.unexpl.var <- sum(mod.man.resid^2);
# r^2               ( 0.9583333 )
mod.man.expl.var   <- 1 - mod.man.unexpl.var / mod.var;

# but lm() gives different results:
summary(lm(shoe ~ grade, data = mod.dat))
Call:
lm(formula = shoe ~ grade, data = mod.dat)

Residuals:
      1       2       3 
-0.5714  0.8571 -0.2857 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept)  -1.0000     1.3093  -0.764    0.585
grade         2.5714     0.4949   5.196    0.121

Residual standard error: 1.069 on 1 degrees of freedom
Multiple R-squared:  0.9643,    Adjusted R-squared:  0.9286 
F-statistic:    27 on 1 and 1 DF,  p-value: 0.121

编辑

正如本·博克(Ben Bolker)所展示的那样,看来老师有时会犯错。看来R的计算是正确的。这个故事的寓意:不要仅仅因为老师说的是真的就相信某事。亲自验证!


2
仔细检查mod.m=8/3。因为如果设置mod.m=2.5714,则它们似乎是相同的。
2014年

2
据我所知,注释中的任何地方都没有计算系数mod.m = 8/3和mod.b = -1,所以这并不明显。正如上面的@Stat注释所示,错误似乎出在计算mod.m中。
Juho Kokkala 2014年

2
重要的是要记住,任何人都可能犯错误-您的老师,您,此处的回答者,R程序员-任何人。因此,当试图找出当事情分歧时错误可能出在哪里时,请考虑有多少其他人正在检查每件事。对于lmR 中的函数,实际上有成千上万的人通过将结果与其他事物进行比较来检查结果,并且lm每次代码中的任何更改都将根据已知示例检查其输出。在这里有了答案,至少有几个人可能会检查(您的问题已被查看过29次)。
Glen_b-恢复莫妮卡2014年

1
@Glen_b您的意思实际上就是我来这里询问的原因。我不明白在这样的基本计算中R怎么可能是错误的,但我不知道为什么它们不同。我监听了源代码。但是最后,错误出现在我认为应该看的最后一个地方,主要是因为演算部分处于我所知的范围之内。我从答案中学到了很多东西!
2014年

2
是的,重要的是要弄清楚它们为什么不同。在这里问是否无法解决是很有意义的。我试图提出一个建议,为什么您考虑的最后一个地方可能会成为第一个出现的地方。我自己一次或两次对示例进行最后的“简化”更改而被吸引住了。
Glen_b-恢复莫妮卡2014年

Answers:


25

看来作者在某处犯了数学错误。

如果扩大平方和偏差

S=((b+m)1)2+((b+2m)5)2+((b+4m)9)2
S=b2+2bm+m2+12b2m+b2+4bm+4m2+2510b20m+b2+8bm+16m2+8118b72m

3b2+14bm+21m2+10730b94m

Sbm

dS/db=6b+14m303b+7m15=0
dS/dm=14b+42m947b+21m47=0

解决

b=(157m)/30=7(157m)/3+21m474735=(49/3+21)mm=(4735)/(2149/3)=18/7

R说这确实是2.571429 ...

基于此链接,这似乎来自Coursera课程……?也许某处的数据转录有误?

(yy¯)(xx¯)(xx¯)2

g <- c(1,2,4)
g0 <- g - mean(g)
s <- c(1,5,9)
s0 <- s- mean(s)
sum(g0*s0)/(sum(g0^2))
## [1] 2.571429

{1,11/3,9}{1,5,9}


2
哇。你是对的。它来自Coursera课程,来自视频,而不是转录。因此,我猜他是简化了视频的计算,却没想到有人会重复尝试。它恰好是我看到的第一个视频,所以我尝试跟进。很明显,我需要提高数学水平。我认为虽然发现了错误。您说的无关紧要的常数项可能是通过他的计算得出的正确值。我将再几次浏览您的答案以自学。对此,我真的非常感激!
事后

我认为常数项不会影响计算。它不会影响斜率和截距的估计(当我们采用导数时,它会消失),只会影响残余SSQ /标准偏差的估计。
Ben Bolker 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.