2013-05-23 12 views
8

Sto eseguendo la regressione logistica utilizzando pandas 0.11.0 (gestione dati) e statsmodels 0.4.3 per eseguire la regressione effettiva, su Mac OSX Lion.Python 2.7 - statsmodels - formattazione e scrittura dell'output di sintesi

Ho eseguito ~ 2.900 diversi modelli di regressione logistica e ho bisogno dell'output dei risultati nel file csv e formattato in un modo particolare.

Attualmente, sto solo a conoscenza di fare print result.summary() che stampa i risultati (come segue) alla 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 
=============================================================================== 

mi dovrà anche l'odds ratio, che viene calcolato dal print np.exp(result.params), e viene stampato nella shell in quanto tale:

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

cosa ho bisogno è per queste ciascuna da scrivere in un file CSV in forma di una fila lon molto simile (non sono sicuro, a questo punto, se ho bisogno di cose come Log-Likelihood, ma l'ho incluso per il bene di completezza):

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

Penso che si ottiene l'immagine - una lunghissima fila, con tutti questi valori reali, e un colpo di testa con tutte le designazioni di colonna in un formato simile.

Ho familiarità con lo csv module in Python e sto diventando più familiare con pandas. Non sono sicuro se queste informazioni possano essere formattate e archiviate in un e quindi scritte, utilizzando to_csv in un file una volta completati tutti i ~ 2.900 modelli di regressione logistica; questo andrebbe bene. Inoltre, anche la loro scrittura dopo il completamento di ciascun modello è soddisfacente (utilizzando csv module).

UPDATE:

Così, stavo guardando più al sito statsmodels, in particolare cercando di capire come i risultati di un modello vengono memorizzati all'interno delle classi. Sembra che esista una classe chiamata "Risultati", che dovrà essere utilizzata. Penso che usare l'ereditarietà di questa classe per creare un'altra classe, dove alcuni dei metodi/operatori vengano cambiati potrebbe essere la strada da percorrere, per ottenere la formattazione richiesta. Ho pochissima esperienza nel modo di farlo, e avrò bisogno di dedicare un po 'di tempo a capirlo (che va bene). Se qualcuno può aiutare/ha più esperienza sarebbe fantastico!

Ecco il sito dove le classi sono disposti: statsmodels results class

+0

Aggiunto un aggiornamento alla fine di questa domanda. Per favore dai un'occhiata! – DMML

+0

Se si considera la risposta all'aggiornamento, si prega di considerare una risposta autonoma. – Jacinda

risposta

7

Non v'è alcuna tabella premade dei parametri e le loro statistiche dei risultati attualmente disponibili.

Essenzialmente è necessario raggruppare tutti i risultati da soli, sia in un elenco, in una serie numpy che in un pandas. DataFrame dipende da cosa è più conveniente per te.

per esempio, se voglio un array NumPy che ha i risultati per un modello, llf e risultati nella tabella dei parametri di sintesi, quindi potrei usare

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

ma potrebbe essere meglio per allinearsi con i panda , a seconda della struttura che hai tra i modelli.

È possibile scrivere una funzione di supporto che raccolga tutti i risultati dall'istanza dei risultati e li concateni in fila.

(io non sono sicuro di quello che è il più conveniente per la scrittura csv da filari)

edit:

Ecco un esempio memorizzare i risultati della regressione in un dataframe

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

l'anello è sulla linea 159.

riepilogo() a nd codice simile al di fuori di statsmodels, ad esempio http://johnbeieler.org/py_apsrtable/ per la combinazione di più risultati, è orientato alla stampa e non per memorizzare le variabili.

+0

Grazie mille per aver dedicato del tempo a leggere tutto questo e per rispondere! Farò un tentativo/sperimentarlo domani! Inizialmente, stavo tentando di eseguire iterate su results.summary() - che non funziona! – DMML

+0

Grazie ancora per questo! Scusa ci ho messo più tempo, poi ho detto che sarebbe tornato da te. Ho provato l'esempio 'res_all = []' che hai dato e ha restituito un oggetto TypeError: 'BinaryResultsWrapper' non iterable'. Qualche idea? Darò anche un'occhiata a Github che hai postato. – DMML

+0

Inoltre, guardando questo http://statsmodels.sourceforge.net/stable/_images/inheritance-094830692a2117caf718ad013bd23e2a57db7b6d.png sembra che io abbia a che fare con "BinaryResultsWrapper" anziché con solo risultati ... – DMML

2

Se si desidera trovare il coefficiente risultati.param vi darà coefficienti. Se si desidera trovare valori validi, utilizzare results.pvalues. In ogni modo puoi usare dir (risultati) per scoprire tutti gli attributi di un oggetto.

0

Ho trovato questa formulazione un po 'più semplice. È possibile aggiungere/sottrarre colonne seguendo la sintassi degli esempi (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