ロジスティック回帰モデルの近似から予測値(Y = 1または0)を取得する


50

クラスのオブジェクトglm(ロジスティック回帰モデルに対応)がありpredict.glm、引数type="response"を使用して与えられた予測確率をバイナリ応答、つまりまたはY = 0に変換したいとします。Rでこれを行う最も速く、最も標準的な方法は何ですか?Y=1Y=0

、再び、私の知る一方でpredict.glm、私は場所を正確にカットオフ値を知らない住んでいる-と私は、これはここに私のメインのつまずきであると思います。P(Yi=1|X^i)

回答:


77

予測された確率が得られたら、どのしきい値を使用するかはユーザー次第です。しきい値を選択して、感度、特異性、またはアプリケーションのコンテキストで最も重要な測定値を最適化できます(より具体的な回答を得るには、ここで追加情報が役立ちます)。ROC曲線や最適な分類に関連するその他の指標を確認することをお勧めします。

編集:この答えをいくらか明確にするために、例を挙げます。本当の答えは、最適なカットオフは、アプリケーションのコンテキストで分類子のどのプロパティが重要であるかに依存するということです。レッツ、観測のための真の値であるI、及びY iの予測クラスです。パフォーマンスの一般的な尺度は次のとおりです。YiiY^i

(1)感度: -が正しくなるように識別されている1つの」の割合。P(Y^i=1|Yi=1)

P(Y^i=0|Yi=0)

P(Yi=Y^i)

(1)は真陽性率とも呼ばれ、(2)は真陰性率とも呼ばれます。

(1,1)

δ=[P(Yi=1|Y^i=1)1]2+[P(Yi=0|Y^i=0)1]2

δ(1,1)

以下は、ロジスティック回帰モデルからの予測を使用して分類するシミュレーション例です。カットオフは、これらの3つの測定のそれぞれでどのカットオフが「最良の」分類器を提供するかを確認するために変化します。この例では、データは3つの予測子を持つロジスティック回帰モデルから取得されます(プロットの下のRコードを参照)。この例からわかるように、「最適な」カットオフは、これらの測定値のどれが最も重要かによって異なります。これは完全にアプリケーションに依存します。

P(Yi=1|Y^i=1)P(Yi=0|Y^i=0)

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

# data y simulated from a logistic regression model 
# with with three predictors, n=10000
x = matrix(rnorm(30000),10000,3)
lp = 0 + x[,1] - 1.42*x[2] + .67*x[,3] + 1.1*x[,1]*x[,2] - 1.5*x[,1]*x[,3] +2.2*x[,2]*x[,3] + x[,1]*x[,2]*x[,3]
p = 1/(1+exp(-lp))
y = runif(10000)<p

# fit a logistic regression model
mod = glm(y~x[,1]*x[,2]*x[,3],family="binomial")

# using a cutoff of cut, calculate sensitivity, specificity, and classification rate
perf = function(cut, mod, y)
{
   yhat = (mod$fit>cut)
   w = which(y==1)
   sensitivity = mean( yhat[w] == 1 ) 
   specificity = mean( yhat[-w] == 0 ) 
   c.rate = mean( y==yhat ) 
   d = cbind(sensitivity,specificity)-c(1,1)
   d = sqrt( d[1]^2 + d[2]^2 ) 
   out = t(as.matrix(c(sensitivity, specificity, c.rate,d)))
   colnames(out) = c("sensitivity", "specificity", "c.rate", "distance")
   return(out)
}

s = seq(.01,.99,length=1000)
OUT = matrix(0,1000,4)
for(i in 1:1000) OUT[i,]=perf(s[i],mod,y)
plot(s,OUT[,1],xlab="Cutoff",ylab="Value",cex.lab=1.5,cex.axis=1.5,ylim=c(0,1),type="l",lwd=2,axes=FALSE,col=2)
axis(1,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
axis(2,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
lines(s,OUT[,2],col="darkgreen",lwd=2)
lines(s,OUT[,3],col=4,lwd=2)
lines(s,OUT[,4],col="darkred",lwd=2)
box()
legend(0,.25,col=c(2,"darkgreen",4,"darkred"),lwd=c(2,2,2,2),c("Sensitivity","Specificity","Classification Rate","Distance"))

2
(+1)とてもいい答えです。私は例が好きです。あなたが与えたユークリッド距離の使用を動機付けるために知っている準備ができた解釈はありますか?また、この文脈で、ロジスティックモデルの切片推定値を事後的に変更することにより、ROC曲線が本質的に得られることを指摘するのも興味深いと思います。
枢機

@Cardinal、私は、バイナリ分類のための閾値は、多くの場合、(1,1)に最も近いROC曲線上のどの点に基づいて選択されていることを知っている-ユークリッド距離が私の例では、任意の「距離」のデフォルト定義だった
マクロ

そうですか。私は見ていなかった基礎となるモデルの観点からこの量の直感的な解釈があるかもしれないと思った。(多分あります[?])
枢機

δ

R
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.