ロジスティック回帰で完全な分離に対処する方法は?


163

ターゲット変数のゼロと1を完全に分離する変数がある場合、Rは次の「完全または準完全分離」警告メッセージを生成します。

Warning message:
glm.fit: fitted probabilities numerically 0 or 1 occurred 

モデルは取得できますが、係数の推定値は膨らんでいます。

これを実際にどのように扱いますか?


4
関連の質問
user603

1
関連する質問と正規化に関するデモはこちら
Haitao Du

回答:


100

これに対する解決策は、ペナルティ付き回帰の形式を利用することです。実際、これがペナルティ付き回帰フォームの一部が開発された元の理由です(ただし、他の興味深い特性があることが判明しましたが)。

パッケージglmnetをRにインストールしてロードすると、ほとんどの準備が整いました。glmnetのユーザーフレンドリーではない側面の1つは、これまで使用してきた数式ではなく、マトリックスのみをフィードできることです。ただし、model.matrixなどを見て、data.frameと式からこのマトリックスを構築することができます...

あなたは、この完全な分離は、あなたのサンプルの単なる副産物ではなく、集団で真であることができることを期待していたときに今、あなたは特にありませんこれを処理したい:、単にあなたの結果のための唯一の予測因子として、この分離変数を使用していませんあらゆる種類のモデルを採用しています。


20
また、キャレットパッケージを介してglmnetの数式インターフェイスを使用することもできます。
ザック

「今、あなたが期待するとき...」これに関する質問。ミクロビオームとの関係を調べる症例/対照研究があります。また、ほとんどの場合にのみ見られる治療法もあります。しかし、治療は微生物叢にも影響を与える可能性があると考えています。これは警告の例ですか?仮に私たちが試みた場合、治療を使用しないより多くのケースを見つけることができますが、私たちは持っているものを持っています。
abalter

142

いくつかのオプションがあります:

  1. バイアスの一部を削除します。

    (a)@Nickの提案に従って可能性にペナルティを科す。パッケージlogistf RまたはFIRTHSASの内のオプションPROC LOGISTIC・ファース(1993)で提案された方法を実装し、「最尤推定値のバイアス低減」、Biometrika80、1; これにより、最尤推定値から1次バイアスが削除されます。(ここでは、 @ Gavinがお勧めのbrglmパッケージをお勧めしますが、詳しくありませんが、プロビットなどの非標準的なリンク関数に対して同様のアプローチを実装しています。)

    (b)厳密な条件付きロジスティック回帰で中央値不偏推定値を使用する。RのパッケージelrmまたはlogistiX、またはEXACTSASのステートメントPROC LOGISTIC

  2. 分離の原因となる予測子カテゴリまたは値が発生するケースを除外します。これらはおそらくあなたの範囲外かもしれません。またはさらに焦点を絞った調査に値する。(RパッケージsafeBinaryRegressionは、それらを見つけるのに便利です。)

  3. モデルを再キャストします。通常、これは、サンプルサイズに対して複雑すぎるため、考えた場合に事前に行っていたものです。

    (a)モデルから予測変数を削除します。@サイモンによって与えられた理由で、「あなたは応答を最もよく説明する予測子を削除しています」とDicey 。

    (b)予測子カテゴリを折りたたむ/予測子値をビニングする。これが理にかなっている場合のみ。

    (c)相互作用のない 2つ(またはそれ以上)の交差因子として予測因子を再表現する。これが理にかなっている場合のみ。

  4. @Manoelの提案に従ってベイジアン分析を使用ます。それはあなたがしたいと思いそうにないけどちょうどための分離のため、彼は推奨していますそのほかのmerits.The紙に検討する価値はあるゲルマンら(2008年)、「ロジスティック&他の回帰モデルのための弱い有益デフォルトの事前分布」、アン。適用 統計 2、4:問題のデフォルトのゼロ・スケールの平均値と、各係数のための従来の独立したコーシーで。平均ゼロと標準偏差を持つようにすべての連続予測子を標準化した後に使用します。情報量の多い事前分布を明確にできれば、はるかに優れています。 15212

  5. 何もしない。(ただし、標準誤差のWald推定はひどく間違っているため、プロファイル尤度に基づいて信頼区間を計算します。)しばしば見落とされがちなオプション。モデルの目的が予測変数と応答の関係について学んだことを説明することだけである場合、たとえば2.3以上のオッズ比の信頼区間を引用するのは恥ずべきことではありません。(実際、データで最も適切にサポートされているオッズ比を除外する不偏の推定値に基づいて信頼区間を引用するのは怪しいように思えます。)ポイント推定値を使用して予測しようとすると問題が発生します。

  6. Rousseeuw&Christmann(2003)に記載されているように、隠されたロジスティック回帰モデルを使用し、「ロジスティック回帰における分離及び外れ値に対するロバスト性」、計算統計とデータ分析43、3、及びRパッケージに実装HLR。(@ user603 はこれを提案します。)私は論文を読んでいませんが、彼らは要約で「観察された応答が強く関連しているが観測不可能な真の応答と等しくない少し一般的なモデルが提案されています」と言いますもっともらしく思えない限り、この方法を使用するのは良い考えではないかもしれません。

  7. 「完全に分離している変数の中で、ランダムに選択したいくつかの観測値を1から0または0から1に変更します」:@RobertFのコメント。この提案は、分離を、データ内の情報の不足の兆候ではなく、それ自体が問題であると見なすことから生じるようです。これにより、最尤推定よりも他の方法を好んだり、推論を制限することができます合理的な精度—独自のメリットがあり、分離のための単なる「修正」ではないアプローチ。(とんでもないアドホックであることを除けば、同じデータについて同じ質問をし、同じ仮定を立てるアナリストが、コイントスなどの結果のために異なる答えを出すべきだということは、ほとんどの人にとって好ましくありません。)


1
@Scortchi別の(異端の)オプションがあります。完全に分離している変数の中で、ランダムに選択されたいくつかの観測値を1から0または0から1に変更するのはどうですか?
ロバートF

@RobertF:ありがとう!私はこれについては考えていませんでした-そのパフォーマンスに関する参考文献があれば、感謝します。実際にそれを使用している人に出会ったことがありますか?
スコルチ

@Scortchi-いいえ、完全な分離を排除するために人工データを追加する研究者への参照がありますが、データの選択的変更に関する記事は見つかりませんでした。この方法がどれほど効果的かはわかりません。
ロバートF

1
@tatami:すべての(多くの?)プログラムが分離自体について警告するわけではありません。いくつかの変数の線形結合上にある場合、それを見つけるのは難しいかもしれませんが、収束失敗および/または近似値がゼロまたは1に近い-私はこれらを常に確認してください。
スコルチ

2
@Scortchi:あなたの答えにはとてもいい要約があります。個人的にはベイジアンアプローチを好みますが、projecteuclid.org / euclid.ejs / 1239716414の頻繁な観点から一般的な現象の美しい分析に言及する価値があります。著者は、ロジスティック回帰で完全な分離がある場合でも使用できる片側信頼区間を提供しています。
シアン

55

これはScortchiとManoelの回答を拡張したものですが、RIを使用しているように見えるので、コードを提供すると思います。:)

あなたの問題に対する最も簡単で最も簡単な解決策は、Gelman et al(2008)によって提案された非有益な事前仮定を用いたベイズ分析を使用することだと思います。Scortchiが言及しているように、ゲルマンは各係数に中央値0.0およびスケール2.5のコーシー事前分布を置くことを推奨しています(平均0.0およびSD 0.5に正規化)。これにより、係数が正規化され、わずかにゼロになります。この場合、まさにあなたが望むものです。非常に広いテールを持っているため、コーシーはまだ大きな係数を可能にします(短いテールのノーマルとは対照的に)、Gelmanから:

ここに画像の説明を入力してください

この分析を実行する方法は?この分析を実装bayesglmするarmパッケージの関数を使用してください!

library(arm)

