使用scipy.stats和statsmodels计算线性回归时的结果不同

时间:2014-06-03 00:12:29

标签: python statistics scipy statsmodels

当我尝试OLS适合这两个库时,我得到了不同的r ^ 2值(确定系数),我无法弄清楚原因。 (为方便起见,删除了一些间距)

In [1]: import pandas as pd       
In [2]: import numpy as np
In [3]: import statsmodels.api as sm
In [4]: import scipy.stats
In [5]: np.random.seed(100)
In [6]: x = np.linspace(0, 10, 100) + 5*np.random.randn(100)
In [7]: y = np.arange(100)

In [8]: slope, intercept, r, p, std_err = scipy.stats.linregress(x, y)

In [9]: r**2
Out[9]: 0.22045988449873671

In [10]: model = sm.OLS(y, x)
In [11]: est = model.fit()

In [12]: est.rsquared
Out[12]: 0.5327910685035413

这里发生了什么?我无法弄清楚!某处有错误吗?

2 个答案:

答案 0 :(得分:3)

这不是对已回答的原始问题的答案。

关于没有常数的回归中的R平方。

一个问题是没有截距的回归没有R ^ 2的标准定义。

基本上,在具有截距的模型中,R平方作为拟合度量的度量,将完整模型与仅具有截距的模型进行比较。如果完整模型没有截距,那么R ^ 2的标准定义会产生奇怪的结果,如负R ^ 2.

回归中的常规定义没有常数除以因变量的平方和而不是贬值。具有常数和不带的回归之间的R ^ 2无法以有意义的方式进行真正的比较。

例如,查看触发statsmodel更改以正确处理R ^ 2""的问题。在无常数回归中:https://github.com/statsmodels/statsmodels/issues/785

答案 1 :(得分:1)

0.2205来自一个有一个截距项的模型 - 如果删除截距,则为0.5328值。

基本上,一个包正在建模 y = bx 而另一个包(有帮助)假设你就像一个拦截术语(即 y = a + BX )。 [注意:这个假设的优点是,否则你每次想要运行回归时都必须使用 x 并将一列一列绑定到它(否则你最终会得到一个有偏见的模型)]

查看this post以进行更长时间的讨论。

祝你好运!