statmodels im Python-Paket, Wie werden genau duplizierte Features behandelt?

Ich bin ein schwerer R-Benutzer und lerne gerade Python. Ich habe eine Frage dazu, wie statsmodels.api mit doppelten Features umgeht. Nach meinem Verständnis ist diese Funktion eine Python-Version von glm im R-Paket. Ich erwarte also, dass die Funktion die Maximum-Likelihood-Schätzungen (MLE) zurückgibt.

Meine Frage ist, welchen Algorithmus Statistikmodelle verwenden, um MLE zu erhalten? Insbesondere wie geht der Algorithmus mit doppelten Features um?

Um meine Frage zu klären, generiere ich eine Stichprobe der Größe 50 aus der Bernoullie-Verteilung mit einer einzigen Kovariate x1.

import statsmodels.api as sm
import pandas as pd
import numpy as np
def ilogit(eta):
    return 1.0 - 1.0/(np.exp(eta)+1)

## generate samples
Nsample = 50
cov = {}
cov["x1"] = np.random.normal(0,1,Nsample)
cov = pd.DataFrame(cov)
true_value = 0.5
resp = {}
resp["FAIL"] =   np.random.binomial(1, ilogit(true_value*cov["x1"]))
resp = pd.DataFrame(resp)
resp["NOFAIL"] = 1 - resp["FAIL"]

Passen Sie dann die logistische Regression wie folgt an:

## fit logistic regrssion 
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()

Dies gibt zurück:

Der geschätzte Koeffizient entspricht in etwa dem wahren Wert (= 0,5). Dann erstelle ich eine doppelte Spalte, nämlich x2, und passe das logistische Regressionsmodell erneut an. (glm in R-Paket würde NA für x2 zurückgeben)

cov["x2"] = cov["x1"]
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()

Diese Ausgaben:

Überraschenderweise funktioniert dies und die Koeffizientenschätzungen von x1 und x2 sind genau identisch (= 0,1182). Da die vorherige Anpassung die Koeffizientenschätzung von x1 = 0,2364 zurückgibt, wurde die Schätzung halbiert. Dann erhöhe ich die Anzahl der duplizierten Features auf 9 und passe das Modell an:

cov = cov
for icol in range(3,10):
    cov["x"+str(icol)] = cov["x1"]
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()

Wie erwartet sind die Schätzungen für jede duplizierte Variable gleich (0,0263) und sie scheinen 9-mal kleiner zu sein als die ursprüngliche Schätzung für x1 (0,2364).

Ich bin überrascht über dieses unerwartete Verhalten der Maximum-Likelihood-Schätzungen. Können Sie erklären, warum dies geschieht und welche Art von Algorithmen hinter statsmodels.api zum Einsatz kommen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage