回答:
これに対する解決策は、ペナルティ付き回帰の形式を利用することです。実際、これがペナルティ付き回帰フォームの一部が開発された元の理由です(ただし、他の興味深い特性があることが判明しましたが)。
パッケージglmnetをRにインストールしてロードすると、ほとんどの準備が整いました。glmnetのユーザーフレンドリーではない側面の1つは、これまで使用してきた数式ではなく、マトリックスのみをフィードできることです。ただし、model.matrixなどを見て、data.frameと式からこのマトリックスを構築することができます...
あなたは、この完全な分離は、あなたのサンプルの単なる副産物ではなく、集団で真であることができることを期待していたときに今、あなたは特にありませんこれを処理したい:、単にあなたの結果のための唯一の予測因子として、この分離変数を使用していませんあらゆる種類のモデルを採用しています。
いくつかのオプションがあります:
バイアスの一部を削除します。
(a)@Nickの提案に従って可能性にペナルティを科す。パッケージlogistf RまたはFIRTH
SASの内のオプションPROC LOGISTIC
・ファース(1993)で提案された方法を実装し、「最尤推定値のバイアス低減」、Biometrika、80、1; これにより、最尤推定値から1次バイアスが削除されます。(ここでは、 @ Gavinがお勧めのbrglm
パッケージをお勧めしますが、詳しくありませんが、プロビットなどの非標準的なリンク関数に対して同様のアプローチを実装しています。)
(b)厳密な条件付きロジスティック回帰で中央値不偏推定値を使用する。RのパッケージelrmまたはlogistiX、またはEXACT
SASのステートメントPROC LOGISTIC
。
分離の原因となる予測子カテゴリまたは値が発生するケースを除外します。これらはおそらくあなたの範囲外かもしれません。またはさらに焦点を絞った調査に値する。(RパッケージsafeBinaryRegressionは、それらを見つけるのに便利です。)
モデルを再キャストします。通常、これは、サンプルサイズに対して複雑すぎるため、考えた場合に事前に行っていたものです。
(a)モデルから予測変数を削除します。@サイモンによって与えられた理由で、「あなたは応答を最もよく説明する予測子を削除しています」とDicey 。
(b)予測子カテゴリを折りたたむ/予測子値をビニングする。これが理にかなっている場合のみ。
(c)相互作用のない 2つ(またはそれ以上)の交差因子として予測因子を再表現する。これが理にかなっている場合のみ。
@Manoelの提案に従ってベイジアン分析を使用します。それはあなたがしたいと思いそうにないけどちょうどための分離のため、彼は推奨していますそのほかのmerits.The紙に検討する価値はあるゲルマンら(2008年)、「ロジスティック&他の回帰モデルのための弱い有益デフォルトの事前分布」、アン。適用 統計 、2、4:問題のデフォルトのゼロ・スケールの平均値と、各係数のための従来の独立したコーシーで。平均ゼロと標準偏差を持つようにすべての連続予測子を標準化した後に使用します。情報量の多い事前分布を明確にできれば、はるかに優れています。 1
何もしない。(ただし、標準誤差のWald推定はひどく間違っているため、プロファイル尤度に基づいて信頼区間を計算します。)しばしば見落とされがちなオプション。モデルの目的が予測変数と応答の関係について学んだことを説明することだけである場合、たとえば2.3以上のオッズ比の信頼区間を引用するのは恥ずべきことではありません。(実際、データで最も適切にサポートされているオッズ比を除外する不偏の推定値に基づいて信頼区間を引用するのは怪しいように思えます。)ポイント推定値を使用して予測しようとすると問題が発生します。
Rousseeuw&Christmann(2003)に記載されているように、隠されたロジスティック回帰モデルを使用し、「ロジスティック回帰における分離及び外れ値に対するロバスト性」、計算統計とデータ分析、43、3、及びRパッケージに実装HLR。(@ user603 はこれを提案します。)私は論文を読んでいませんが、彼らは要約で「観察された応答が強く関連しているが観測不可能な真の応答と等しくない少し一般的なモデルが提案されています」と言いますもっともらしく思えない限り、この方法を使用するのは良い考えではないかもしれません。
「完全に分離している変数の中で、ランダムに選択したいくつかの観測値を1から0または0から1に変更します」:@RobertFのコメント。この提案は、分離を、データ内の情報の不足の兆候ではなく、それ自体が問題であると見なすことから生じるようです。これにより、最尤推定よりも他の方法を好んだり、推論を制限することができます合理的な精度—独自のメリットがあり、分離のための単なる「修正」ではないアプローチ。(とんでもないアドホックであることを除けば、同じデータについて同じ質問をし、同じ仮定を立てるアナリストが、コイントスなどの結果のために異なる答えを出すべきだということは、ほとんどの人にとって好ましくありません。)
これは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
bayesglm
使用する事前条件は何ですか?ML推定がフラットな事前分布をもつベイジアンに等しい場合、ここで非情報的事前分布はどのように役立ちますか?
prior.df
にどのデフォルトを1.0
、および/または減少prior.scale
したデフォルト2.5
、おそらくしようとして起動しますm=bayesglm(match ~. , family = binomial(link = 'logit'), data = df, prior.df=5)
「準完全な分離」の問題に関する最も徹底的な説明の1つは、Paul Allisonの論文です。彼はSASソフトウェアについて書いていますが、彼が扱う問題はどのソフトウェアにも一般化できます:
xの線形関数がyの完全な予測を生成できる場合は常に完全な分離が発生します
(a)は、いくつかの係数ベクトルが存在する場合、準完全な分離が起こるBようBXI≥0たびYI = 1、及びBXI≤0 * ** = 0 YIたびにこの等式は、各カテゴリ内の少なくとも1つのケースにも当てはまります従属変数。つまり、最も単純な場合、ロジスティック回帰の二項独立変数について、その変数と従属変数によって形成される2×2テーブルにゼロがある場合、回帰係数のML推定値は存在しません。
アリソンは、問題変数の削除、カテゴリの折りたたみ、何もしない、正確なロジスティック回帰の活用、ベイズ推定、ペナルティ付き最尤推定など、すでに言及した多くのソリューションについて説明します。
推論のロジスティックモデルの場合、最初にここでエラーがないことを強調することが重要です。warning
Rでは正しく最尤推定量は、パラメータ空間の境界上にあることを通知されます。のオッズ比は、関連性を強く示唆しています。唯一の問題は、検定を生成する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の検定統計量を生成することに注意してください。
> pchisq(scstat, df=1, lower.tail=F)
[,1]
[1,] 1.343494e-11
どちらの場合も、無限大のORの推論があります。
中央値不偏推定を使用して、無限オッズ比の中央値不偏、非特異95%CIを生成できます。epitools
R のパッケージはこれを行うことができます。そして、この推定器を実装する例をここに示します。ベルヌーイサンプリングの信頼区間
test="Rao"
を与えることにより、Rでスコアテストを実行できanova
ます。(まあ、最後の2つはメモであり、
Rからのこの警告メッセージに注意してください。AndrewGelmanによるこのブログ投稿を見てください。これは常に完全な分離の問題ではなく、のバグであることがわかりますglm
。開始値が最尤推定値から遠すぎる場合、爆発するようです。そのため、まずStataなどの他のソフトウェアで確認してください。
本当にこの問題がある場合は、有益な事前確率を使用して、ベイジアンモデリングを使用してみてください。
しかし、実際には、トラブルの原因となる予測因子を取り除くだけです。なぜなら、有益な事前情報を選択する方法がわからないからです。しかし、完全な分離問題のこの問題を抱えているときに有益な事前を使用することについて、Gelmanの論文があると思います。Googleで検索してください。たぶんあなたはそれを試してみる必要があります。
glm2
パッケージは各スコアリングステップで尤度が実際に増加することを確認し、そうでない場合はステップサイズを半分にします。
safeBinaryRegression
ような問題を診断および修正するように設計されたRパッケージがあり、最適化方法を使用して分離または準分離があるかどうかを確認します。それを試してみてください!
私はこれが古い投稿であることを理解していますが、私はそれで日々苦労しており、他の人を助けることができるので、私はまだこれに答えることに進みます。
モデルに合わせて選択した変数が0と1、またはyesとnoを非常に正確に区別できる場合、完全な分離が行われます。データサイエンスのアプローチ全体は確率推定に基づいていますが、この場合は失敗します。
修正手順:-
変数間の分散が低い場合、glm()の代わりにbayesglm()を使用します
bayesglm()とともに(maxit =” some numeric value”)を使用することが役立つ場合があります
3.モデルフィッティング用に選択した変数の3番目の最も重要なチェックは、Y(outout)変数との多重共線性が非常に高い変数である必要があり、モデルからその変数を破棄します。
私の場合のように、検証データの解約を予測するための通信解約データがありました。トレーニングデータには、yesとnoを非常に区別できる変数がありました。それを落とした後、私は正しいモデルを得ることができました。さらに、stepwise(fit)を使用してモデルをより正確にすることができます。