python - 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:
预测区间和置信区间之间的差异,请参阅此网页。
编辑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--')
解决方案
推荐阅读
- android - Android - 在 SharedPreferences 中保存音频
- xtext - 具有 Xtext 路径未映射异常的 Xcore 模型
- c# - asp net mvc 存储应用程序状态的区别
- java - 如何获取特定应用程序的 CPU 值
- reactjs - Should we install react and react-dom in --save or --save-dev mode?
- fortran - 在 Fortran 中存储具有多维索引的变量
- python - Complex Django permissions
- qt - qmake 语法:+= 与 *=(加与星号)
- extjs - ExtJs 远程(列表)过滤器重置
- c# - Closing the StreamReader