python-3.x - 为什么 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()
解决方案
我终于知道发生了什么事。默认情况下,Statsmodels 不会将常数纳入其 OLS 回归方程,您必须使用
X = sm.add_constant(X)
常数如此重要的原因是因为没有它,Statsmodels 以不同的方式计算 R 平方,准确地说是未居中。如果您确实添加了一个常数,则 R 平方的计算方式与大多数人计算 R 平方的方式相同,即居中版本。Excel 在给定常数或不给定常数时不会改变计算 R 平方的方式,这就是为什么当 Statsmodels 报告它是没有常数的 R 平方时,它与 Excel 如此不同。来自 Statsmodels 的 OLS 回归摘要实际上指出了计算方法,如果它使用未居中的不常数,通过显示 R 平方(未居中)进行计算:其中 R 平方显示在汇总表中。下面的链接帮助我解决了这个问题。
为 R 平方和 df 计算添加 hasconstant 指标
推荐阅读
- java - 在 foreach 循环中的代码完成后关闭 Webdriver?
- mysql - MYSQL 5.7 表 3 字段 DATETIME '0000-00-00 00:00:00' 如何将新结构更改为 DEFAULT NULL
- node.js - 如何使用 socket.io 和 node 构建私人聊天信使
- python - 我们如何在一个 x 轴上绘制两个不同的字典,一个向上,另一个向下绘制,就像从头到尾的格式一样?
- graph - 是否可以在python的机器学习中找到数据集的x和y坐标中的移位值?
- batch-file - FINDSTR - 添加文件的“修改日期”作为每个结果的前缀
- go - 使用相同浮点常量值的不同模式会导致不同的结果
- node.js - 带有 express/db.json 的 json-server 未反映更改
- c# - 在选中的列表框中确定(取消)选中的复选框
- php - 使用字符串从 php 更改引导程序的内容