[R-br] Imputação múltipla: como fazer operações com os dados imputados.

Lucas Petri Damiani lucaspd16 em gmail.com
Sexta Novembro 30 10:10:19 BRST 2012


Boa noite,

sou leitor assíduo da lista, embora nunca tenha participado das discussões.
Porém, hoje vou me arriscar e passar um problema pra vcs. Espero que possam
me ajudar.

Estou realizando uma análise num banco de dados de cerca de 10 mil
pacientes de Trauma. O objetivo da pesquisadora é testar a validade de um
escore de gravidade (preditor de sobrevida) em pacientes que entram no
pronto socorro e eventualmente promover alterações nesse escore. Porém,
algumas medidas que ela deseja testar possuem cerca de 20% de missing. E a
exclusão desses pacientes faz com que o novo escore predito fique um bocado
diferente do original, o que me fez ir atrás de alternativas para tratar
esses dados faltantes e assim me arrisquei nesse pacote *mice. *Em testes
mais simples que fiz, fiquei bastante empolgado com o método. Enfim, tentei
reproduzir abaixo o problema que encontrei.

##### Banco de dados de exemplo:
dados <- matrix(c(
  4, 6, 5, 34, 120, 5, 1, 0,
  NA, 1, 1, 3, 80, 6, 0, 1,
  2, 4, 2, 24, 90, 5, 1, 1,
  3, 5, 5, 5, 98, 5, 1, 1,
  NA, 6, 5, 40, 94, 4, 0, 0 ,
  NA, 6, 5, 12, 87, 3, 0, 1,
  1, 5, NA, 32, 70, 2, 0, 1,
  1, 5, 1, 7, 60, 3, 1, 0,
  2, NA, 2, 25, 80, 5, 1, 0,
  4, 6, 5, 24, 101, 7, 1, 0,
  1, 5, 1, 1, 120, 8, 1, 0,
  3, 5, 3, 12, 200, 6, 0, 1,
  3, 3, 1, 3, 40, 5, 1, 0,
  NA, 5, 1, 35, 60, 4, 0, 1,
  1, 4, 1, 32, 87, 3, 1, 0,
  4, 5, 1, 23, 30, 2, 1, 1,
  2, 1, 1, 5, 46, 1, 0,1), byrow=T, ncol=8)
dados <- as.data.frame(dados)
colnames(dados) <- c("ECGL_AO", "ECGL_MRM", "ECGL_MRV", "FR", "PAS",
                     "GRAU", "IOT",  "SOBREVIDA")
dados$IOT <- as.factor(dados$IOT)
dados$ECGL <- apply(dados[, c("ECGL_AO", "ECGL_MRV", "ECGL_MRM")],1,sum)
dados$ECGL_cut <- cut(dados$ECGL, breaks=c(3,4,6,9,13,16), right=FALSE)

# Notem que a medida RTS é um escore derivado de outras medidas, que
pretendo imputar.
dados$RTS <- (0.9368*(dados$ECGL_cut=="[4,6)")
       + 2*0.9368*(dados$ECGL_cut=="[6,9)")
       + 3*0.9368*(dados$ECGL_cut=="[9,13)")
       + 4*0.9368*(dados$ECGL_cut=="[13,16)")
       + 0.7326*(dados$PAS>=1 & dados$PAS<=49)
       + 2*0.7326*(dados$PAS>=50 & dados$PAS<=75)
       + 3*0.7326*(dados$PAS>=76 & dados$PAS<=89)
       + 4*0.7326*(dados$PAS>=90)
       + 0.2908*(dados$FR>=1 & dados$FR<=5)
       + 2*0.2908*(dados$FR>=6 & dados$FR<=9)
       + 4*0.2908*(dados$FR>=10 & dados$FR<=29)
       + 3*0.2908*(dados$FR>=30))

#Imputando dados nas variáveis "ECLG":
require(mice)
PRED <- (1 - diag(1, ncol(dados[,1:8])))
PRED[8,1:8] <- PRED[1:8,8] <- 0
teste <- mice(dados[,1:8], method=c("pmm","pmm", "pmm", "", "",
                              "", "", ""),
              seed=15,  predictorMatrix = PRED)

#O meu problema começa agora. Eu não sei como calcular medidas derivadas no
objeto teste. E a fórmula abaixo retorna erro, já conferi várias vezes
muito dos parênteses e etc, mas creio que o problema seja que a fórmula é
muito grande entro da função I(x), pois quando eu reduzo o modelo, eu
consigo resultados satisfatórios. Me corrijam se estiver errado, por favor.
fit_error <- with(teste, glm(SOBREVIDA ~ I(0.9368*((ECGL_AO + ECGL_MRV +
ECGL_MRM) >= 4) & ((ECGL_AO + ECGL_MRV + ECGL_MRM) <= 5)
                                     + 2*0.9368*(((ECGL_AO + ECGL_MRV +
ECGL_MRM) >= 6) & ((ECGL_AO + ECGL_MRV + ECGL_MRM) <= 8))
                                     + 3*0.9368*I(((ECGL_AO + ECGL_MRV +
ECGL_MRM) >= 9) & ((ECGL_AO + ECGL_MRV + ECGL_MRM) <= 12))
                                     + 4*0.9368*I(((ECGL_AO + ECGL_MRV +
ECGL_MRM) >= 13) & ((ECGL_AO + ECGL_MRV + ECGL_MRM) <= 15))
                                     + 0.7326*I(PAS>=1 & PAS<=49)
                                     + 2*0.7326*I(PAS>=50 & PAS<=75)
                                     + 3*0.7326*I(PAS>=76 & PAS<=89)
                                     + 4*0.7326*I(PAS>=90)
                                     + 0.2908*I(FR>=1 & FR<=5)
                                     + 2*0.2908*I(FR>=6 & FR<=9)
                                     + 4*0.2908*I(FR>=10 & FR<=29)
                                     + 3*0.2908*I(FR>=30)) + IOT,
                         family="binomial"))
#Enfim, gostaria de rodar algo como isso escrito abaixo, mas não sei como
definir essa variável RTS dentro do arquivo teste.
fit <- with(teste, glm(SOBREVIDA ~ RTS + IOT,
                       family="binomial"))
fit2 <- glm(SOBREVIDA ~ RTS + IOT,
            family="binomial", data=dados)
pool(fit)
# Uma saída que imagino é gerar os cinco bancos imputados através da função
"complete(teste, m)" e ajustar a regressão. Mas dessa forma não posso
utilizar a função *pool. *Teria que reprogramá-la. De qualquer forma, estou
perdido. Qualquer ideia é bem vinda.

Abraços,
Lucas Petri Damiani
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20121130/a94f64a1/attachment.html>


Mais detalhes sobre a lista de discussão R-br