【问题标题】:Statsmodels: Calculate fitted values and R squaredStatsmodels:计算拟合值和 R 平方
【发布时间】:2014-09-11 04:08:42
【问题描述】:

我正在运行如下回归(dfpandas 数据框):

import statsmodels.api as sm
est = sm.OLS(df['p'], df[['e', 'varA', 'meanM', 'varM', 'covAM']]).fit()
est.summary()

这给了我一个0.942 的 R 平方。所以我想绘制原始的y-values 和拟合值。为此,我对原始值进行了排序:

orig = df['p'].values
fitted = est.fittedvalues.values
args = np.argsort(orig)
import matplotlib.pyplot as plt
plt.plot(orig[args], 'bo')
plt.plot(orig[args]-resid[args], 'ro')
plt.show()

然而,这给了我一个图表,其中的值完全偏离了。没有什么可以暗示0.9 的 R 平方。因此,我尝试自己手动计算:

yBar = df['p'].mean()
SSTot = df['p'].apply(lambda x: (x-yBar)**2).sum()
SSReg = ((est.fittedvalues - yBar)**2).sum()  
1 - SSReg/SSTot
Out[79]: 0.2618159806908984

我做错了吗?或者我的计算与 statsmodels 的结果相差甚远是有原因的吗? SSTotSSReg 的值为 4808435495

【问题讨论】:

    标签: python numpy statsmodels


    【解决方案1】:

    如果您的模型中不包含截距(常数解释变量),statsmodels 会根据 未居中的总平方和计算 R 平方,即。

    tss = (ys ** 2).sum()  # un-centred total sum of squares
    

    相对

    tss = ((ys - ys.mean())**2).sum()  # centred total sum of squares
    

    因此,R 平方会高得多。

    这在数学上是正确的。因为,R 平方应该表明与简化模型相比,完整模型解释了多少变化。如果您将模型定义为:

    ys = beta1 . xs + beta0 + noise
    

    那么简化模型可以是:ys = beta0 + noise,其中beta0 的估计值是样本平均值,因此我们有:noise = ys - ys.mean()。这就是 de-meaning 在具有拦截的模型中的来源。

    但是从这样的模型:

    ys = beta . xs + noise
    

    您只能简化为:ys = noise。由于noise 被假定为零均值,因此您可能不会贬低ys。因此,简化模型中无法解释的变化是未居中的总平方和。

    这在rsquared 项下记录在here。将yBar 设置为零,我希望你会得到相同的数字。

    【讨论】:

    • 在某些情况下,OLS 使用居中模型,我不明白为什么。没说,那是居中的。你能查一下link
    【解决方案2】:

    如果您的模型是:

    a = <yourmodel>.fit()
    

    然后,计算拟合值:

    a.fittedvalues
    

    并计算 R 平方:

    a.rsquared
    

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2021-12-09
      相关资源
      最近更新 更多