绘制熊猫时间序列数据框的线性回归线的置信区间

Posted

技术标签:

【中文标题】绘制熊猫时间序列数据框的线性回归线的置信区间【英文标题】:plotting confidence interval for linear regression line of a pandas time-series Dataframe 【发布时间】:2021-08-16 15:09:56 【问题描述】:

我有一个示例时间序列数据框:

df = pd.DataFrame('year':'1990','1991','1992','1993','1994','1995','1996',
                          '1997','1998','1999','2000'],
                   'count':[96,184,148,154,160,149,124,274,322,301,300])

我想要在regression line 中带有confidence interval 乐队的linear regression 行。虽然我设法绘制了一条线性回归线。我发现很难在图中绘制置信区间带。这是我的线性回归图代码的 sn-p:

from matplotlib import ticker
from sklearn.linear_model import LinearRegression



X = df.date_ordinal.values.reshape(-1,1)
y = df['count'].values.reshape(-1, 1)

reg = LinearRegression()

reg.fit(X, y)

predictions = reg.predict(X.reshape(-1, 1))

fig, ax = plt.subplots()

plt.scatter(X, y, color ='blue',alpha=0.5)

plt.plot(X, predictions,alpha=0.5, color = 'black',label = r'$N$'+ '= :.2ft + :.2e\n'.format(reg.coef_[0][0],reg.intercept_[0]))


plt.ylabel('count($N$)');
plt.xlabel(r'Year(t)');
plt.legend()


formatter = ticker.ScalarFormatter(useMathText=True)
formatter.set_scientific(True) 
formatter.set_powerlimits((-1,1)) 
ax.yaxis.set_major_formatter(formatter)


plt.xticks(ticks = df.date_ordinal[::5], labels = df.index.year[::5])

           


plt.grid()  

plt.show()
plt.clf()

这给了我一个很好的时间序列线性回归图。

问题和期望的输出 但是,regression line 也需要confidence interval,如:.

非常感谢您对此问题的帮助。

【问题讨论】:

这有帮助吗:***.com/questions/27116479/…? 这会有所帮助:***.com/questions/27164114/… 【参考方案1】:

您遇到的问题是您使用的包和函数from sklearn.linear_model import LinearRegression 没有提供简单获取置信区间的方法。

如果您想绝对使用sklearn.linear_model.LinearRegression,则必须深入研究计算置信区间的方法。一种流行的方法是使用引导,就像使用 this previous answer 一样。

但是,我解释您的问题的方式是,您正在寻找一种在绘图命令中快速执行此操作的方法,类似于您附加的屏幕截图。如果您的目标是纯粹的可视化,那么您可以简单地使用 seaborn 包,这也是您的示例图像的来源。

import seaborn as sns

sns.lmplot(x='year', y='count', data=df, fit_reg=True, ci=95, n_boot=1000)

我已经用它们的默认值fit_regcin_boot 突出显示了三个感兴趣的不言自明的参数。完整说明请参阅the documentation。

在后台,seaborn 使用 statsmodels 包。因此,如果您想要介于纯可视化和自己从头开始编写置信区间函数之间的东西,我会建议您使用statsmodels。具体看the documentation for calculating a confidence interval of an ordinary least squares (OLS) linear regression。

以下代码应该为您在示例中使用 statsmodels 提供了一个起点:

import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt

df = pd.DataFrame('year':['1990','1991','1992','1993','1994','1995','1996','1997','1998','1999','2000'],
                   'count':[96,184,148,154,160,149,124,274,322,301,300])
df['year'] = df['year'].astype(float)
X = sm.add_constant(df['year'].values)
ols_model = sm.OLS(df['count'].values, X)
est = ols_model.fit()
out = est.conf_int(alpha=0.05, cols=None)

fig, ax = plt.subplots()
df.plot(x='year',y='count',linestyle='None',marker='s', ax=ax)
y_pred = est.predict(X)
x_pred = df.year.values
ax.plot(x_pred,y_pred)

pred = est.get_prediction(X).summary_frame()
ax.plot(x_pred,pred['mean_ci_lower'],linestyle='--',color='blue')
ax.plot(x_pred,pred['mean_ci_upper'],linestyle='--',color='blue')

# Alternative way to plot
def line(x,b=0,m=1):
    return m*x+b

ax.plot(x_pred,line(x_pred,est.params[0],est.params[1]),color='blue')

Which produces your desired output

虽然所有内容的值都可以通过标准 statsmodels 函数访问。

【讨论】:

亲爱的埃米尔,我不能再感谢你了。这就是我长期以来一直在寻找的东西。我非常感谢您的慷慨帮助。

以上是关于绘制熊猫时间序列数据框的线性回归线的置信区间的主要内容,如果未能解决你的问题,请参考以下文章

Python 绘制线性回归散点图和置信区间线

Python 绘制线性回归散点图和置信区间线

Python 绘制线性回归散点图和置信区间线2

Python 绘制线性回归散点图和置信区间线2

Python 绘制线性回归散点图和置信区间线2

如何计算 R 中线性回归模型中斜率的 95% 置信区间