我想制作一个没有截距系数的简单线性模型 (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)
最佳答案
对啊,我也掉进这个坑了!很好的问题!!正是因为
和
- 如果模型具有截距(您的
mylm1
),则 y̅ 是平均值(yi) - 这就是您所期望的,这是您基本上想要正确的 R2 的 SStot
- 而在模型没有截距的情况下,y̅ 被视为 0 - 因此 SStot 将非常高,因此 R2 将非常接近 1! SSres 将根据最差的拟合而有所不同(没有截距时会稍高一些),但不会太大。
代码:
attach(mylm1) # in general be careful with attach, here only for code clarity
y_fit <- mylm1$fitted.values
SSE <- sum((y_fit - y)^2)
SST <- sum((y - mean(y))^2)
1-SSE/SST # R^2 with intercept
y_fit2 <- mylm2$fitted.values
SSE2 <- sum((y_fit2 - y)^2) # SSE2 only slightly higher than SSE..
SST2 <- sum((y - 0)^2) # !!! the key difference is here !!!
1-SSE2/SST2 # R^2 without intercept
注意:我不清楚为什么在没有截距的模型中 y̅ 是 0 而不是 Mean(yi),但事实就是这样。我自己通过调查和使用上面的代码进行黑客攻击发现了困难的方法..
关于r - 为什么摘要高估了 "no-intercept"模型公式的 R 平方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20333600/