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

Posted

技术标签:

【中文标题】我们如何计算 statsmodels OLS 中的截距和斜率?【英文标题】:How we can compute intercept and slope in statsmodels OLS? 【发布时间】:2017-12-17 02:19:30 【问题描述】:

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

import statsmodels.formula.api as smf
regr = smf.OLS(y, X, hasconst=True).fit()

【问题讨论】:

【参考方案1】:

在您的示例中,您可以使用regrparams 属性,它将显示系数和截距。他们的关键是您首先需要将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.)

现在实际运行回归并获得系数只需要 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

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

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

【讨论】:

好。看起来 X 和数据是相等的。顺便说一句,term_spread 是否显示斜率? 在这种情况下,Xdata 不相等,但接近。 Xdata 的子集,不包括因变量 usd。在这种多元回归的情况下,有两个斜率,因为您有两个 X 变量,term_spreadcopper【参考方案2】:

对于任何搜索如何在 scikit-learn 中获取 LinearRegression 的斜率和截距的人:它有 coef_ and intercept_ properties 显示这一点。

(x, y) = np.random.randn(10,2).T
from sklearn import linear_model
lr = linear_model.LinearRegression()
lr.fit(x.reshape(len(x), 1), y)
lr.coef_ # array([ 0.29387004])
lr.intercept_ # -0.17378418547919167

【讨论】:

以上是关于我们如何计算 statsmodels OLS 中的截距和斜率?的主要内容,如果未能解决你的问题,请参考以下文章

使用 statsmodels 忽略多个 OLS 回归中的缺失值

statsmodels 中的面板 OLS(因为它在 Pandas 中已被弃用?)

AttributeError:模块“statsmodels.formula.api”没有属性“OLS”

为啥 `sklearn` 和 `statsmodels` 的 OLS 回归实现给出不同的 R^2?

超详细多元线性回归模型statsmodels_ols

超详细多元线性回归模型statsmodels_ols