r - 为什么摘要高估了 "no-intercept"模型公式的 R 平方

标签 r summary intercept lm

我想制作一个没有截距系数的简单线性模型 (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)

enter image description here

最佳答案

对啊,我也掉进这个坑了!很好的问题!!正是因为

enter image description here

enter image description here

  • 如果模型具有截距(您的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/

相关文章:

C# 格式网格汇总值

r - 在R中的ddply中使用colwise, is.numeric进行分位数计算

r - 拟合具有已知截距的多项式

r - S4方法调度慢吗?

r - 如何在R中组合两个数据框(查看详细信息)?

R:总结多个变量的观察次数的最快方法

android - 有没有办法拦截发送到不同传输的Android SMS?

c# - 在给定 y 截距和斜率的情况下在图表中绘制一条线

r - 使用 R 分析 PDF 表单中的一组复选框

r - 如何获得R中字符串中的前10个单词?