我们如何计算 statsmodels OLS 中的截距和斜率?
How we can compute intercept and slope in statsmodels OLS?
我问的是如何在线性模型中计算 AIC。如果我将 LinearRegression()
方法替换为 linear_model.OLS
方法以获得 AIC,那么如何计算 OLS 线性模型的斜率和截距?
import statsmodels.formula.api as smf
regr = smf.OLS(y, X, hasconst=True).fit()
在您的示例中,您可以使用 regr
的 params
属性,这将显示系数和截距。它们的关键是您首先需要将 1.0
s 的列向量添加到您的 X 数据中。为什么?截距项在技术上只是 1s 的列向量的 系数。也就是说,截距只是一个系数,当乘以 1.0 的 X "term" 时,它会自行产生。当您将其添加到其他系数和特征的总和时,以获得您的 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
所以关于你在 上的问题,在你调用 .fit
.
之前,你需要确保 X 数据在那里也有一个常量
注意:当您调用 .fit
时,您创建了一个回归结果包装器并且可以访问任何属性列表 here。
对于任何搜索如何在 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
LinearRegression()
方法替换为 linear_model.OLS
方法以获得 AIC,那么如何计算 OLS 线性模型的斜率和截距?
import statsmodels.formula.api as smf
regr = smf.OLS(y, X, hasconst=True).fit()
在您的示例中,您可以使用 regr
的 params
属性,这将显示系数和截距。它们的关键是您首先需要将 1.0
s 的列向量添加到您的 X 数据中。为什么?截距项在技术上只是 1s 的列向量的 系数。也就是说,截距只是一个系数,当乘以 1.0 的 X "term" 时,它会自行产生。当您将其添加到其他系数和特征的总和时,以获得您的 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
所以关于你在 .fit
.
注意:当您调用 .fit
时,您创建了一个回归结果包装器并且可以访问任何属性列表 here。
对于任何搜索如何在 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