Statsmodel 拦截与 Seaborn lmplot 拦截不同

Posted

技术标签:

【中文标题】Statsmodel 拦截与 Seaborn lmplot 拦截不同【英文标题】:Statsmodel intercept is different to Seaborn lmplot intercept 【发布时间】:2018-12-25 22:58:39 【问题描述】:

什么可以解释 statsmodel OLS 回归和 seaborn lmplot 之间截距的差异?

我的 statsmodel 代码:

X = mmm_ma[['Xvalue']]
Y = mmm_ma['Yvalue']
model2 = sm.OLS(Y,sm.add_constant(X), data=mmm_ma)
model_fit = model2.fit()
model_fit.summary()

我的 seaborn lmplot 代码:

sns.lmplot(x='Xvalue', y='Yvalue', data=mmm_ma)

我的 statsmodel 截距是 28.9775,而我的 seaborn lmplot 截距大约是 45.5。

问题

拦截应该相同吗? 为什么可以解释为什么这些不同? (我可以更改一些代码以使其相等) 有没有办法实现类似于 seaborn lmplot 但使用精确回归结果来确保它们对齐的绘图?

编辑

@Massoud 感谢发布。我想我已经意识到问题所在了。我的 x 值范围在 1400 到 2600 之间,y 值范围从 40 到 70。所以使用 seaborn lmplot,它只是绘制回归图,截距基于 X 值的最低范围——截距为 46。

但是对于 statsmodel OLS,它会一直运行直到 X = 0,这就是为什么我得到 28 左右的截距。

所以我想问题是有没有办法使用 seaborn 继续趋势线一直到 x = 0。

我尝试改变轴,但它似乎没有延长线。

axes = lm.axes
axes[0,0].set_xlim(0,)

【问题讨论】:

请阅读How to create a Minimal, Complete, and Verifiable example 并编辑您的问题。 【参考方案1】:

这很奇怪。也许如果您能提供更多细节,我们可以提供更好的帮助。我试图复制该问题,但两种方法的截距相同。

代码:

import matplotlib.pyplot as plt
import statsmodels.regression.linear_model as sm
import seaborn as sns
import pandas as pd
import numpy as np
np.random.seed(0)

mmm_ma = 'Xvalue': range(0, 40), 'Yvalue': np.random.randint(low=0, high=40, size=40)

mmm_ma = pd.DataFrame(mmm_ma)

X = mmm_ma[['Xvalue']]
Y = mmm_ma['Yvalue']
model2 = sm.OLS(Y,sm.add_constant(X), data=mmm_ma)
model_fit = model2.fit()
print(model_fit.summary())


sns.lmplot(x='Xvalue', y='Yvalue', data=mmm_ma)
plt.show()

这是输出:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                 Yvalue   R-squared:                       0.005
Model:                            OLS   Adj. R-squared:                 -0.021
Method:                 Least Squares   F-statistic:                    0.2071
Date:                Wed, 18 Jul 2018   Prob (F-statistic):              0.652
Time:                        00:51:04   Log-Likelihood:                -155.75
No. Observations:                  40   AIC:                             315.5
Df Residuals:                      38   BIC:                             318.9
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         17.2183      3.783      4.551      0.000       9.559      24.877
Xvalue         0.0760      0.167      0.455      0.652      -0.262       0.414
==============================================================================
Omnibus:                        3.327   Durbin-Watson:                   1.618
Prob(Omnibus):                  0.189   Jarque-Bera (JB):                1.738
Skew:                           0.197   Prob(JB):                        0.419
Kurtosis:                       2.058   Cond. No.                         44.5
==============================================================================

下面是 Seaborn 的情节:

【讨论】:

如何回答“我无法重现您的问题”?这应该是一条要求提供更多详细信息的评论和一个关于它缺少 MCVE 的问题的标志。 @Massoud - 谢谢。我在原帖中发布了更新,看起来截距不同,因为 X 轴不是从 0 开始的。在 Seaborn 中是否有一种简单的方法来改变它? @dsnOwhiskey 我不确定你是否可以在 Seaborn 中做到这一点。如果您只是在寻找截距,您总是可以使用趋势线上的两个点并获得该线的方程,从而为您提供线的截距和斜率。 好的很酷-谢谢伙计!我想在这种情况下我不会使用 seaborn! @dsnOwhiskey 我仍然不确定,但我只是在 github 上深入研究了 Seaborn 的源代码,但在那里也找不到任何东西。我在那里打开了一个问题并问他是否可以添加此功能。

以上是关于Statsmodel 拦截与 Seaborn lmplot 拦截不同的主要内容,如果未能解决你的问题,请参考以下文章

Statsmodel 跳过逻辑回归中的值?

pandas时间序列索引和statsmodel中的频率

在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn

使用 statsmodel 中的 arma_order_select_ic 进行 ARMA 模型顺序选择

如何使用for循环或条件在pandas数据框的子集中创建多个回归模型(statsmodel)?

statsmodel OLS 和 scikit-learn 线性回归之间的区别