Экспорт результатов регрессии в виде файла CSV при использовании summary_out - PullRequest
0 голосов
/ 05 октября 2018

Я использую несколько регрессий, используя финансовые данные из Yahoo!Финансовые и французско-французские факторы от http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/Data_Library/f-f_factors.html

Однофакторная регрессия:

CAPM = sm.ols( formula = 'Exret ~ MKT', data=m).fit(cov_type='HAC',cov_kwds={'maxlags':1})

Трехфакторная регрессия:

FF3 = sm.ols( formula = 'Exret ~ MKT + SMB + HML',     
data=m).fit(cov_type='HAC',cov_kwds={'maxlags':1})

Затем я использую summary_col чтобы создать таблицу со значками звезд:

dfoutput = summary_col([CAPM,FF3],stars=True,float_format='%0.4f',
model_names=['GOOG','GOOG'],info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),'Adjusted R2':lambda x: "{:.2f}".format(x.rsquared_adj)}, regressor_order = ['Intercept', 'MKT', 'SMB', 'HML'])

Вывод

dfoutput
Out[311]: 
<class 'statsmodels.iolib.summary2.Summary'>
"""

=================================
             GOOG I       GOOG II  
---------------------------------
Intercept   -0.0009***   -0.0010***
            (0.0003)      (0.0003)  
MKT         0.0098***     0.0107*** 
            (0.0003)      (0.0003)  
SMB                      -0.0033***
                          (0.0006)  
HML                      -0.0063***
                          (0.0006)  
N              1930         1930      
Adjusted R2    0.37         0.42      
=================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01

У меня есть два вопроса:

  1. Можно ли заменить стандартные ошибки в скобках на t-stats?

  2. Можно ли экспортировать результаты функции summary_col в Excel в виде csvфайл?

1 Ответ

0 голосов
/ 08 октября 2018

Можно изменить стандартные ошибки в скобках на t-статистику, но только если вы измените файл summary2.py в библиотеке statsmodel.

Вам просто нужно заменить функцию _col_params()в этом файле со следующей версией:

def _col_params(result, float_format='%.4f', stars=True):
    '''Stack coefficients and standard errors in single column
    '''

    # Extract parameters
    res = summary_params(result)
    # Format float
    for col in res.columns[:3]:
        res[col] = res[col].apply(lambda x: float_format % x)
    # Std.Errors in parentheses
    res.ix[:, 2] = '(' + res.ix[:, 2] + ')'
    # Significance stars
    if stars:
        idx = res.ix[:, 3] < .1
        res.ix[idx, 0] = res.ix[idx, 0] + '*'
        idx = res.ix[:, 3] < .05
        res.ix[idx, 0] = res.ix[idx, 0] + '*'
        idx = res.ix[:, 3] < .01
        res.ix[idx, 0] = res.ix[idx, 0] + '*'
    # Stack Coefs and Std.Errors
    res = res.ix[:, [0,2]]
    res = res.stack()
    res = pd.DataFrame(res)
    res.columns = [str(result.model.endog_names)]
    return res

Рекомендуется закомментировать исходную функцию (вместо того, чтобы удалить ее), чтобы иметь возможность переключаться туда и обратно при необходимости.

Затем вы можете сделать что-то вроде следующего:

import pandas as pd        
import statsmodels.api as sm
from statsmodels.iolib.summary2 import summary_col

df = pd.read_stata('http://www.stata-press.com/data/r14/auto.dta')
df['cons'] = 1

Y = df['mpg']
X1 = df[['weight', 'cons']]
X2 = df[['weight', 'price', 'cons']]
X3 = df[['weight', 'price', 'length', 'cons']]
X4 = df[['weight', 'price', 'length', 'displacement', 'cons']]

reg1 = sm.OLS(Y, X1).fit()
reg2 = sm.OLS(Y, X2).fit()
reg3 = sm.OLS(Y, X3).fit()
reg4 = sm.OLS(Y, X4).fit()

results = summary_col([reg1, reg2, reg3, reg4],stars=True,float_format='%0.2f',
                  model_names=['Model\n(1)', 'Model\n(2)', 'Model\n(3)',  'Model\n(4)'],
                  info_dict={'N':lambda x: "{0:d}".format(int(x.nobs)),
                             'R2':lambda x: "{:.2f}".format(x.rsquared)})

Очевидно, что теперь результаты включают t-статистику вместо стандартных ошибок:

print(results)

================================================
              Model    Model    Model    Model  
               (1)      (2)      (3)      (4)   
------------------------------------------------
cons         39.44*** 39.44*** 49.68*** 50.02***
             (24.44)  (24.32)  (7.85)   (7.80)  
displacement                            0.00    
                                        (0.44)  
length                         -0.10*   -0.09   
                               (-1.67)  (-1.63) 
price                 -0.00    -0.00    -0.00   
                      (-0.57)  (-1.03)  (-1.03) 
weight       -0.01*** -0.01*** -0.00*   -0.00*  
             (-11.60) (-9.42)  (-1.72)  (-1.67) 
N            74       74       74       74      
R2           0.65     0.65     0.67     0.67    
================================================
Standard errors in parentheses.
* p<.1, ** p<.05, ***p<.01

Обратите внимание, что вывручную придется изменить текст под таблицей, чтобы отразить это изменение, если вы не готовы внести дополнительные изменения в исходный код.

После завершения этого шага вы можете просто использовать метод as_text(), чтобыполучить все в строке и экспортировать это в текстовый файл, используя библиотеку csv:

results_text = results.as_text()

import csv
resultFile = open("table.csv",'w')
resultFile.write(results_text)
resultFile.close()
...