背景
我正在尝试了解拟合模型课程中的第一个示例(因此,这似乎很简单)。我已经手工完成了计算,并且它们与示例匹配,但是当我在R中重复计算时,模型系数不可用。我认为差异可能是由于总体方差使用教科书(),而R可以是使用样本方差(小号2),但我不能看到这些在计算中使用。例如,如果在
某处使用,请注意以下帮助部分:lm()
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的计算是正确的。这个故事的寓意:不要仅仅因为老师说的是真的就相信某事。亲自验证!
据我所知,注释中的任何地方都没有计算系数mod.m = 8/3和mod.b = -1,所以这并不明显。正如上面的@Stat注释所示,错误似乎出在计算mod.m中。
—
Juho Kokkala 2014年
重要的是要记住,任何人都可能犯错误-您的老师,您,此处的回答者,R程序员-任何人。因此,当试图找出当事情分歧时错误可能出在哪里时,请考虑有多少其他人正在检查每件事。对于
—
Glen_b-恢复莫妮卡2014年
lm
R 中的函数,实际上有成千上万的人通过将结果与其他事物进行比较来检查结果,并且lm
每次代码中的任何更改都将根据已知示例检查其输出。在这里有了答案,至少有几个人可能会检查(您的问题已被查看过29次)。
@Glen_b您的意思实际上就是我来这里询问的原因。我不明白在这样的基本计算中R怎么可能是错误的,但我不知道为什么它们不同。我监听了源代码。但是最后,错误出现在我认为应该看的最后一个地方,主要是因为演算部分处于我所知的范围之内。我从答案中学到了很多东西!
—
2014年
是的,重要的是要弄清楚它们为什么不同。在这里问是否无法解决是很有意义的。我试图提出一个建议,为什么您考虑的最后一个地方可能会成为第一个出现的地方。我自己一次或两次对示例进行最后的“简化”更改而被吸引住了。
—
Glen_b-恢复莫妮卡2014年
mod.m=8/3
。因为如果设置mod.m=2.5714
,则它们似乎是相同的。