2013-05-23 27 views
8

Mac OSX Lionで実際の回帰を行うには、pandas 0.11.0(データ処理)とstatsmodels 0.4.3を使用してロジスティック回帰を行っています。Python 2.7 - statsmodels - サマリー出力の書式設定と書込み

私は〜2,900の異なるロジスティック回帰モデルを実行し、結果をCSVファイルに出力し、特定の方法でフォーマットする必要があります。

現在、私は(次のように)シェルに結果を出力しているprint result.summary()を行うだけ承知している:

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` 

私はあなたが画像を取得すると思います。

私はPythonのcsv moduleに精通しており、pandasにもっと慣れ親しんでいます。この情報を書式化してpandas dataframeに格納して書き込むことができるかどうかは不明ですが、to_csvを使用して〜2,900個のロジスティック回帰モデルがすべて完了するとファイルに書き込まれます。それは確かに大丈夫だろう。また、各モデルの完成時に書き込むこともできます(csv moduleを使用)。

UPDATE:

だから、私は特に、モデルの結果がクラス内に格納されている方法を把握しようと、statsmodelsサイトでもっと探していました。 'Results'というクラスがあるようですが、これを使う必要があります。私は、このクラスから継承を使用して別のクラスを作成すると思います。メソッド/演算子の一部が変更されて、必要な書式を取得する方法があるかもしれません。私はこれを行う方法ではほとんど経験がなく、これを理解するためにかなりの時間を費やす必要があります(これは問題ありません)。誰かが助けることができれば/すばらしいと思うより多くの経験がある! statsmodels results class

+0

この質問の末尾に更新が追加されました。どうぞご覧ください! – DMML

+0

あなたのアップデートを答えと考えるなら、自己解答を考えてください。 – Jacinda

答えて

7

パラメータおよび現在入手可能なその結果の統計情報のない既成の表がありません。ここで

は、クラスがレイアウトされているサイトです。

リスト、numpy配列、またはpandas DataFrameのいずれの方が便利なのかにかかわらず、すべての結果を自分でスタックする必要があります。私は要約パラメータテーブル内のモデル、LLFと結果の結果を持っている1つのnumpyの配列をしたい場合は

例えば、私は

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))) 

を使用することができます。しかし、パンダに合わせてより良いかもしれませんモデル間でどのような構造があるかによって異なります。

結果インスタンスのすべての結果を取得して1行に連結するヘルパ関数を作成できます。

(私は行でCSVファイルに書き込むための最も便利だかわからないんだけど)

編集:ここでは

は、データフレーム

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

に回帰結果を格納する例です。

ループは159にあります。

要約()aいくつかの結果を組み合わせるために、例えばhttp://johnbeieler.org/py_apsrtable/のように、統計モデルの外部にある同様のコードは、印刷する方向に向いており、変数を格納しないようになっています。

+0

そのすべてを読んで応答する時間を取ってくれてありがとう!私はそれを試してみる/それと明日の実験!私はもともと、結果を反復しようとしていました。サマリー() - うまくいきません! – DMML

+0

もう一度ありがとう!申し訳ありませんが、それ以上の時間がかかりました。私はあなたに戻ってくると言いました。私はあなたが与えた 'res_all = []'の例を試しましたが、 'TypeError: 'BinaryResultsWrapper' object is iterable'が返されました。何か案は?私はあなたが投稿したgithubを見てみましょう。 – DMML

+0

また、このhttp://statsmodels.sourceforge.net/stable/_images/inheritance-094830692a2117caf718ad013bd23e2a57db7b6d.pngを見ると、私は「BinaryResultsWrapper」を扱っているようです。ちょうど結果とは対照的に... – DMML

2

係数を見つけるにはresults.paramsに係数を与えます。 pvaluesを検索する場合は、results.pvaluesを使用します。どのようにしても、dir(結果)を使ってオブジェクトのすべての属性を調べることができます。

0

私はこの製剤がもう少し簡単であることを発見しました。例(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 
関連する問題