首页 > 解决方案 > seaborn和statsmodels的不同结果

问题描述

我试图用 95% 的斜率置信区间绘制线性回归,并发现在比较两种方法时结果不同。

import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import summary_table

x = np.linspace(0,10)
y = 3*np.random.randn(50) + x
res = sm.OLS(y, x).fit()

st, data, ss2 = summary_table(res, alpha=0.05)
fittedvalues = data[:,2]
predict_mean_se  = data[:,3]
predict_mean_ci_low, predict_mean_ci_upp = data[:,4:6].T
predict_ci_low, predict_ci_upp = data[:,6:8].T

plt.figure(1)
plt.subplot(211)
plt.plot(x, y, 'o', label="data")
plt.plot(x, fittedvalues, 'r-', label='OLS')
plt.plot(x, predict_ci_low, 'b--')
plt.plot(x, predict_ci_upp, 'b--')
plt.plot(x, predict_mean_ci_low, 'g--')
plt.plot(x, predict_mean_ci_upp, 'g--')
plt.legend()

plt.subplot(212)
sns.regplot(x=x, y=y,label="sns")
plt.legend()
plt.show()

差异

顺便问一下,predict_mean_ci_low 和 predict_ci_low 有什么区别?我在手册中找不到它的解释。statsmodels 的部分是从这个问题中复制的。

编辑:

根据 Josef、Warren Weckesser 和这篇文章的说法,我需要在 OLS 版本中添加一个常量。

默认情况下,statsmodels 中的OLS 不包括线性方程中的常数项(即截距)。(常数项对应于设计矩阵中的一列。)

import numpy as np
from matplotlib import pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import summary_table

x = np.linspace(0,10)
y = 3*np.random.randn(50) + x
X = sm.add_constant(x)
res = sm.OLS(y, X).fit()

st, data, ss2 = summary_table(res, alpha=0.05)
fittedvalues = data[:,2]
predict_mean_se  = data[:,3]
predict_mean_ci_low, predict_mean_ci_upp = data[:,4:6].T
predict_ci_low, predict_ci_upp = data[:,6:8].T

plt.figure(1)

plt.subplot(211)
plt.plot(x, y, 'o', label="data")
plt.plot(X, fittedvalues, 'r-', label='OLS')
plt.plot(X, predict_ci_low, 'b--')
plt.plot(X, predict_ci_upp, 'b--')
plt.plot(X, predict_mean_ci_low, 'g--')
plt.plot(X, predict_mean_ci_upp, 'g--')
plt.legend()

plt.subplot(212)
sns.regplot(x=x, y=y,label="sns")
plt.legend()
plt.show()

然而,现在的情节看起来很奇怪。出现了一些奇怪的线条和额外的传说。 图2

编辑2:

预测区间和置信区间之间的差异,请参阅此网页

编辑3:

exog 包含我想包含在模型中的所有变量,包括一个常量(一列)。因此,我们需要使用不带一列的 X[:,1] 进行绘图。

ax.plot(X[:,1], fittedvalues, 'r-', label='OLS')
ax.plot(X[:,1], predict_ci_low, 'b--')
ax.plot(X[:,1], predict_ci_upp, 'b--')
ax.plot(X[:,1], predict_mean_ci_low, 'g--')
ax.plot(X[:,1], predict_mean_ci_upp, 'g--')

排除

标签: pythonscipystatisticsstatsmodels

解决方案


推荐阅读