11

我正在使用pandas 0.11.0(数据处理)进行逻辑回归并statsmodels 0.4.3在 Mac OSX Lion 上进行实际回归。

我将运行约 2,900 个不同的逻辑回归模型,并且需要将结果输出到 csv 文件并以特定方式格式化。

目前,我只知道print result.summary()将结果(如下)打印到shell:

 Logit Regression Results                           
  ==============================================================================
 Dep. Variable:            death_death   No. Observations:                 9752
 Model:                          Logit   Df Residuals:                     9747
 Method:                           MLE   Df Model:                            4
 Date:                Wed, 22 May 2013   Pseudo R-squ.:                -0.02672
 Time:                        22:15:05   Log-Likelihood:                -5806.9
 converged:                       True   LL-Null:                       -5655.8
                                         LLR p-value:                     1.000
 ===============================================================================
                   coef    std err          z      P>|z|      [95.0% Conf. Int.]
 -------------------------------------------------------------------------------
 age_age5064    -0.1999      0.055     -3.619      0.000        -0.308    -0.092
 age_age6574    -0.2553      0.053     -4.847      0.000        -0.359    -0.152
 sex_female     -0.2515      0.044     -5.765      0.000        -0.337    -0.166
 stage_early    -0.1838      0.041     -4.528      0.000        -0.263    -0.104
 access         -0.0102      0.001    -16.381      0.000        -0.011    -0.009
 ===============================================================================

我还需要优势比,它由 计算print np.exp(result.params),并打印在外壳中,如下所示:

age_age5064    0.818842
age_age6574    0.774648
sex_female     0.777667
stage_early    0.832098
access         0.989859
dtype: float64

我需要将这些都以非常长的行的形式写入 csv 文件(我不确定,在这一点上,我是否需要类似的东西Log-Likelihood,但为了彻底起见已经包含了它):

`Log-Likelihood, age_age5064_coef, age_age5064_std_err, age_age5064_z, age_age5064_p>|z|,...age_age6574_coef, age_age6574_std_err, ......access_coef, access_std_err, ....age_age5064_odds_ratio, age_age6574_odds_ratio, ...sex_female_odds_ratio,.....access_odds_ratio`

我想你明白了——一个很长的行,包含所有这些实际值,以及一个包含所有列名称的标题都采用类似的格式。

我熟悉csv modulePython 中的 ,并且越来越熟悉pandas. 不确定是否可以将此信息格式化并存储在 a 中pandas dataframe,然后to_csv在所有约 2,900 个逻辑回归模型完成后将其写入文件;那肯定没问题。此外,在每个模型完成时编写它们也很好(使用csv module)。

更新:

所以,我更多地关注 statsmodels 站点,特别是试图弄清楚模型的结果是如何存储在类中的。看起来有一个名为“Results”的类,需要使用它。我认为使用这个类的继承来创建另一个类,其中一些方法/运算符发生变化可能是要走的路,以获得我需要的格式。我在这方面的经验很少,需要花很多时间来解决这个问题(这很好)。如果有人可以提供帮助/有更多经验,那就太棒了!

这是布置类的站点:statsmodels 结果类

4

5 回答 5

8

目前没有可用的参数及其结果统计的预制表。

本质上,您需要自己堆叠所有结果,无论是在列表、numpy 数组还是 pandas DataFrame 中,都取决于什么对您来说更方便。

例如,如果我想要一个包含模型结果的 numpy 数组,llf 和摘要参数表中的结果,那么我可以使用

res_all = []
for res in results:
    low, upp = res.confint().T   # unpack columns 
    res_all.append(numpy.concatenate(([res.llf], res.params, res.tvalues, res.pvalues, 
                   low, upp)))

但与 pandas 保持一致可能会更好,具体取决于您跨模型的结构。

您可以编写一个辅助函数,从结果实例中获取所有结果并将它们连接成一行。

(我不确定按行写入 csv 最方便的是什么)

编辑:

这是一个将回归结果存储在数据框中的示例

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/sandbox/multilinear.py#L21

循环在第 159 行。

summary() 和 statsmodels 之外的类似代码,例如用于组合多个结果的http://johnbeieler.org/py_apsrtable/,面向打印而不是存储变量。

于 2013-05-25T23:58:55.860 回答
3
write_path = '/my/path/here/output.csv'
with open(write_path, 'w') as f:
    f.write(result.summary().as_csv())
于 2018-04-25T14:01:53.960 回答
2
  • results.params :用于系数
  • results.pvalues :用于 p 值

顺便说一句,您可以使用 dir(results) 找出对象的所有属性

于 2014-07-07T14:09:32.930 回答
2

我发现这个公式更简单一些。您可以按照示例中的语法(pvals、coeff、conf_lower、conf_higher)添加/减去列。

import pandas as pd     #This can be left out if already present...

def results_summary_to_dataframe(results):
    '''This takes the result of an statsmodel results table and transforms it into a dataframe'''
    pvals = results.pvalues
    coeff = results.params
    conf_lower = results.conf_int()[0]
    conf_higher = results.conf_int()[1]

    results_df = pd.DataFrame({"pvals":pvals,
                               "coeff":coeff,
                               "conf_lower":conf_lower,
                               "conf_higher":conf_higher
                                })

    #Reordering...
    results_df = results_df[["coeff","pvals","conf_lower","conf_higher"]]
    return results_df
于 2016-04-21T01:06:01.660 回答
1

实际上这里的文档中记录了一个内置方法:

f = open('csvfile.csv','w')
f.write(result.summary().as_csv())
f.close()

我相信这是一种将摘要输出到 csv 文件的更简单(和干净)的方法。

于 2018-07-26T22:14:23.083 回答