如何从statsmodels.api中提取回归系数?

45
 result = sm.OLS(gold_lookback, silver_lookback ).fit()

得到结果后,我该如何获得系数和常量?

换句话说,如果 y = ax + c, 如何获取值 ac


访问系数的方法如下:https://dev59.com/014b5IYBdhLWcg3wbA-B - Anton Tarasenko
5个回答

77
您可以使用拟合模型的params属性来获取系数。
例如,以下代码:
import statsmodels.api as sm
import numpy as np
np.random.seed(1)
X = sm.add_constant(np.arange(100))
y = np.dot(X, [1,2]) + np.random.normal(size=100)
result = sm.OLS(y, X).fit()
print(result.params)

将打印一个numpy数组 [0.89516052 2.00334187] - 分别为截距和斜率的估计值。

如果您想要更多信息,可以使用对象result.summary(),其中包含3个详细的模型描述表格。


第一个是常数,第二个是系数? - JOHN
没错!这就是sm.add_constant()的工作原理:它接受一个矩阵(或向量,就像我的情况一样),并在最左边添加一个全为1的列。对应于这一列的系数就是截距。 - David Dale

9
参考这个答案Converting statsmodels summary object to Pandas Dataframe,看起来result.summary()是一组表格,你可以将其导出为html,然后使用Pandas将其转换为数据框(Dataframe),这将允许您直接索引想要的值。因此,在您的情况下(将上面链接中的答案放在一行中):
df = pd.read_html(result.summary().tables[1].as_html(),header=0,index_col=0)[0]

然后

a=df['coef'].values[1]
c=df['coef'].values[0]

太好了!但是这并不适用于更详细的summary2()函数! - B Furtado

2

在@IdiotTom的回答中补充细节。

您可以使用:

head = pd.read_html(res.summary2().as_html())[0]
body = pd.read_html(res.summary2().as_html())[1]

不太好看,但信息都在那里。

0
如果API的输入是pandas对象(即数据的pd.DataFrame,或x和y的pd.Series),那么当您访问.params时,它将是一个pd.Series,因此每个系数都可以通过其名称轻松访问。
例如:
import statsmodels.api as sm 
# sm.__version__ is '0.13.1'


df = pd.DataFrame({'x': [0,  1,2,3,4],
                   'y': [0.1, 0.2, 0.5, 0.5, 0.8]
                  })

sm.OLS.from_formula(formula='y~x-1', data=df).fit().params

输出以下pd.Series

x    0.196667
dtype: float64

允许拦截项(通过将公式从y~x-1更改为y~x)会更改输出,以包括拦截项,名称为Intercept

Intercept    0.08
x            0.17
dtype: float64

0

系数以字典形式保存在result.params数据框中,它是一个pandas的Series。其中,常数项存储为Intercept,正如其他人所指出的那样。变量项按其变量名称存储。因此,如果您的模型是y ~ x,回归系数将作为result.params['Intercept'](即b)和result.params['x'](即a)可用于方程y = a*x + b


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接