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.
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]
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.
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