Imputação múltipla: como fazer operações com os dados imputados.

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

Lucas, Sugiro qu voce leia o livro “clinical prediction models“ do steyerberg. Sugiro que junto com o mice voce utilize o pacote rms que contem a funçao fit.mult.imput. a partir dessa e possivel utilizar a val.surv que estima algumas medidas de calibraçao e validade com sobrevivencia. Eu fiz uma validaçao de modelos esse ano e acabei fazendo em diversos bancos simulados a partir de um objeto do mice, o que no final ficou parecido com o objeto do fit.mult.imput porque assim nao e possible cirrigir para otimismo por bootstrap com a funçao validate. Mas como voce somente esta interessado em validaçao externa, voce nao precisa estimar o otimismo e fazer as medidas direto dos objetos mice pode ser possivel. Mas para isso voce precisa retirar todas a variaveis que nao entrarao na imputaçao, as que nao sao as variaveis utilizadas na validaçao. Eu nao entendi muito bem se foi isso que vc fez. O mice roda um catatau de regressoes, se tiver pouco dado ou muita variavel ruim pode dar erro. Nao esquece de fazer uns graficos d diagnostico dos missings e das imputaçoes. Pedro Brasil via Android (:)= Em 30/11/2012 09:10, "Lucas Petri Damiani" <lucaspd16@gmail.com> escreveu:
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
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código mínimo reproduzível.

Olá, Pedro. Obrigado pelas dicas. Acabei resolvendo de outras formas menos sofisticadas, pois não tinha tempo, rodei gráficos de diagnóstico e etc. Terminei o trabalho e fui viajar 2 dias depois. Voltei agora e vi sua mensagem. Agora que os prazos estão mais ajustados vou atrás da sua sugestão e te dou um feedback. Eu realmente já retirei as variáveis que não queria que o mice utilizasse na imputação. Porém, não precisava fazer isso. Poderia ajustar a matriz pred para que ele utilizasse apenas algumas variáveis para estimar as outras, enfim. Operacionalmente foi melhor reduzir o banco. Abraços, Lucas
participantes (2)
-
Lucas Petri Damiani
-
Pedro Emmanuel Alvarenga Americano do Brasil