繁体   English   中英

等效模型的不同 R 平方

[英]Different R-squared for equivalent models

为什么我得到这两个模型的不同 R 平方值,这应该是等效的(在第二个模型中,截距项被 z 水平代替)? 这是一个错误还是我遗漏了什么?

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

来自help("summary.lm") (添加了重点):

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

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

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

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

对于具有截距summary.lm的模型,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM