在R中使用线性回归计算不正确的R平方

时间:2015-07-19 21:48:58

标签: r linear-regression

我在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平方变得如此不同?请评论。

1 个答案:

答案 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,因为它不能将截距项与训练集平均结果值拟合。