首页 > 解决方案 > 为什么 statsmodels.api 产生 1.000 的 R^2?

问题描述

我正在使用 statsmodel 进行简单和多元线性回归,并且从摘要中得到了错误的 R^2 值。系数看起来计算正确,但我得到的 R^2 为 1.000,这对我的数据来说是不可能的。我在 excel 中绘制了它,我应该得到大约 0.93,而不是 1。

我正在使用掩码过滤数据以发送到模型中,我想知道这是否是问题所在,但对我来说数据看起来不错。我对 python 和 statsmodel 相当陌生,所以也许我在这里遗漏了一些东西。

import statsmodels.api as sm

    for i, df in enumerate(fallwy_xy):   # Iterate through list of dataframes
        if len(df.index) > 0:            # Check if frame is empty or not
            mask3 = (df['fnu'] >= low)   # Mask data below 'low' variable
            valid3 = df[mask3]
            if len(valid3) > 0:          #  Check if there is data in range of mask3
                X = valid3[['logfnu', 'logdischarge']]
                y = valid3[['logssc']]
                estm = sm.OLS(y, X).fit()
                X = valid3[['logfnu']]
                y = valid3[['logssc']]
                ests = sm.OLS(y, X).fit()

标签: python-3.xstatsmodels

解决方案


我终于知道发生了什么事。默认情况下,Statsmodels 不会将常数纳入其 OLS 回归方程,您必须使用

X = sm.add_constant(X)

常数如此重要的原因是因为没有它,Statsmodels 以不同的方式计算 R 平方,准确地说是未居中。如果您确实添加了一个常数,则 R 平方的计算方式与大多数人计算 R 平方的方式相同,即居中版本。Excel 在给定常数或不给定常数时不会改变计算 R 平方的方式,这就是为什么当 Statsmodels 报告它是没有常数的 R 平方时,它与 Excel 如此不同。来自 Statsmodels 的 OLS 回归摘要实际上指出了计算方法,如果它使用未居中的不常数,通过显示 R 平方(未居中)进行计算:其中 R 平方显示在汇总表中。下面的链接帮助我解决了这个问题。

为 R 平方和 df 计算添加 hasconstant 指标

相同的模型系数,不同的 R^2 与 statsmodels OLS 和 sci-kit 学习线性回归

警告:罗德犯了一个错误!


推荐阅读