set.seed(123456)
# Faking some data where x1 is unrelated to y
# while x2 perfectly separates y.
d <- data.frame(y  =  c(0,0,0,0, 0, 1,1,1,1,1),
                x1 = rnorm(10),
                x2 = sort(rnorm(10)))

fit <- glm(y ~ x1 + x2, data=d, family="binomial")

## Warning message:
## glm.fit: fitted probabilities numerically 0 or 1 occurred 

summary(fit)
## Call:
## glm(formula = y ~ x1 + x2, family = "binomial", data = d)
##
## Deviance Residuals: 
##       Min          1Q      Median          3Q         Max  
## -1.114e-05  -2.110e-08   0.000e+00   2.110e-08   1.325e-05  
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)
## (Intercept)    -18.528  75938.934       0        1
## x1              -4.837  76469.100       0        1
## x2              81.689 165617.221       0        1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1.3863e+01  on 9  degrees of freedom
## Residual deviance: 3.3646e-10  on 7  degrees of freedom
## AIC: 6
## 
## Number of Fisher Scoring iterations: 25

うまく動作しません...今ベイジアン版:

fit <- bayesglm(y ~ x1 + x2, data=d, family="binomial")
display(fit)
## bayesglm(formula = y ~ x1 + x2, family = "binomial", data = d)
##             coef.est coef.se
## (Intercept) -1.10     1.37  
## x1          -0.05     0.79  
## x2           3.75     1.85  
## ---
## n = 10, k = 3
## residual deviance = 2.2, null deviance = 3.3 (difference = 1.1)

とても簡単ですね

参照資料

Gelman et al(2008)、「ロジスティックおよびその他の回帰モデルの弱く有益なデフォルト事前分布」、アン。適用 統計情報、2、4 http://projecteuclid.org/euclid.aoas/1231424214


6
いいえ。単純すぎます。あなたが今やったことを説明できますか?bayesglm使用する事前条件は何ですか?ML推定がフラットな事前分布をもつベイジアンに等しい場合、ここで非情報的事前分布はどのように役立ちますか?
StasK

5
さらに情報を追加しました!事前はあいまいですが、フラットではありません。推定値を正規化し、わずかに0.0に近づけるので、ある程度の影響があります。
ラスマスバース2014

> m = bayesglm(match〜。、family = binomial(link = 'logit')、data = df)警告メッセージ:数値的に当てはめられた確率0または1が発生しました 良くありません!
クリス

スターターとして、増加によりわずかに強い正則を試しprior.dfにどのデフォルトを1.0、および/または減少prior.scaleしたデフォルト2.5、おそらくしようとして起動しますm=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
ラスマス・バース

1
モデルでprior.dfを増やすとき、私たちは正確に何をしますか。行きたい高さに制限はありますか?私の理解では、それはモデルを制約して、誤差の正確な推定値との収束を可能にしますか?
hamilthj

7

「準完全な分離」の問題に関する最も徹底的な説明の1つは、Paul Allisonの論文です。彼はSASソフトウェアについて書いていますが、彼が扱う問題はどのソフトウェアにも一般化できます:

  • xの線形関数がyの完全な予測を生成できる場合は常に完全な分離が発生します

  • (a)は、いくつかの係数ベクトルが存在する場合、準完全な分離が起こるBようBXI≥0たびYI = 1、及びBXI≤0 * ** = 0 YIたびにこの等式は、各カテゴリ内の少なくとも1つのケースにも当てはまります従属変数。つまり、最も単純な場合、ロジスティック回帰の二項独立変数について、その変数と従属変数によって形成される2×2テーブルにゼロがある場合、回帰係数のML推定値は存在しません。

アリソンは、問題変数の削除、カテゴリの折りたたみ、何もしない、正確なロジスティック回帰の活用、ベイズ推定、ペナルティ付き最尤推定など、すでに言及した多くのソリューションについて説明します。

http://www2.sas.com/proceedings/forum2008/360-2008.pdf


3

