【发布时间】:2013-12-18 11:22:48
【问题描述】:
我想制作一个没有截距系数的简单线性模型 (lm()),因此我将 -1 放入我的模型公式中,如下例所示。问题是summary(myModel) 的 R 平方回报似乎被高估了。 lm()、summary() 和 -1 是 R 中非常经典的函数/功能。因此我有点惊讶,我想知道这是一个错误还是这种行为是否有任何原因。
这是一个例子:
x <- rnorm(1000, 3, 1)
mydf <- data.frame(x=x, y=1+x+rnorm(1000, 0, 1))
plot(y ~ x, mydf, xlim=c(-2, 10), ylim=c(-2, 10))
mylm1 <- lm(y ~ x, mydf)
mylm2 <- lm(y ~ x - 1, mydf)
abline(mylm1, col="blue") ; abline(mylm2, col="red")
abline(h=0, lty=2) ; abline(v=0, lty=2)
r2.1 <- 1 - var(residuals(mylm1))/var(mydf$y)
r2.2 <- 1 - var(residuals(mylm2))/var(mydf$y)
r2 <- c(paste0("Intercept - r2: ", format(summary(mylm1)$r.squared, digits=4)),
paste0("Intercept - manual r2: ", format(r2.1, digits=4)),
paste0("No intercept - r2: ", format(summary(mylm2)$r.squared, digits=4)),
paste0("No intercept - manual r2: ", format(r2.2, digits=4)))
legend('bottomright', legend=r2, col=c(4,4,2,2), lty=1, cex=0.6)
【问题讨论】:
-
这真是一道统计理解题;我将其标记为要迁移到Cross Validated--即 stats.SE(请不要交叉发布,但是)。在此期间,您需要阅读这篇简历:removal of statistically significant intercept term boosts r2 in linear model,尤其是@cardinal 的出色回答。
-
R 在这种情况下所做的事情对许多人来说并不明显,以至于它需要自己的常见问题解答entry。您可能需要检查并确认您使用的是相同的方法进行比较。
-
@Gavin 我很高兴我不是唯一一个发现这种 R 行为很奇怪的人,感谢您的链接!我自己发现了困难的方式,但至少我了解 what 会发生(不幸的是不是 why :-)),请参阅我的答案
-
请注意,不仅 R^2 很奇怪,而且 F-statistic 及其 p 值也很奇怪。
-
感谢大家分享您的经验和知识。特别要感谢 gung、Gavin Simpson、Dirk Eddelbuettel 和 Tomas,感谢您的 cmets 和回答,这节省了我的时间。我已经习惯了在这个网站上找到我的 R 编程问题的答案,以至于我忘记查看交叉验证和 R 常见问题解答网站。无论如何,我现在绝对清楚这个问题。