繁体   English   中英

如何计算拟合的 statsmodels OLS 模型的预测区间?

[英]How to calculate a prediction interval for a fitted statsmodels OLS model?

我得到了以下模型:

模型

因此,将X增加一个单位的预期产出变化由下式给出:

边际效应

假设我假设X的值为 40 。

如何计算以0.25 个单位增加X的效果的 95% 置信区间?


下面是一个可复制的例子。

# Generate data
import pandas as pd
from scipy import stats as st
df = pd.DataFrame({'const':1,'X':st.norm(loc=40, scale=5).rvs(1000)})
df['X_sq'] = df['X'].pow(2)
df['y'] = 1200 + df['X'] + df['X_sq'] + st.norm().rvs(1000)
df = df[['y','const','X','X_sq']]

# Declare and fit model
y = df['y']
X = df[['const','X','X_sq']]
m1 = OLS(endog=y, exog=X).fit()

# Assume a value for `Xi`
x = 40

# Predicted marginal effect of increasing `Xi` in ONE UNIT
Mg = m1.params['X'] + (2 * m1.params['X_sq'] * x)

很好,所以y的预期变化,然后将X从 40 增加到 41 等于Mg

如何计算X为 0.25 个单位的边际变化的 95% 置信区间?

作为提示,我认为这可以用m1.t_test()来完成

t_test有效,因为统计量Mg在参数中是线性的。

我们可以使用由字符串或显式约束矩阵定义的限制。

我使用老式的字符串插值,并在模拟之前添加了一个种子以获得可复制的结果。

np.random.seed(987125348)

"X + %f * X_sq" % (2 * x)
'X + 80.000000 * X_sq'

m1.t_test("X + %f * X_sq" % (2 * x))
<class 'statsmodels.stats.contrast.ContrastResults'>
                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
c0            81.0089      0.007   1.24e+04      0.000      80.996      81.022
==============================================================================

Mg
80.99974702127943

使用显式限制矩阵:

m1.t_test([0, 1, 2 * x])
<class 'statsmodels.stats.contrast.ContrastResults'>
                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
c0            81.0089      0.007   1.24e+04      0.000      80.996      81.022
==============================================================================

t 检验该值为 80

m1.t_test("X + %f * X_sq = 80" % (2 * x))
<class 'statsmodels.stats.contrast.ContrastResults'>
                             Test for Constraints                             
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
c0            81.0089      0.007   1.24e+04      0.000      80.996      81.022
==============================================================================

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM