有哪个Python库可以生成发表风格的回归表?

24 投票
3 回答
13324 浏览
提问于 2025-04-18 06:04

我一直在用Python做回归分析。在得到回归结果后,我需要把所有的结果总结成一个表格,并转换成LaTex格式(为了发表)。有没有什么Python的包可以做到这一点?类似于Stata中的estout,可以生成下面这样的表格:

enter image description here

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文件里。

编译后,输出看起来是这样的:

一些渲染后的LaTeX

4

一个替代方案是 Stargazer。如果你想快速上手,可以查看 Stargazer可以生成的一组示例表格

相关的帖子包括: 帖子1帖子2

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统计量代替标准误差的选项(就像你例子里那样)。

撰写回答