Contribución de cada covariable a una sola predicción en un modelo de regresión logística

8

Digamos, por ejemplo, que tenemos un modelo de regresión logística que genera la probabilidad de que un paciente desarrolle una enfermedad particular basada en muchas covariables.

Podemos tener una idea de la magnitud y dirección del efecto de cada covariable en general examinando los coeficientes del modelo y considerando el cambio en la razón de posibilidades.

¿Qué sucede si queremos saber para un solo paciente cuáles son sus mayores factores de riesgo / los mayores factores a su favor? Estoy particularmente interesado en aquellos sobre los que el paciente realmente podría hacer algo.

¿Cuál es la mejor manera de hacer esto?

La forma en que estoy considerando actualmente se captura en el siguiente código R (tomado de este hilo ):

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

Estoy considerando mirar adicionalmente

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

y tratando de obtener la información de los sumandos individuales de la suma, que es la estimación de probabilidad, pero no estoy seguro de cómo hacerlo.

Podría mirar

  • Qué variables hacen la mayor contribución absoluta a la estimación de probabilidad y las consideran los mayores factores de riesgo.
  • ¿Qué variables difieren en la mayor cantidad de su proporción media?
  • Una combinación de los mismos: ponderar la diferencia absoluta entre la proporción media y la proporción observada por la proporción media y tomar aquellas variables con los mayores valores ponderados

¿Cuál de estos tiene más sentido? ¿Alguno de estos enfoques sería una forma razonable de responder la pregunta?

Además, me gustaría saber cómo podría obtener intervalos de confianza para las contribuciones aditivas de covariables individuales a la estimación de probabilidad.

Dave
fuente

Respuestas:

10

Puede usar la predictfunción en R. Llámelo con type='terms'y le dará la contribución de cada término en el modelo (el coeficiente multiplicado por el valor de la variable). Esto estará en la escala de probabilidades de registro.

Otra opción es usar la TkPredictfunción del paquete TeachingDemos. Esto mostrará un gráfico del valor pronosticado frente a uno de los predictores, luego le permitirá al usuario cambiar interactivamente el valor de los diversos predictores para ver cómo eso afecta la predicción.

Greg Snow
fuente
1
Las predicciones de "términos", deduzco, están centradas. ¿Sabes cómo se hace esto?
Dave
44
La predict.glmfunción llama a la predict.lmfunción, que tiene una sección que, si hay una intersección, cada columna de la matriz modelo tiene su media restada antes de multiplicarse por el vector de coeficiente.
Greg Snow