【问题标题】:Any Python Library Produces Publication Style Regression Tables任何 Python 库都会生成发布样式回归表
【发布时间】:2014-06-27 21:14:41
【问题描述】:

我一直在使用 Python 进行回归分析。得到回归结果后,我需要将所有结果汇总到一个表中,并将它们转换为 LaTex(用于发布)。是否有任何包可以在 Python 中执行此操作?像Stata中的estout这样的东西给出了下表:

【问题讨论】:

  • 这个问题的任何现代更新?还有summary2,还很欠缺。
  • @MatthewGunn 这个功能远非Stata的estout包(或R的包)所能做到的。所以我最终为我的工作流程做的是在 Python 中调用一个用户定义的函数,该函数调用 Stata 在终端中运行一个执行所有回归并输出表的 do-file。

标签: python latex regression stata statsmodels


【解决方案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

相关帖子包括:post1post2

【讨论】:

    【解决方案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\sym{2}','fvalue':'F-stat'}
            )
    
    

    不要像我一样花几个小时试图打印出pystout,LateX 输出直接写在你传递给file.tex 文档上。

    编译后,输出如下所示:

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2021-10-17
      • 2019-02-11
      • 1970-01-01
      • 2016-04-04
      • 2019-01-23
      • 2015-05-31
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多