等效模型的不同R平方

  • 本文关键字:平方 模型 r lm
  • 更新时间 :
  • 英文 :


为什么这两个模型的R平方值不同,它们应该是等价的(在第二个模型中,截距项被z级取代)?这是个bug还是我遗漏了什么?

set.seed(42)
N=100
# intercepts
iA = 3
iB = 3.5
# slopes
sA = 1.5
sB = 0.5
# xs
xA = runif(0,1, n=N)
xB = runif(0,1, n=N)
# ys
yA = sA*xA + iA + rnorm(n=N)/10
yB = sB*xB + iB + rnorm(n=N)/10
data = data.frame(x=c(xA, xB), y=c(yA, yB), z=c(rep("A", times=N), rep("B", times=N)))
lm1 = lm(data=data, formula = y ~ x + z)
lm2 = lm(data=data, formula = y ~ x + z -1)
coef(lm1)
coef(lm2)
summary(lm1)$r.squared
summary(lm2)$r.squared

输出:

> coef(lm1)
(Intercept)           x          zB 
3.23590275  1.03353472 -0.01435266 
> coef(lm2)
x       zA       zB 
1.033535 3.235903 3.221550 
> 
> summary(lm1)$r.squared
[1] 0.7552991
> summary(lm2)$r.squared
[1] 0.9979477

对于具有截距的模型,summary.lm基于将模型与仅截距模型进行比较来计算R^2。对于一个没有截距的模型,这是没有意义的,所以它将其与零模型进行比较。当然,在您的示例中,截距实际上是模型矩阵中列的线性组合,即all(model.matrix(lm2) %*% c(0, 1, 1) == 1)为TRUE,因此可以编写软件来检查截距是否是完整模型的子模型,但实际上,它只是查看模型公式是否指定了截距。

就具有截距的模型的计算而言,summary.lm使用的等效值

1 - sum(resid(lm1)^2) / sum((data$y - mean(data$y))^2)
## [1] 0.7552991
1 - sum(resid(lm2)^2) / sum((data$y - mean(data$y))^2)
## [1] 0.7552991

但是对于没有截距的模型,summary.lm降低了平均项

1 - sum(resid(lm2)^2) / sum(data$y^2)
## [1] 0.9979477

你可以将这些与进行比较

summary(lm1)$r.squared
## [1] 0.7552991
summary(lm2)$r.squared
## [1] 0.9979477

参见?summary.lm中提到的内容。

来自help("summary.lm")(增加强调):

R²,"模型解释的方差分数",

R^2=1-\ frac{\sum_i{R_i^2}}{\ssum_i(y_i-y^*)^2},

其中y^*是y_i的平均值如果有截距,则为零,否则

如果删除截距,R²的定义会有所不同(从统计学家的角度来看,这是明智的)。

最新更新