私は重いRユーザーで、最近はPythonを学んでいます。 statsmodels.apiが複製された機能をどのように処理するかについて質問があります。 私の理解では、この関数はRパッケージのglmのpython版です。だから私は関数が最尤推定値(MLE)を返すことを期待しています。pythonパッケージ内のstatmodels、正確に複製されたフィーチャーはどのように扱われますか?
私の質問は、statsmodelsがMLEを取得するために使用するアルゴリズムですか? 特に、アルゴリズムが重複した機能を持つ状況をどのように処理していますか?
私の質問を明確にするために、ベルヌーイ分布からサイズ50のサンプルを単一の共変量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"]
次にとしてロジスティック回帰にフィット:
## fit logistic regrssion
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()
これは戻します
推定係数がより多くのまたは真の値(= 0.5)にあまり類似しています。 次に、重複列、つまりx2を作成し、ロジスティック回帰モデルに再度適合させます。 (RパッケージのGLM X2のためのNAを返します)
cov["x2"] = cov["x1"]
fit = sm.GLM(resp,cov,family=sm.families.Binomial(sm.families.links.logit)).fit()
fit.summary()
この出力:
は驚くべきことに、これは動作し、X1とX2の係数の推定値は、(= 0.1182)全く同じです。以前のフィットがx1 = 0.2364の係数推定値を返すので、推定値は半分になりました。 は、その後、私は9に重複機能の数を増やし、モデルを当てはめる:予想通り
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()
、各重複変数の推定値は(0.0263)と同じであり、彼らは9倍であるように見えますx1(0.2364)の元の推定値よりも小さい。
このような予期しない最尤推定の動作には驚いています。なぜこれが起こっているのか、そしてstatsmodels.apiの後ろにどのようなアルゴリズムが採用されているのか説明できますか?
デフォルトでは、olsが使用するアルゴリズムをどのように選択しますか?ドキュメントはkwargsに言及していますが、リストには載っていません。 –
したがって、デフォルト最適化アルゴリズムを使用するstatsmodelのGLMの推定値はMLEではありません。 – ThePrincess
@ ThePrincess IRLSは従来の最適化アルゴリズムに過ぎません。推定された平均パラメータは、最尤推定値である。 OLSと同様に、スケールパラメータの推定値はデフォルトで自由度補正を使用しますが、これはMLEにはありません。これは、PoissonまたはBinomialのようにスケールが固定されていない場合のパラメータ推定値のデフォルトの標準誤差にのみ影響します。 – user333700