我在R中进行了一个非常简单的线性回归,但计算出的R ^ 2似乎并不合适。我所做的回归如下:
data(cats)
fit = lm(Hwts ~ Bwts+0, data = cats)
summary(fit)
我从这次回归得到的结果如下:
Call:
lm(formula = cats$Hwt ~ cats$Bwt + 0)
Residuals:
Min 1Q Median 3Q Max
-3.4563 -0.9980 -0.1003 1.0044 5.2623
Coefficients:
Estimate Std. Error t value Pr(>|t|)
cats$Bwt 3.90711 0.04364 89.53 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.449 on 143 degrees of freedom
Multiple R-squared: 0.9825, Adjusted R-squared: 0.9823
F-statistic: 8015 on 1 and 143 DF, p-value: < 2.2e-16
计算的R-sqaured高达0.9825,但是对数据的简单绘图会让你直觉得出R平方不能那么高。如果我使用维基百科给出的等式计算R平方,我得到以下结果:
1-sum(residuals(fit1)^2)/sum((cats$Hwt - mean(cats$Hwt))^2)
[1] 0.6459604
这个0.6459定义的R平方看起来更合理,我发现如果我允许在回归中拦截,我会得到一个围绕这个数字的R平方:
fit = lm(Hwt ~ Bwt, data = cats)
summary(fit)
Call:
lm(formula = Hwt ~ Bwt, data = cats)
Residuals:
Min 1Q Median 3Q Max
-3.5694 -0.9634 -0.0921 1.0426 5.1238
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.3567 0.6923 -0.515 0.607
Bwt 4.0341 0.2503 16.119 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.452 on 142 degrees of freedom
Multiple R-squared: 0.6466, Adjusted R-squared: 0.6441
F-statistic: 259.8 on 1 and 142 DF, p-value: < 2.2e-16
当我允许或禁止拦截时,为什么R平方变得如此不同?请评论。
答案 0 :(得分:5)
原因是当您拟合没有截距项的模型时,R ^ 2计算对所有观测值使用0的基线预测。因此,相关的R ^ 2计算是:
library(boot)
fit <- lm(Hwt ~ Bwt+0, data = cats)
summary(fit)$r.squared
# [1] 0.9824721
1-sum(residuals(fit)^2)/sum(cats$Hwt^2)
# [1] 0.9824721
基本上将lm
返回的R ^ 2与无法访问任何变量的基线模型进行比较(在本例中为Bwt)。如果您在没有截距的情况下拟合模型,则基线模型必须为所有观测值预测0,因为它不能将截距项与训练集平均结果值拟合。