ロジスティック回帰モデルの単一の予測に対する各共変量の寄与


8

たとえば、多くの共変量に基づいて患者が特定の疾患を発症する確率を出力するロジスティック回帰モデルがあるとします。

モデルの係数を調べ、オッズ比の変化を考慮することにより、一般的に各共変量の効果の大きさと方向を知ることができます。

一人の患者について、彼または彼女の最大の危険因子/彼または彼女の有利な最大の因子が何であるかを知りたい場合はどうでしょうか。私は特に、患者が実際に何ができるかについて興味があります。

これを行う最良の方法は何ですか?

私が現在検討している方法は、次のRコード(このスレッドから取得)にキャプチャされています。

#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')])

追加で検討することを検討しています

this.student.prediction.list <- this.student.predictors * coef(data.model)

確率の推定値である合計の個々の加数から情報を取得しようとしていますが、その方法はわかりません。

私は見ることができました

  • どの変数が確率推定に最大の絶対的な貢献をし、それらを最大のリスク要因とするか。
  • どの変数が平均比率から最大の量だけ異なるか、すなわち、各変数が確率推定に平均的に寄与する比率を確認し、この特定の観測で最大の量だけこの比率と異なる変数を確認します
  • それらの組み合わせ:平均比率と観測比率の間の絶対差に平均比率で重み付けし、最大の重み付け値を持つ変数を取得します

これらのどれが最も理にかなっていますか?これらのアプローチのいずれかが質問に答える合理的な方法でしょうか?

さらに、確率推定に対する個々の共変量の加法的寄与の信頼区間を取得する方法を知りたいのですが。

回答:


10

predictRで関数を使用できます。これをtype='terms'で呼び出すと、モデルの各項の寄与度(係数と変数値の積)が得られます。これは対数オッズスケールになります。

別のオプションはTkPredict、TeachingDemosパッケージの関数を使用することです。これにより、予測値と予測値の1つとのグラフが表示され、ユーザーがさまざまな予測値の値をインタラクティブに変更して、予測にどのように影響するかを確認できます。


1
私が集めた「用語」の予測は中心にあります。これがどのように行われるか知っていますか?
デイブ2012

4
このpredict.glm関数は関数を呼び出します。この関数にはpredict.lmセクションがあり、切片がある場合、モデル行列の各列は、係数ベクトルが乗算される前に、その平均から差し引かれます。
Greg Snow
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.