web-dev-qa-db-fra.com

Conversion de l'objet récapitulatif statsmodels en Pandas Dataframe

Je suis en train de faire une régression linéaire multiple avec statsmodels.formula.api (version 0.9.0) sous Windows 10. Après avoir ajusté le modèle et obtenu le résumé avec les lignes suivantes, j’obtiens un résumé au format objet de résumé .

X_opt  = X[:, [0,1,2,3]]
regressor_OLS = sm.OLS(endog= y, exog= X_opt).fit()
regressor_OLS.summary()


                          OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.951
Model:                            OLS   Adj. R-squared:                  0.948
Method:                 Least Squares   F-statistic:                     296.0
Date:                Wed, 08 Aug 2018   Prob (F-statistic):           4.53e-30
Time:                        00:46:48   Log-Likelihood:                -525.39
No. Observations:                  50   AIC:                             1059.
Df Residuals:                      46   BIC:                             1066.
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const       5.012e+04   6572.353      7.626      0.000    3.69e+04    6.34e+04
x1             0.8057      0.045     17.846      0.000       0.715       0.897
x2            -0.0268      0.051     -0.526      0.602      -0.130       0.076
x3             0.0272      0.016      1.655      0.105      -0.006       0.060
==============================================================================
Omnibus:                       14.838   Durbin-Watson:                   1.282
Prob(Omnibus):                  0.001   Jarque-Bera (JB):               21.442
Skew:                          -0.949   Prob(JB):                     2.21e-05
Kurtosis:                       5.586   Cond. No.                     1.40e+06
==============================================================================

Je souhaite effectuer une élimination en amont pour les valeurs P du niveau de signification 0,05. Pour cela, j'ai besoin de supprimer le prédicteur avec les valeurs P les plus élevées et d'exécuter le code à nouveau.

Je voulais savoir s'il existe un moyen d'extraire les valeurs P de l'objet récapitulatif, de sorte que je puisse exécuter une boucle avec une instruction conditionnelle et trouver les variables significatives sans répéter les étapes manuellement.

Je vous remercie.

4
Sagun Kayastha

La réponse de @Michael B fonctionne bien, mais nécessite de "recréer" la table. La table elle-même est en fait directement disponible à partir de l'attribut summary (). Tables. Chaque table de cet attribut (qui est une liste de tables) est un SimpleTable , qui contient des méthodes pour générer différents formats. Nous pouvons alors lire n'importe lequel de ces formats en tant que pd.DataFrame:

import statsmodels.api as sm

model = sm.OLS(y,x)
results = model.fit()
results_summary = results.summary()

# Note that tables is a list. The table at index 1 is the "core" table. Additionally, read_html puts dfs in a list, so we want index 0
results_as_html = results_summary.tables[1].as_html()
pd.read_html(results_as_html, header=0, index_col=0)[0]
5
ZaxR

Enregistrez votre ajustement de modèle sous la forme d'une variable results, comme suit:

import statsmodels.api as sm
model = sm.OLS(y,x)
results = model.fit()

Puis créez une fonction comme ci-dessous:

def results_summary_to_dataframe(results):
    '''take 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

Vous pouvez explorer davantage tous les attributs de l'objet results en utilisant dir () pour imprimer, puis les ajouter à la fonction et à df en conséquence.

8
Michael B

Une solution simple consiste en une seule ligne de code:

LRresult = (result.summary2().tables[1])

Cela vous donnera un objet dataframe:

type(LRresult)

pandas.core.frame.DataFrame

Pour obtenir les variables significatives et relancer le test:

newlist = list(LRresult[LRresult['P>|z|']<=0.05].index)[1:]
myform1 = 'binary_Target' + ' ~ ' + ' + '.join(newlist)

M1_test2 = smf.logit(formula=myform1,data=myM1_1)

result2 = M1_test2.fit(maxiter=200)
LRresult2 = (result2.summary2().tables[1])
LRresult2
0
Daniel Zhou