【问题标题】:How we can compute intercept and slope in statsmodels OLS?我们如何计算 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()

【问题讨论】:

    标签: python scikit-learn linear-regression statsmodels


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-12-05
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多