[英]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.