任何 Python 库都会生成发布样式回归表
Posted
技术标签:
【中文标题】任何 Python 库都会生成发布样式回归表【英文标题】:Any Python Library Produces Publication Style Regression Tables 【发布时间】:2014-06-27 21:14:41 【问题描述】:我一直在使用 Python 进行回归分析。得到回归结果后,我需要将所有结果汇总到一个表中,并将它们转换为 LaTex(用于发布)。是否有任何包可以在 Python 中执行此操作?像Stata中的estout这样的东西给出了下表:
【问题讨论】:
这个问题的任何现代更新?还有summary2,还很欠缺。 @MatthewGunn 这个功能远非Stata的estout包(或R的包)所能做到的。所以我最终为我的工作流程做的是在 Python 中调用一个用户定义的函数,该函数调用 Stata 在终端中运行一个执行所有回归并输出表的 do-file。 【参考方案1】:嗯,summary_col
中有statsmodels
;它没有estout
的所有花里胡哨,但它确实具有您正在寻找的基本功能(包括导出到 LaTeX):
import statsmodels.api as sm
from statsmodels.iolib.summary2 import summary_col
p['const'] = 1
reg0 = sm.OLS(p['p0'],p[['const','exmkt','smb','hml']]).fit()
reg1 = sm.OLS(p['p2'],p[['const','exmkt','smb','hml']]).fit()
reg2 = sm.OLS(p['p4'],p[['const','exmkt','smb','hml']]).fit()
print summary_col([reg0,reg1,reg2],stars=True,float_format='%0.2f')
===============================
p0 p2 p4
-------------------------------
const -1.03*** -0.01 0.62***
(0.11) (0.04) (0.07)
exmkt 1.28*** 0.97*** 0.98***
(0.02) (0.01) (0.01)
smb 0.37*** 0.28*** -0.14***
(0.03) (0.01) (0.02)
hml 0.77*** 0.46*** 0.69***
(0.04) (0.01) (0.02)
===============================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
或者这里是我添加 R-Squared 和观察次数的版本:
print summary_col([reg0,reg1,reg2],stars=True,float_format='%0.2f',
info_dict='N':lambda x: "0:d".format(int(x.nobs)),
'R2':lambda x: ":.2f".format(x.rsquared))
===============================
p0 p2 p4
-------------------------------
const -1.03*** -0.01 0.62***
(0.11) (0.04) (0.07)
exmkt 1.28*** 0.97*** 0.98***
(0.02) (0.01) (0.01)
smb 0.37*** 0.28*** -0.14***
(0.03) (0.01) (0.02)
hml 0.77*** 0.46*** 0.69***
(0.04) (0.01) (0.02)
R2 0.86 0.95 0.88
N 1044 1044 1044
===============================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01
另一个例子,这次展示了model_names
选项的使用和自变量变化的回归:
reg3 = sm.OLS(p['p4'],p[['const','exmkt']]).fit()
reg4 = sm.OLS(p['p4'],p[['const','exmkt','smb','hml']]).fit()
reg5 = sm.OLS(p['p4'],p[['const','exmkt','smb','hml','umd']]).fit()
print summary_col([reg3,reg4,reg5],stars=True,float_format='%0.2f',
model_names=['p4\n(0)','p4\n(1)','p4\n(2)'],
info_dict='N':lambda x: "0:d".format(int(x.nobs)),
'R2':lambda x: ":.2f".format(x.rsquared))
==============================
p4 p4 p4
(0) (1) (2)
------------------------------
const 0.66*** 0.62*** 0.15***
(0.10) (0.07) (0.04)
exmkt 1.10*** 0.98*** 1.08***
(0.02) (0.01) (0.01)
hml 0.69*** 0.72***
(0.02) (0.01)
smb -0.14*** 0.07***
(0.02) (0.01)
umd 0.46***
(0.01)
R2 0.78 0.88 0.96
N 1044 1044 1044
==============================
Standard errors in
parentheses.
* p<.1, ** p<.05, ***p<.01
要导出到 LaTeX,请使用 as_latex
方法。
我可能是错的,但我认为没有实现 t-stats 选项而不是标准错误(如您的示例中)。
【讨论】:
能否请您告诉我如何在 Google 搜索中找到此命令?我花了半个小时寻找命令,但找不到。谢谢! 我不知道……我忘记了我是怎么碰到它的;这是github上源文件的链接;它有一个文档字符串:summary2.py 太棒了。如果您包含具有不同解释变量的回归,这对其他人会有所帮助。 好的,添加了一个例子。 是的,后期处理很简单。令人失望的是,python 在这种东西上如此落后【参考方案2】:另一种选择是Stargazer。要快速上手,请参考 Stargazer 可以制作的set of demo tables。
相关帖子包括:post1 和 post2。
【讨论】:
【参考方案3】:除了@Karl D. 对 Statsmodels as_latex
方法的出色回答,您还可以查看 pystout
package。
!pip install pystout
import pandas as pd
from sklearn.datasets import load_iris
import statsmodels.api as sm
from pystout import pystout
data = load_iris()
df = pd.DataFrame(data = data.data, columns = data.feature_names)
df.columns = ['s_len', 's_w', 'p_len', 'p_w']
y = df['p_w']
X = df[['s_len', 's_w', 'p_len']]
m1 = sm.OLS(y, X).fit()
X = df[['s_len', 's_w']]
m2 = sm.OLS(y, X).fit()
X = df[['s_len']]
m3 = sm.OLS(y, X).fit()
pystout(models=[m1, m2, m3],
file='test_table.tex',
addnotes=['Note above','Note below'],
digits=2,
endog_names=['petal width', 'petal width', 'petal width'],
varlabels='const':'Constant',
'displacement':'Disp','mpg':'MPG',
mgroups='First Group':[1,2],'Second Group':3,
modstat='nobs':'Obs','rsquared_adj':'Adj. R\sym2','fvalue':'F-stat'
)
不要像我一样花几个小时试图打印出pystout
,LateX 输出直接写在你传递给file
的.tex
文档上。
编译后,输出如下所示:
【讨论】:
以上是关于任何 Python 库都会生成发布样式回归表的主要内容,如果未能解决你的问题,请参考以下文章