推論のロジスティックモデルの場合、最初にここでエラーがないことを強調することが重要です。warningRでは正しく最尤推定量は、パラメータ空間の境界上にあることを通知されます。のオッズ比は、関連性を強く示唆しています。唯一の問題は、検定を生成する2つの一般的な方法であるWald検定とLikelihood ratio検定では、対立仮説の下で情報を評価する必要があるということです。

の線に沿って生成されたデータで

x <- seq(-3, 3, by=0.1)
y <- x > 0
summary(glm(y ~ x, family=binomial))

警告が行われます:

Warning messages:
1: glm.fit: algorithm did not converge 
2: glm.fit: fitted probabilities numerically 0 or 1 occurred 

これは、これらのデータに組み込まれている依存関係を非常に明確に反映しています。

R では、パッケージ内summary.glmまたはパッケージwaldtest内でWaldテストが見つかりlmtestます。尤度比テストは、パッケージ内anovaまたはパッケージlrtest内で実行されlmtestます。どちらの場合も、情報マトリックスは無限に評価され、推論は利用できません。むしろ、R 出力を生成しますが、それを信頼することはできません。これらの場合にRが通常生成する推論には、1に非常に近いp値があります。これは、ORでの精度の損失が、分散共分散行列での精度の損失よりも桁違いに小さいためです。

ここで概説するいくつかのソリューション:

ワンステップ推定器を使用して、

ワンステップ推定量の低バイアス、効率、一般化可能性をサポートする多くの理論があります。Rで1ステップの推定量を指定するのは簡単で、結果は通常、予測と推論に非常に有利です。そして、イテレータ(Newton-Raphson)にはそうする機会がないため、このモデルは決して発散しません!

fit.1s <- glm(y ~ x, family=binomial, control=glm.control(maxit=1))
summary(fit.1s)

与える:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.03987    0.29569  -0.135    0.893    
x            1.19604    0.16794   7.122 1.07e-12 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

そのため、予測がトレンドの方向を反映していることがわかります。そして、推論は、我々が真実であると信じる傾向を非常に示唆しています。

ここに画像の説明を入力してください

スコアテストを実行し、

スコア(またはラオ)統計は、尤度比及びワルド統計と異なります。対立仮説の下での分散の評価は必要ありません。モデルをヌルの下に適合させます。

mm <- model.matrix( ~ x)
fit0 <- glm(y ~ 1, family=binomial)
pred0 <- predict(fit0, type='response')
inf.null <- t(mm) %*% diag(binomial()$variance(mu=pred0)) %*% mm
sc.null <- t(mm) %*% c(y - pred0)
score.stat <- t(sc.null) %*% solve(inf.null) %*% sc.null ## compare to chisq
pchisq(score.stat, 1, lower.tail=F)

関連の尺度として、非常に強い統計的有意性を示します。ワンステップ推定器が50.7の検定統計量を生成し、ここでスコア検定が45.75の検定統計量を生成することに注意してください。χ2

> pchisq(scstat, df=1, lower.tail=F)
             [,1]
[1,] 1.343494e-11

どちらの場合も、無限大のORの推論があります。

、信頼区間の中央値不偏推定値を使用します。

中央値不偏推定を使用して、無限オッズ比の中央値不偏、非特異95%CIを生成できます。epitoolsR のパッケージはこれを行うことができます。そして、この推定器を実装する例をここに示します。ベルヌーイサンプリングの信頼区間


2
これは素晴らしいことですが、私はもちろんいくつかの混乱があります:(1)尤度比テストは情報マトリックスを使用しません。それはWaldテストのみであり、分離があると壊滅的に失敗します。(2)ワンステップ推定器にはまったく慣れていませんが、ここでの勾配の推定はばかげて低いようです。(3)信頼区間は中央値不偏ではありません。そのセクションでリンクしているのは、p中間信頼区間です。(4)LRテストまたはスコアテストを反転することにより、信頼区間を取得できます。...
Scortchi

