R-squared 有用吗?
2024-11-11
高文歆
1908

连享会   主页 || 推文 || 知乎 || B 站 || 在线课堂

New! 搜推文,找资料,用 lianxh 命令:
安装: ssc install lianxh, replace
使用: lianxh 合成控制
       lianxh DID + 多期, w


作者:高文歆 (中国科学技术大学)
邮箱wenxin_irl@mail.ustc.edu.cn

编者按:本文主要参考自「Is R-squared Useless?」,特此致谢!

Title:R-squared 有用吗?
Keywords:拟合优度,线性,变异性,误差,因果,控制变量

1. 背景

R2R^2 (R-squared) 是回归分析中的标准统计度量,通常用于评估线性回归模型的拟合优度,可以反映模型解释变异量占总变异量比例。尽管如此,但 R2R^2 真的有用吗?

2. R2R^2 的真实面目

2.1 R2R^2 基本定义

R2R^2 (R-squared) 反映模型解释变异量占总变异量的比例,在统计学中亦称决定系数 (coefficient of determination),是回归分析中用以评估模型拟合优度的统计指标之一。R2R^2 的本质是衡量自变量对因变量变异的解释能力。在最小二乘法估计的线性回归模型中,R2R^2 最初被定义为拟合值方差 sm^2{s_{\hat{m}}^2} 与因变量方差 sY2{s_Y^2} 之比:

R2sm^2sY2R^2 \equiv \frac{s_{\hat{m}}^2}{s_Y^2}

可以认为,R2R^2 反映了模型通过回归线拟合数据点的程度。由于在线性模型中,误差项和拟合值的协方差为 0,则有:

CY,m^=Ce^+m^,m^=sy^2C_{Y, \hat{m}}=C_{\hat{e}+\hat{m}, \hat{m}}=s_{\hat{y}}^2

即因变量与拟合值的协方差 CY,m^C_{Y, \hat{m}} 将会等于拟合值方差 sy^2s_{\hat{y}}^2。由此,我们可以把式子变化为:

R2=cY,m^sY2R^2=\frac{c_{Y, \hat{m}}}{s_Y^2}

在最小二乘法线性模型中,有拟合值方差 sy^2=β12sX2s_{\hat{y}}^2=\beta_1^2s_X^2,则有:

R2=β12sX2sY2R^2=\beta_1^2 \frac{s_X^2}{s_Y^2}

又因斜率 β1\beta_1 等于 XXYY 协方差 CXYC_{X Y} 与自变量方差 sX2{s_X^2} 之比,代入可得:

R2=(CXYsXsY)2R^2=\left(\frac{C_{X Y}}{s_X s_Y}\right)^2

2.2 R2R^2 并非衡量模型优度的万能指标

根据 R2=(CXYsXsY)2R^2=\left(\frac{C_{X Y}}{s_X s_Y}\right)^2,说明 R2R^2 反映了 XXYY 之间线性关系强度。理想情况下,R2=1R^2=1 意味着模型能够完美解释所有变异,拟合效果极佳,而 R2=0R^2=0 则意味着模型没有解释任何因变量的变异性。然而,R2R^2 高并不总意味着模型就是最优的。

举个简单例子,一个用于预测消费者支出的模型中 R2R^2 高,在某种程度上表明模型能够解释大部分的消费者支出的变异性。但如果该模型包括了大量不必要、不相关的预测变量 (例如,宏观经济指标等),则可能会捕捉到特定样本特征,过度拟合特定样本,从而影响 R2R^2

3. R2R^2 的局限性与误区

Is R-squared Useless?」一文给出了 R2R^2 的四个基本结论:

  1. R2R^2 不能衡量模型好坏
  2. R2R^2 不能预测误差
  3. R2R^2 不适用于比较变换后的响应模型
  4. R2R^2 不解释变量间的因果关系

3.1 R2R^2 不能衡量模型好坏

3.1.2 反例1:模型正确,R2R^2 也可能很小

R2R^2 并不能衡量拟合优度,因为在某些时候,即使模型完全正确,其模型 R2R^2 也可能会很低。

实验思路

  1. 生成一个线性数据集
  2. 计算 R2R^2 在已知数据集确实为线性模型生成的情况下,我们将其拟合进线性模型,R2R^2 应该很高才对。
  3. 增加 sigmasigma 发现即使模型正确,随着 sigmasigma 的增多,R2R^2 居然在变小。
