Python 2.7 – statsmodels – formato y escritura de resultados de resumen

Estoy haciendo regresión logística utilizando pandas 0.11.0 (manejo de datos) y statsmodels 0.4.3 para hacer la regresión real, en Mac OSX Lion.

Voy a ejecutar ~ 2,900 modelos diferentes de regresión logística y necesitaré los resultados en un archivo csv y formateados de una manera particular.

Actualmente, solo soy consciente de hacer print result.summary() que imprime los resultados (de la siguiente manera) en el 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 =============================================================================== 

También necesitaré la razón de probabilidades, que se calcula mediante la print np.exp(result.params) , y se imprime en la shell como tal:

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

Lo que necesito es que cada uno se escriba en un archivo csv en forma de una sola fila como (no estoy seguro, en este punto, si necesitaré cosas como Log-Likelihood , pero lo he incluido por razones de minuciosidad) ):

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

Creo que obtienes la imagen: una fila muy larga, con todos estos valores reales, y un encabezado con todas las designaciones de columna en un formato similar.

Estoy familiarizado con el csv module en Python, y me estoy familiarizando más con los pandas . No estoy seguro de si esta información podría formatearse y almacenarse en un pandas dataframe y luego escribirse, usando to_csv en un archivo una vez que se hayan completado todos los modelos de regresión logística de ~ 2,900; Eso ciertamente estaría bien. Además, escribirlos a medida que se completa cada modelo también está bien (usando el csv module ).

ACTUALIZAR:

Entonces, estaba buscando más en el sitio de statsmodels, específicamente tratando de averiguar cómo se almacenan los resultados de un modelo dentro de las clases. Parece que hay una clase llamada ‘Resultados’, que deberá usarse. Creo que usar la herencia de esta clase para crear otra clase, en la que algunos de los métodos / operadores que se cambian podría ser el camino a seguir, para obtener el formato que requiero. Tengo muy poca experiencia en la forma de hacer esto, y necesitaré dedicar bastante tiempo a resolver esto (lo cual está bien). ¡Si alguien puede ayudar / tiene más experiencia que sería increíble!

Aquí está el sitio donde se presentan las clases: statsmodels resultados clase

No hay una tabla de parámetros prefabricada y sus estadísticas de resultados están disponibles actualmente.

Esencialmente, usted necesita astackr todos los resultados, ya sea en una lista, una matriz de números o pandas. DataFrame depende de lo que sea más conveniente para usted.

por ejemplo, si quiero una matriz numpy que tenga los resultados para un modelo, llf y los resultados en la tabla de parámetros de resumen, entonces podría usar

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

Pero podría ser mejor alinearse con los pandas, dependiendo de la estructura que tenga entre los modelos.

Podría escribir una función auxiliar que tome todos los resultados de la instancia de resultados y los concatene en una fila.

(No estoy seguro de qué es lo más conveniente para escribir en CSV por filas)

editar:

Aquí hay un ejemplo que almacena los resultados de la regresión en un dataframe

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

el bucle está en la línea 159.

Resumen () y código similar fuera de statsmodels, por ejemplo, http://johnbeieler.org/py_apsrtable/ para combinar varios resultados, está orientado a la impresión y no a almacenar variables.

Si quieres encontrar los resultados de los coeficientes, los indicadores te darán los coeficientes. Si quieres encontrar valores de p, entonces usa results.pvalues. De cualquier forma, puede usar dir (resultados) para averiguar todos los atributos de un objeto.

Encontré que esta formulación es un poco más sencilla. Puede agregar / restar columnas siguiendo la syntax de los ejemplos (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 
 write_path = '/my/path/here/output.csv' with open(write_path, 'w') as f: f.write(result.summary().as_csv()) 

En realidad, hay un método incorporado documentado en la documentación aquí :

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

Creo que esta es una forma mucho más fácil (y limpia) de enviar los resúmenes a archivos csv.