有哪个Python库可以生成发表风格的回归表?
我一直在用Python做回归分析。在得到回归结果后,我需要把所有的结果总结成一个表格,并转换成LaTex格式(为了发表)。有没有什么Python的包可以做到这一点?类似于Stata中的estout,可以生成下面这样的表格:
3 个回答
2
除了Karl D.的精彩回答,提到的Statsmodels的as_latex
方法外,你还可以看看pystout
这个库。
!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\sym{2}','fvalue':'F-stat'}
)
别像我一样花几个小时去弄pystout
。它的LaTeX输出会直接写到你传入的.tex
文件里。
编译后,输出看起来是这样的:
4
一个替代方案是 Stargazer。如果你想快速上手,可以查看 Stargazer可以生成的一组示例表格。
38
好吧,statsmodels
里有一个叫summary_col
的功能;虽然它没有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平方值和观察数:
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统计量代替标准误差的选项(就像你例子里那样)。