. set obs 20
. egen sigmas =  fill(0.5(1)20)
. list sigmas
. gen rout = .
. forval i = 1/20 {
  2.     set obs 100
  3.     gen x = _n/10
  4.     local sig = sigmas[`i']
  5.     gen y = 2 + 1.2 * x + rnormal(100, `sig')
  6.     regress y x
  7.     scalar r_squared = e(r2)
  8.     replace rout = r_squared in `i'
  9.     drop x y
 10. }
. twoway (line rout sigmas) (scatter rout sigmas), title("R-squared vs Sigma" ) ///
>      xtitle("Sigma") ytitle("R-squared") legend(order(1 "R-squared"))

3.1.2 反例2:模型错误,R2R^2 也可能接近于 1

实验思路

  1. 生成一个非线性数据集
  2. 用线性模型拟合,计算 R2R^2 在已知数据集由非线性模型生成的情况下,模型错误,R2R^2 应接近于 0。但是我们发现,发现即使模型错误,R2=0.88R^2=0.88,接近于1.

由此看来,我们并不能单纯地使用 R2R^2 去衡量模型的准确性。

. set seed 1
. set obs 50
. gen x = -log(runiform())/0.005
. gen u = runiform(0.8, 1.2)
. gen y = (x - 1)^2 * u
. scatter y x
. regress y x

      Source |       SS           df       MS      Number of obs   =        50
-------------+----------------------------------   F(1, 48)        =    352.27
       Model |  7.8210e+11         1  7.8210e+11   Prob > F        =    0.0000
    Residual |  1.0657e+11        48  2.2202e+09   R-squared       =    0.8801
-------------+----------------------------------   Adj R-squared   =    0.8776
       Total |  8.8867e+11        49  1.8136e+10   Root MSE        =     47119

------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |   661.5637   35.24815    18.77   0.000     590.6926    732.4349
       _cons |  -64992.85   10426.59    -6.23   0.000    -85956.92   -44028.78
------------------------------------------------------------------------------

3.2 R2R^2 不能测量预测误差

原文认为,只考虑 R2R^2 ,我们可能会倾向于选择 R2R^2 更高的模型,但实际上,两个模型的相同预测效力可能相同。

实验思路

  1. 生成一个线性数据集
  2. 改变 XX 取值范围,对自变量 XX 进行线性缩放,并不会影响均方误差 MSEMSE 和模型的预测效力。
  3. 此时再计算 R2R^2,在模型预测效力并无变化的情况下,R2R^2 本应保持不变,但是在实验结果中,我们发现:XX 取值范围从 (1,10) 缩小至 (1,2) ,均方误差 MSEMSE 为 0.86,但是 R2R^2 却从 0.92 下降至 0.12。
. set obs 100
. gen x = 1 + (10-1)/(100-1)*( _n-1 )
. set seed 1
. gen epsilon = rnormal(0, 0.9)
. gen y = 2 + 1.2*x + epsilon
. regress y x

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 98)        =   1126.51
       Model |  990.802154         1  990.802154   Prob > F        =    0.0000
    Residual |  86.1940222        98  .879530839   R-squared       =    0.9200
-------------+----------------------------------   Adj R-squared   =    0.9192
       Total |  1076.99618        99  10.8787493   Root MSE        =    .93783

------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |   1.199495    .035738    33.56   0.000     1.128574    1.270416
       _cons |   2.059504   .2177861     9.46   0.000     1.627315    2.491694
------------------------------------------------------------------------------

. predict yhat
. gen resid = y - yhat
. summarize resid

    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
       resid |        100    2.38e-08    .9330845  -2.584171   1.996068

. scalar mse = e(rss) / e(N)
. display mse
.86194022

接下来改变 XX 的取值范围:

. clear
. set obs 100
. gen x = 1 + (2-1)/(100-1)*( _n-1 )
. set seed 1
. gen epsilon = rnormal(0, 0.9)
. gen y = 2 + 1.2*x + epsilon
. regress y x

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 98)        =     13.81
       Model |  12.1498912         1  12.1498912   Prob > F        =    0.0003
    Residual |  86.1940261        98  .879530879   R-squared       =    0.1235
-------------+----------------------------------   Adj R-squared   =    0.1146
       Total |  98.3439174        99  .993372903   Root MSE        =    .93783
------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |   1.195456   .3216422     3.72   0.000     .5571678    1.833745
       _cons |   2.063543   .4914938     4.20   0.000     1.088189    3.038896
------------------------------------------------------------------------------

. predict yhat
. gen resid = y - yhat
. summarize resid

    Variable |        Obs        Mean    Std. Dev.       Min        Max
-------------+---------------------------------------------------------
       resid |        100    2.38e-09    .9330845  -2.584171   1.996068

. scalar mse = e(rss) / e(N)
. display mse
.86194026

MSEMSE 保持不变一般意味着模型预测效力相同,但随 XX 取值范围的变化,R2R^2 也在不断变化。

3.3 R2R^2 不适用于比较变换后的响应模型

实验思路

  1. 生成一个数据集;
  2. 对结果进行对数变换;
  3. 比较结果变换前后 模型的 R2R^2
. set obs 100
. gen x = 1 + (2-1)/(100-1)*(_n-1)
. set seed 1
. gen y = exp(-2 - 0.09*x +  rnormal(0, 2.5))
.  regress y x

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 98)        =      0.02
       Model |   .34396913         1   .34396913   Prob > F        =    0.9016
    Residual |  2192.69133        98  22.3744013   R-squared       =    0.0002
-------------+----------------------------------   Adj R-squared   =   -0.0100
       Total |   2193.0353        99  22.1518717   Root MSE        =    4.7302
------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |  -.2011441    1.62227    -0.12   0.902    -3.420487    3.018199
       _cons |   1.903103   2.478953     0.77   0.445    -3.016298    6.822505
------------------------------------------------------------------------------

. rvfplot

此时 R2=0.0002R^2=0.0002,发现残差图中有一些异常值,进行对数变换处理这些异常值。

. gen log_y = log(y)
. regress log_y x

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 98)        =      0.01
       Model |  .089532146         1  .089532146   Prob > F        =    0.9088
    Residual |  665.077356        98  6.78650364   R-squared       =    0.0001
-------------+----------------------------------   Adj R-squared   =   -0.0101
       Total |  665.166888        99  6.71885746   Root MSE        =    2.6051
------------------------------------------------------------------------------
       log_y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |  -.1026212   .8934507    -0.11   0.909    -1.875645    1.670403
       _cons |  -1.823492   1.365261    -1.34   0.185    -4.532808    .8858231
------------------------------------------------------------------------------
. rvfplot, yline(0)

通常对数变换通常会使得 R2R^2 有所增加,但在本例中,Fig4Fig4 的拟合效果看起来比 Fig3Fig3 好,但是 R2R^2 却从下降了。因此,对于不同结果转换的模型而言,R2R^2 不能直接用于模型评估。

3.4 R2R^2 不解释变量间的因果关系

这个实验设计相对比较简单,我们发现,无论是用 XX 解释 YY,还是用 YY 解释 XX,其 R2R^2 都是完全相等的。

. clear
. set obs 100
. gen x = _n/10
. gen y = 2 + 1.2*x + rnormal(0, 2)
. regress y x

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 98)        =    321.47
       Model |  1239.54591         1  1239.54591   Prob > F        =    0.0000
    Residual |  377.869634        98  3.85581259   R-squared       =    0.7664
-------------+----------------------------------   Adj R-squared   =    0.7640
       Total |  1617.41555        99  16.3375308   Root MSE        =    1.9636
------------------------------------------------------------------------------
           y |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           x |   1.219674   .0680253    17.93   0.000      1.08468    1.354668
       _cons |   1.555459   .3956885     3.93   0.000     .7702286     2.34069
------------------------------------------------------------------------------

. di e(r2)
.76637443

. regress x y

      Source |       SS           df       MS      Number of obs   =       100
-------------+----------------------------------   F(1, 98)        =    321.47
       Model |  638.581491         1  638.581491   Prob > F        =    0.0000
    Residual |  194.668509        98  1.98641335   R-squared       =    0.7664
-------------+----------------------------------   Adj R-squared   =    0.7640
       Total |      833.25        99  8.41666667   Root MSE        =    1.4094
------------------------------------------------------------------------------
           x |      Coef.   Std. Err.      t    P>|t|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
           y |   .6283438   .0350448    17.93   0.000     .5587985    .6978892
       _cons |   .2024458    .304895     0.66   0.508    -.4026085    .8075001
------------------------------------------------------------------------------

. di e(r2)
.76637443

. di "Is rsquared_x_y equal to rsquared_y_x? " (rsquared_x_y == rsquared_y_x)
Is rsquared_x_y equal to rsquared_y_x? 1

由此看来,R2R^2 只能说明 XXYY 间存在相关性,但并不能说明它们之间的因果关系。

4. 如何正确理解和使用 R2R^2

R2R^2 是衡量线性回归模型拟合效力的有用指标,其可以一定程度上反映模型在数据集上的拟合程度,但这不一定意味着模型在预测新数据时也会表现良好。

例如,添加更多的自变量可以提高 R2R^2,但过多的自变量可能导致过拟合——为了得到一致假设,使假设变得过度严格。

统计模型的目的是为了理解数据的行为并预测未来趋势。有效的模型应该能够捕捉数据的基本关系。我们肯定 R2R^2 在评价模型效力的作用,但不应该为了得出一个良好的 R2R^2 而塑造模型,这样就是本末倒置了。

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 拟合 控制变量, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

资源共享


尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。
请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。
我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。more……
  • 扫码加入连享会微信群,提问交流更方便