Nun, es gibt kein stepAIC in Python.
Wenn Sie darüber nachdenken, finden Sie Artikel wie diesen in StackOverflow.
Siehe den vom Befragten eingeführten Link (Vorauswahl mit Statistikmodellen; es wird jedoch nur die lineare Regression unterstützt, und der Index ist ein Entscheidungskoeffizient, kein AIC). Ich habe mich entschieden, stepAIC zu schreiben.
step_aic
def step_aic(model, exog, endog, **kwargs):
"""
This select the best exogenous variables with AIC
Both exog and endog values can be either str or list.
(Endog list is for the Binomial family.)
Note: This adopt only "forward" selection
Args:
model: model from statsmodels.formula.api
exog (str or list): exogenous variables
endog (str or list): endogenous variables
kwargs: extra keyword argments for model (e.g., data, family)
Returns:
model: a model that seems to have the smallest AIC
"""
# exog,Konvertieren Sie Endog zwangsweise in das Listenformat
exog = np.r_[[exog]].flatten()
endog = np.r_[[endog]].flatten()
remaining = set(exog)
selected = [] #Faktoren, die die Annahme bestätigten
#Berechnen Sie den AIC nur mit konstantem Term
formula_head = ' + '.join(endog) + ' ~ '
formula = formula_head + '1'
aic = model(formula=formula, **kwargs).fit().aic
print('AIC: {}, formula: {}'.format(round(aic, 3), formula))
current_score, best_new_score = np.ones(2) * aic
#Wenn alle Faktoren übernommen werden oder wenn sich der AIC nicht erhöht, unabhängig davon, welcher Faktor hinzugefügt wird, endet der Prozess.
while remaining and current_score == best_new_score:
scores_with_candidates = []
for candidate in remaining:
#Berechnen Sie den AIC, wenn Sie die verbleibenden Faktoren einzeln addieren
formula_tail = ' + '.join(selected + [candidate])
formula = formula_head + formula_tail
aic = model(formula=formula, **kwargs).fit().aic
print('AIC: {}, formula: {}'.format(round(aic, 3), formula))
scores_with_candidates.append((aic, candidate))
#Der Faktor mit dem kleinsten AIC ist der beste_Kandidat
scores_with_candidates.sort()
scores_with_candidates.reverse()
best_new_score, best_candidate = scores_with_candidates.pop()
#Wenn der AIC aufgrund der Hinzufügung von Kandidatenfaktoren abnimmt, fügen Sie ihn als deterministischen Faktor hinzu.
if best_new_score < current_score:
remaining.remove(best_candidate)
selected.append(best_candidate)
current_score = best_new_score
formula = formula_head + ' + '.join(selected)
print('The best formula: {}'.format(formula))
return model(formula, **kwargs).fit()
Wenn die erklärenden Variablen x und f sind, sieht es so aus.
(Sie können "y" anstelle von ['y'] verwenden.)
Ist es richtig ... ist es richtig ...?
Die Antworten waren genau die gleichen wie in den Kapiteln zur binären Verteilung und logistischen Regression in Midoribon (Einführung in die statistische Modellierung für die Datenanalyse).
Aber wenn Sie einen Fehler machen, lassen Sie es mich bitte wissen.
Recommended Posts