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 拦截不同的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 中使用简单线性回归包的不同结果:statsmodel.api vs sklearn
使用 statsmodel 中的 arma_order_select_ic 进行 ARMA 模型顺序选择