Contribuição de cada covariável para uma única previsão em um modelo de regressão logística


8

Digamos, por exemplo, que temos um modelo de regressão logística que gera a probabilidade de um paciente desenvolver uma doença específica com base em muitas covariáveis.

Podemos ter uma idéia da magnitude e direção do efeito de cada covariável em geral, examinando os coeficientes do modelo e considerando a mudança no odds ratio.

E se quisermos saber para um único paciente quais são seus maiores fatores de risco / maiores em seu favor. Estou particularmente interessado naquelas sobre as quais o paciente realmente poderia fazer algo.

Qual é a melhor maneira de fazer isso?

A maneira que eu estou considerando atualmente é capturada no seguinte código R (extraído deste encadeamento ):

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

Estou pensando em olhar adicionalmente para

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

e tentando extrair as informações dos adendos individuais da soma que é a estimativa de probabilidade, mas não sei ao certo como fazê-lo.

Eu poderia olhar

  • Quais variáveis ​​fazem a maior contribuição absoluta para a estimativa de probabilidade e as consideram os maiores fatores de risco.
  • Quais variáveis ​​diferem pela maior quantidade de sua proporção média, ou seja, ver qual proporção cada variável contribui para a estimativa de probabilidade em média e quais variáveis ​​diferem dessa proporção pela maior quantidade nesta observação específica
  • Uma combinação destes: ponderar a diferença absoluta entre a proporção média e a proporção observada pela proporção média e considerar essas variáveis ​​com os maiores valores ponderados

Qual destes faz mais sentido? Alguma dessas abordagens seria uma maneira razoável de responder à pergunta?

Além disso, gostaria de saber como obter intervalos de confiança para as contribuições adicionais de covariáveis ​​individuais à estimativa de probabilidade.

Respostas:


10

Você pode usar a predictfunção em R. Chame-a com type='terms'e ela fornecerá a contribuição de cada termo no modelo (o coeficiente multiplicado pelo valor da variável). Isso estará na escala de chances de log.

Outra opção é usar a TkPredictfunção do pacote TeachingDemos. Isso mostrará um gráfico do valor previsto versus um dos preditores e permitirá que o usuário altere interativamente o valor dos vários preditores para ver como isso afeta a previsão.


1
As previsões de "termos", eu entendo, estão centralizadas. Você sabe como isso é feito?
Dave

4
A predict.glmfunção chama a predict.lmfunção, que possui uma seção que, se houver uma interceptação, cada coluna da matriz do modelo terá sua média subtraída antes de ser multiplicada pelo vetor de coeficiente.
Greg neve
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.