【问题标题】:Different results when computing linear regressions with scipy.stats and statsmodels使用 scipy.stats 和 statsmodels 计算线性回归时的不同结果
【发布时间】:2014-07-23 04:52:27
【问题描述】:

当我尝试将 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

这里发生了什么?我想不通!是不是哪里出错了?

【问题讨论】:

    标签: python statistics scipy statsmodels


    【解决方案1】:

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

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

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

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

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

    例如,请参阅触发 statsmodels 更改以在非常量回归中“正确”处理 R^2 的问题:https://github.com/statsmodels/statsmodels/issues/785

    【讨论】:

    【解决方案2】:

    0.2205 来自一个模型,该模型有一个截距项 - 如果您删除截距,0.5328 值是结果。

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

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

    祝你好运!

    【讨论】:

    • 哦,有道理! (但是等等 - 你确定 0.2205 是具有截距项的模型吗?我在想,因为更高的 r^2 意味着更密切的相关性,那么更大的灵活性意味着更高的相关性,因此更高的 r^2 - 对吗?)跨度>
    • 是的,我在 R 中运行它以再次检查。
    • 你知道我的直觉为什么不对吗?
    • 另外,问题的一部分是你使用了一个疯狂的模型。尝试简化一些事情(例如 x = np.random.randn(100) 然后 y = 4 + 11*xthen 尝试运行回归 - 这样你就会知道要寻找(即截距 = 4,斜率 = 11))
    • James:尝试用通常的方式计算相关性(即 cov(x,y)/(sd(x)sd(y)))——结果(大约0.47)与带有截距的回归中的 R^2 项一致(因为 0.47^2 约为 0.22)。原因是当您处理 OLS 回归(即 with 截距)时, sqrt(R**2) 仅等于相关系数。见here
    猜你喜欢
    • 2018-09-03
    • 2016-11-21
    • 1970-01-01
    • 2021-12-26
    • 2018-04-02
    • 2017-12-31
    • 2016-08-26
    • 2021-12-19
    • 2016-07-07
    相关资源
    最近更新 更多