ロジスティック回帰の予測間隔の計算


20

ロジスティック回帰推定の予測間隔を生成する方法を理解したいと思います。

コレットのモデリングバイナリデータモデリング、第2版p.98-99 の手順に従うことをお勧めしました。この手順を実装してRと比較した後predict.glm、この本は予測区間ではなく信頼区間を計算する手順を示していると思います。

Collettからの手順の実装を、と比較してpredict.glm以下に示します。

知りたいのですが、ここから信頼区間ではなく予測区間を作成する方法を教えてください。

#Derived from Collett 'Modelling Binary Data' 2nd Edition p.98-99
#Need reproducible "random" numbers.
seed <- 67

num.students <- 1000
which.student <- 1

#Generate data frame with made-up data from students:
set.seed(seed) #reset seed
v1 <- rbinom(num.students,1,0.7)
v2 <- rnorm(length(v1),0.7,0.3)
v3 <- rpois(length(v1),1)

#Create df representing students
students <- data.frame(
    intercept = rep(1,length(v1)),
    outcome = v1,
    score1 = v2,
    score2 = v3
)
print(head(students))

predict.and.append <- function(input){
    #Create a vanilla logistic model as a function of score1 and score2
    data.model <- glm(outcome ~ score1 + score2, data=input, family=binomial)

    #Calculate predictions and SE.fit with the R package's internal method
    # These are in logits.
    predictions <- as.data.frame(predict(data.model, se.fit=TRUE, type='link'))

    predictions$actual <- input$outcome
    predictions$lower <- plogis(predictions$fit - 1.96 * predictions$se.fit)
    predictions$prediction <- plogis(predictions$fit)
    predictions$upper <- plogis(predictions$fit + 1.96 * predictions$se.fit)


    return (list(data.model, predictions))
}

output <- predict.and.append(students)

data.model <- output[[1]]

#summary(data.model)

#Export vcov matrix 
model.vcov <- vcov(data.model)

# Now our goal is to reproduce 'predictions' and the se.fit manually using the vcov matrix
this.student.predictors <- as.matrix(students[which.student,c(1,3,4)])

#Prediction:
this.student.prediction <- sum(this.student.predictors * coef(data.model))
square.student <- t(this.student.predictors) %*% this.student.predictors
se.student <- sqrt(sum(model.vcov * square.student))

manual.prediction <- data.frame(lower = plogis(this.student.prediction - 1.96*se.student), 
    prediction = plogis(this.student.prediction), 
    upper = plogis(this.student.prediction + 1.96*se.student))

print("Data preview:")
print(head(students))
print(paste("Point estimate of the outcome probability for student", which.student,"(2.5%, point prediction, 97.5%) by Collett's procedure:"))
manual.prediction
print(paste("Point estimate of the outcome probability for student", which.student,"(2.5%, point prediction, 97.5%) by R's predict.glm:"))    
print(output[[2]][which.student,c('lower','prediction','upper')])

基本的な質問、なぜsqrt(sum(model.vcov * square.student))が標準誤差と見なされるのですか?それは標準偏差ではなく、sqrt(n)で割る必要がありますか?その場合、どのnを使用する必要がありますか。nはモデルの適合に使用しますか、またはnは予測に使用する新しいデータフレームのnです。
ラファエル

回答:


6

0<=y<=1


6
対数空間にある予測の95%の予測間隔を探しています。後でそれを確率空間に変換します。100%の予測間隔は、どの手順にとっても興味深いものではありませんよね?たとえば、線形回帰の100%予測間隔には-InfからInf ...が含まれます。いずれにしても、コードでわかるように、予測間隔は対数オッズ空間で計算され、後で確率空間に変換されます。だから、私の質問は無意味だとは思わない。
カルボカチオン

2
対数オッズは確率に変換でき、確率(または対数オッズ)の信頼区間を計算できます。しかし、予測区間は0または1の応答変数上にあります。結果が0 =死かつ1 =生存の生存である場合、特定の共変量セットで生存する確率を予測し、次の信頼区間を計算できます。その確率。しかし、結果は0/1であり、62%生存している患者を0または1にする必要はないため、可能な予測間隔は0-0、0-1、1-1のみです(これはほとんどの人が信頼区間に固執する理由)。
グレッグスノー

8
応答が二項(同じ条件下で0〜1の集合になる可能性がある)である場合、予測間隔が意味をなす場合があります。
Glen_b

7
ロジスティック回帰とは、あるイベントの確率を回帰変数の関数としてモデル化しようとする確率の回帰です。この設定の予測間隔は、確率スケールまたは対数オッズスケールの間隔として取得されるため、完全なセーンになります。
kjetil bハルヴォルセン

2
@Cesarでは、予測区間の式はYが線について正規分布していると仮定して導出されますが、ロジスティック回帰では正規分布がなく、ベルヌーイまたは二項分布があります。そのページに式を適用すると、信頼区間(既にこれを行うことができます)、または予測区間の定義を満たさない人為的に広げられた信頼区間(元の結果スケールで実際の結果を予測)になります。前述のGlen_bのように、結果が本当に二項分布である場合、予測間隔が意味をなす場合があります。
グレッグスノー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.