Oli*_* Ma 2 python pandas statsmodels
在Python库中Statsmodels
,您可以打印出回归结果print(results.summary())
,如何在一个表中打印出多个回归的摘要,以便更好地进行比较?
线性回归,代码取自statsmodels
文档:
nsample = 100
x = np.linspace(0, 10, 100)
X = np.column_stack((x, x**2))
beta = np.array([0.1, 10])
e = np.random.normal(size=nsample)
y = np.dot(X, beta) + e
model = sm.OLS(y, X)
results_noconstant = model.fit()
Run Code Online (Sandbox Code Playgroud)
然后我向模型添加一个常量并再次运行回归:
beta = np.array([1, 0.1, 10])
X = sm.add_constant(X)
y = np.dot(X, beta) + e
model = sm.OLS(y, X)
results_withconstant = model.fit()
Run Code Online (Sandbox Code Playgroud)
我想在一张桌子上看到摘要results_noconstant
并results_withconstant
打印出来.这应该是一个非常有用的功能,但我没有在statsmodels
文档中找到任何关于此的说明.
编辑:我想到的回归表将是这样的,我想知道是否有现成的功能来做到这一点.
还有summary_col
,文档中仍然缺少AFAIR.
我还没有真正尝试过,但我从一个问题中找到了一个相关的例子来删除一些"讨厌的"参数.
"""
mailing list, and issue https://github.com/statsmodels/statsmodels/pull/1638
"""
import pandas as pd
import numpy as np
import string
import statsmodels.formula.api as smf
from statsmodels.iolib.summary2 import summary_col
df = pd.DataFrame({'A' : list(string.ascii_uppercase)*10,
'B' : list(string.ascii_lowercase)*10,
'C' : np.random.randn(260),
'D' : np.random.normal(size=260),
'E' : np.random.random_integers(0,10,260)})
m1 = smf.ols('E ~ D',data=df).fit()
m2 = smf.ols('E ~ D + C',data=df).fit()
m3 = smf.ols('E ~ D + C + B',data=df).fit()
m4 = smf.ols('E ~ D + C + B + A',data=df).fit()
print(summary_col([m1,m2,m3,m4]))
Run Code Online (Sandbox Code Playgroud)
仍有改进的余地.
现在有一个著名的stargazer R 包的Python 版本,它正是这样做的。
另请参阅此相关问题:https://economics.stackexchange.com/q/11774/24531
我确信有很多方法可以做到这一点。取决于您可以/想要使用什么来实现这一目标。
起点很可能是相同的:
statsmodels
“线性模型”.fit()
返回RegressionResults
类,该类具有summary2()
返回子类的方法和一些方便的方法。
例如,其中之一.tables
返回pandas.DataFrame
.
以下是您可以如何使用它:
import pandas as pd
results = {'Noconst':results_noconstant.summary2(),
'withcon':results_withconstant.summary2()}
df = pd.DataFrame({'Model':[], 'Param':[], 'Value':[]})
for mod in results.keys():
for col in results[mod].tables[0].columns:
if col % 2 == 0:
df = df.append(pd.DataFrame({'Model': [mod]*results[mod].tables[0][col].size,
'Param':results[mod].tables[0][col].values,
'Value':results[mod].tables[0][col+1].values}))
print df
Run Code Online (Sandbox Code Playgroud)
其产量:
Model Param Value
0 Noconst Model: OLS
1 Noconst Dependent Variable: y
2 Noconst Date: 2016-01-29 00:33
3 Noconst No. Observations: 100
4 Noconst Df Model: 2
5 Noconst Df Residuals: 98
6 Noconst R-squared: 1.000
0 Noconst Adj. R-squared: 1.000
1 Noconst AIC: 296.0102
2 Noconst BIC: 301.2205
3 Noconst Log-Likelihood: -146.01
4 Noconst F-statistic: 9.182e+06
5 Noconst Prob (F-statistic): 4.33e-259
6 Noconst Scale: 1.1079
0 withcon Model: OLS
1 withcon Dependent Variable: y
2 withcon Date: 2016-01-29 00:33
3 withcon No. Observations: 100
4 withcon Df Model: 2
5 withcon Df Residuals: 97
6 withcon R-squared: 1.000
0 withcon Adj. R-squared: 1.000
1 withcon AIC: 297.8065
2 withcon BIC: 305.6220
3 withcon Log-Likelihood: -145.90
4 withcon F-statistic: 4.071e+06
5 withcon Prob (F-statistic): 1.55e-239
6 withcon Scale: 1.1170
Run Code Online (Sandbox Code Playgroud)
您能用它做什么仅受限于您使用 pandas(强大的 Python 数据分析工具包)的能力。
归档时间: |
|
查看次数: |
2579 次 |
最近记录: |