...(5)関数に引数test="Rao"を与えることにより、Rでスコアテストを実行できanovaます。(まあ、最後の2つはメモであり、
口論

@scortchi anovaにはデフォルトのスコアテストがあります!手作業による実装が便利な場合があります。CIは不偏中央値ではありませんが、不偏中央値推定器のCIは境界パラメータの一貫した推論を提供します。mid pはそのような推定量です。pは、1対1の変換に対して不変なオッズ比b / cに変換できます。LRテストは境界パラメーターについて一貫していますか?
AdamO

スコアとLR検定は有限サンプルで近似されますが、ウィルクスの定理が適用される境界にパラメーターを含めることはできません。帰無仮説のみです。
スコルチ

2

Rからのこの警告メッセージに注意してください。AndrewGelmanによるこのブログ投稿を見てください。これは常に完全な分離の問題ではなく、のバグであることがわかりますglm。開始値が最尤推定値から遠すぎる場合、爆発するようです。そのため、まずStataなどの他のソフトウェアで確認してください。

本当にこの問題がある場合は、有益な事前確率を使用して、ベイジアンモデリングを使用してみてください。

しかし、実際には、トラブルの原因となる予測因子を取り除くだけです。なぜなら、有益な事前情報を選択する方法がわからないからです。しかし、完全な分離問題のこの問題を抱えているときに有益な事前を使用することについて、Gelmanの論文があると思います。Googleで検索してください。たぶんあなたはそれを試してみる必要があります。


8
予測変数を削除する際の問題は、応答を最もよく説明する予測変数を削除することです。これは通常、あなたが目指していることです!これは、たとえば複雑すぎる相互作用をあてはめるなど、モデルをオーバーフィットした場合にのみ意味があると主張します。
サイモンバーン

4
バグではありませんが、最初の見積もりがMLEから離れすぎているという問題であり、自分で選択しようとしない場合は発生しません。
スコルチ

私はこれを理解していますが、これはアルゴリズムのバグだと思います。
マノエルガルディーノ

5
さて、「バグ」の定義について口論したくありません。しかし、ベースRでの振る舞いは計り知れず、修正不可能でもありません。「他のソフトウェアで確認する」必要はありません。多くの非収束問題を自動的に処理する場合、glm2パッケージは各スコアリングステップで尤度が実際に増加することを確認し、そうでない場合はステップサイズを半分にします。
スコルチ

3
(CRANには)このsafeBinaryRegression ような問題を診断および修正するように設計されたRパッケージがあり、最適化方法を使用して分離または準分離があるかどうかを確認します。それを試してみてください!
kjetil bハルヴォルセン16

2

あなたの質問の声明に同意するかどうかはわかりません。

警告メッセージは、データで観測されたXレベルの一部について、近似確率が数値的に0または1であることを意味すると思います。つまり、解像度では、0または1と表示されます。

実行するpredict(yourmodel,yourdata,type='response')と、予測確率として0または1が見つかります。

その結果、結果をそのまま使用しても問題ないと思います。


-1

私はこれが古い投稿であることを理解していますが、私はそれで日々苦労しており、他の人を助けることができるので、私はまだこれに答えることに進みます。

モデルに合わせて選択した変数が0と1、またはyesとnoを非常に正確に区別できる場合、完全な分離が行われます。データサイエンスのアプローチ全体は確率推定に基づいていますが、この場合は失敗します。

修正手順:-

  1. 変数間の分散が低い場合、glm()の代わりにbayesglm()を使用します

  2. bayesglm()とともに(maxit =” some numeric value”)を使用することが役立つ場合があります

3.モデルフィッティング用に選択した変数の3番目の最も重要なチェックは、Y(outout)変数との多重共線性が非常に高い変数である必要があり、モデルからその変数を破棄します。

私の場合のように、検証データの解約を予測するための通信解約データがありました。トレーニングデータには、yesとnoを非常に区別できる変数がありました。それを落とした後、私は正しいモデルを得ることができました。さらに、stepwise(fit)を使用してモデルをより正確にすることができます。


2
この答えが議論に多くを加えるとは思わない。ベイジアンのアプローチは以前の回答で完全にカバーされており、「問題のある」予測子の削除についてもすでに言及されています(推奨されません)。私の知る限り、段階的な変数選択はめったに素晴らしいアイデアではありません。
einar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.