2016-07-11 4 views
1

Ich möchte mehrere Spezifikationen einer linearen Regression durchlaufen und die Ergebnisse für jedes Modell in einem Python-Wörterbuch speichern. Der folgende Code ist etwas erfolgreich, aber zusätzlicher Text (z. B. Datentypinformationen) ist in dem Wörterbuch enthalten, wodurch es unlesbar wird. Was das Konfidenzintervall angeht, hätte ich gerne zwei separate Spalten - eine für die obere und eine für die untere -, aber das kann ich nicht.Wie kann ich die Ausgabe besser formatieren, die ich vor mehreren Regressionen speichern möchte?

Code:

import patsy 
import statsmodels.api as sm 
from collections import defaultdict 

colleges = ['ARC_g',u'CCSF_g',u'DAC_g',u'DVC_g',u'LC_g',u'NVC_g',u'SAC_g', u'SRJC_g',u'SC_g',u'SCC_g'] 
results = defaultdict(lambda: defaultdict(int)) 

for exog in colleges: 
    exog = exog.encode('ascii') 
    f1 = 'GRADE_PT_103 ~ %s -1' % exog 
    y,X = patsy.dmatrices(f1, data,return_type='dataframe') 
    mod = sm.OLS(y, X) # Describe model 

    res = mod.fit()  # Fit model 

    results[exog]['beta'] = res.params 
#I'd like the confidence interval to be separated into two columns ('upper' and 'lower') 
    results[exog]['CI'] = res.conf_int() 
    results[exog]['rsq'] = res.rsquared 

pd.DataFrame(results) 

______Current Ausgang

  ARC_g      | CCSF_g      | ... 
beta | ARC_g 0.79304 dtype: float64 | CCSF_g 0.833644 dtype: float64 
CI | 0 1 ARC_g 0.557422 1.0... 0 1| CCSF_g 0.655746 1... 

rsq | 0.122551 | 0.213053

+0

Der Titel hat sehr wenig mit der Codierung Problem - Sie eine Formatierung Problem. – Merlin

+0

Das stimmt. Ich habe den Titel bearbeitet. –

Antwort

1

So würde ich zusammenfassen, was Sie gezeigt haben. Hoffentlich hilft es dir, dir ein paar Ideen zu geben.

import pandas as pd 
import statsmodels.formula.api as smf 

data = pd.DataFrame(np.random.randn(30, 5), columns=list('YABCD')) 

results = {} 
for c in data.columns[1:]: 
    f = 'Y ~ {}'.format(c) 
    r = smf.ols(formula=f, data=data).fit() 
    coef = pd.concat([r.params, 
         r.conf_int().iloc[:, 0], 
         r.conf_int().iloc[:, 1]], axis=1, keys=['coef', 'lower', 'upper']) 
    coef.index = ['Intercept', 'Beta'] 
    results[c] = dict(coef=coef, rsq=r.rsquared) 


keys = data.columns[1:] 
summary = pd.concat([results[k]['coef'].stack() for k in keys], axis=1, keys=keys) 
summary.index = summary.index.to_series().str.join(' - ') 
summary.append(pd.Series([results[k]['rsq'] for k in keys], keys, name='R Squared')) 

enter image description here

+0

Das ist perfekt. Danke, piRSquared. –

Verwandte Themen