如何使用statsmodel将intercept设置为0-用于多元线性回归

时间:2019-01-18 15:43:34

标签: python pandas statsmodels

几年前有一篇关于此的文章,但仅包含快速修复。 Specifying a Constant in Statsmodels Linear Regression?

快速解决方案是先运行并减去拦截方程,然后再运行。如果您一遍又一遍地奔跑,那会很乏味。

我认为您可以传递一个参数,告诉它将截距设置为零。还开放使用statsmodels之外的其他stats软件包。

1 个答案:

答案 0 :(得分:1)

这取决于您使用的api。如果您使用的是statsmodels.api,则需要通过向exog添加1 s列来将常量显式添加到模型中。如果不这样做,就不会有拦截。

import pandas as pd
import statsmodels.formula.api as smf
import statsmodels.api as sm

df = pd.DataFrame({'x': range(0,10)}).assign(y=lambda x: x+8)

# Fit y = B*x, no intercept
res1 = sm.OLS(endog=df.y, exog=df.x).fit()
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x              2.2632      0.269      8.421      0.000       1.655       2.871
==============================================================================


# fit y = B*x + C, by adding a column of ones
res2 = sm.OLS(endog=df.y, exog=df[['x']].assign(intercept=1)).fit()
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x              1.0000   8.64e-16   1.16e+15      0.000       1.000       1.000
intercept      8.0000   4.61e-15   1.73e+15      0.000       8.000       8.000
==============================================================================

如果相反,您使用的是smf API,则可以将-1添加到Patsy公式中,这将告诉它删除常量:

res3 = smf.ols('y ~ x -1', data=df).fit()
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x              2.2632      0.269      8.421      0.000       1.655       2.871
==============================================================================