我们如何在 statsmodels OLS 中计算截距和斜率?

YNr*_*YNr 2 python linear-regression scikit-learn statsmodels

在这里我问了如何在线性模型中计算 AIC。如果我用LinearRegression()方法替换方法linear_model.OLS以获得 AIC,那么如何计算 OLS 线性模型的斜率和截距?

import statsmodels.formula.api as smf
regr = smf.OLS(y, X, hasconst=True).fit()
Run Code Online (Sandbox Code Playgroud)

Bra*_*mon 5

在您的示例中,您可以使用 的params属性regr,该属性将显示系数和截距。它们的关键是您首先需要将1.0s的列向量添加到您的 X 数据中。为什么?截距项在技术上只是列向量 1s的系数。也就是说,截距只是一个系数,当乘以 1.0 的 X“项”时,会产生自身。当您将其添加到其他系数和特征的总和中时,以获得您的 nx1 预测值数组。

下面是一个例子。

# Pull some data to use in the regression
from pandas_datareader.data import DataReader
import statsmodels.api as sm

syms = {'TWEXBMTH' : 'usd', 
        'T10Y2YM' : 'term_spread', 
        'PCOPPUSDM' : 'copper'
       }

data = (DataReader(syms.keys(), 'fred', start='2000-01-01')
        .pct_change()
        .dropna())
data = data.rename(columns = syms)
# Here's where we assign a column of 1.0s to the X data
# This is required by statsmodels
# You can check that the resulting coefficients are correct by exporting
# to Excel with data.to_clipboard() and running Data Analysis > Regression there
data = data.assign(intercept = 1.)
Run Code Online (Sandbox Code Playgroud)

现在实际运行回归并获取系数只需要 1 行,除了你现在拥有的。

y = data.usd    
X = data.loc[:, 'term_spread':]
regr = sm.OLS(y, X, hasconst=True).fit()
print(regr.params)
term_spread   -0.00065
copper        -0.09483
intercept      0.00105
dtype: float64
Run Code Online (Sandbox Code Playgroud)

因此,关于您关于AIC的问题,您需要确保 X 数据在那里也有一个常量,然后再调用.fit.

注意:当您调用 时.fit,您将创建一个回归结果包装器,并且可以访问此处的任何属性列表。