[R-br] Imputação de dados com processamento paralelo

Pedro Emmanuel Alvarenga Americano do Brasil emmanuel.brasil em gmail.com
Sexta Outubro 16 11:06:30 BRT 2015


Ei vinicius,

Na verdade eu queria mesmo era utilizar a função aregImpute porque estou
acostumado com ela e ela tem algumas opçoes que o mice não tem. Eu simulei
uns dados e tentei rodar alguns exemplos mas ainda não saiu do geito que eu
queria.

data <- data.frame(los = sample(seq(0,45,0.001),5000,T),desfecho.los =
sample(c(0,1),5000,T),sex = sample(c("M","F"),5000,T),BMI=
sample(seq(16,45,0.1),5000,T))
data2$BMI[sample(1:5000,2000)] <- NA

#### sem montar o cluster para computação paralelo
library(rms)
Sys.time()
ini <- Sys.time()
mit2 <- aregImpute(~ los + I(desfecho.los) + I(Age50) + Gender + I(BMI45),
n.impute=5, data=data,tlinear=F)
Sys.time() - ini
Sys.time()

# Com o cluster para computação em paralelo
library(mice)
library(rms)
library(foreach)
library(doParallel)
nCores <- detectCores() -1
cl <- makeCluster(nCores)
clusterSetRNGStream(cl, 51)
registerDoParallel(cl)

Sys.time()
ini <- Sys.time()
mit3 <-
  foreach(no = 1:nCores,
          # .combine = ibind,
          # .export = "mammalsleep",
          .packages = "rms") %dopar%
          {
            aregImpute(~ los + I(desfecho.los) + I(Age50) + Gender +
I(BMI45), n.impute=5, data=data,tlinear=F)
          }
Sys.time() - ini
Sys.time()
stopCluster(cl)

Nos dois exemplos acima a computação no meu dado original demorou cerca de
13 min. Repare que para criar o objeto mit3 eu exclui os argumentos
.combine e .export. Pra falar a verdade eu não consegui entender a partir
da documentação pra que serve esse argumento .export. O mit3 saiu como uma
lista de tres objetos e cada um desses como cinco imputações. Então entendi
eu levei o mesmo tempo pra fazer 3x mais imputações (3 é o numero de cores
que usei). Mas eu gostaria mesmo que a saida fosse uma lista com um unico
objeto com 5 imputações. Então entendi que a função ibind deveria fazer
exatamente isso. Eu tentei usar a função ibind do pacote mice mas retorna
um erro, provavelmente porque essa função só funciona para objetos de
classe mids ou mice. Então acho que agora a questão seria como combinar as
saidas das computações dos diferentes cores. Eu não sei se tem jeito porque
a documentação original do Hmisc::aregImpute não comenta nada a respeito de
computação em paralelo ou de juntar objetos da mesma função.

# para criar um dado completo.
imputed.data <-impute.transcan(mit2, imputation=1, data=data,
list.out=TRUE, pr=FALSE, check=FALSE)
data[names(imputed.data)] <- imputed.data

Se voce puder me dar uma mão ... agradeceria muito.


Pedro Brasil

Em 10 de outubro de 2015 15:58, Daniel Marcelino <dmarcelino em live.com>
escreveu:

> Se o que você entende por imputação em paralelo for simplesmente
> executar alguma função de imputação do tipo MI, MICE , MAR , MCAR
> AMELIA etc em paralelo. Ou seja, repartir o tarefa entre as CPUs, eu
> acredito que bastaria você passar a função dentro de um foreach ou
> parLapply. Por exemplo, usando a base `mammalsleep` do pacote mice
> para gerar 10 tabelas:
>
>
> nCores <- detectCores() -1
> library(foreach)
> library(doParallel)
> cl <- makeCluster(nCores)
> clusterSetRNGStream(cl, 51)
> registerDoParallel(cl)
>
> library(mice)
>
> imp_mice <-
>     foreach(no = 1:nCores,
>             .combine = ibind,
>             .export = "mammalsleep",
>             .packages = "mice") %dopar%
>             {
>                 mice(mammalsleep, m = 10, printFlag = FALSE)
>             }
> stopCluster(cl)
>
> # veja os dados completos:
>  complete(imp_mice)
>
> Você vair querer explorar também o que está armazenado no objeto : imp_mice
> Como:
> imp_mice$method
> imp_mice$data
> imp_mice$m  etc.
>
> D
>
> 2015-10-10 12:28 GMT-03:00 Vinícius Lionel Mateus <vinynegrelli em gmail.com
> >:
> > Olá Pedro,
> >
> > Ainda não precisei trabalhar com computação em paralelo, mas o tema
> > imputação de dados é de grande interesse para mim.
> > Ao ver seu email, me lembrei de um pacote recém desenvolvido, que
> trabalha
> > com séries temporais.
> > Se for seu caso, google " Imputation of missing data in time series for
> air
> > pollutants".
> >
> > O que você almeja com a imputação de dados?
> > Substituir dados abaixo de um threshold (e.g., LOD, LOQ)?
> > Séries temporais?
> >
> > Imputação de dados é um tema bastante extenso.
> > Acho que serie interessante você fornecer mais dicas, a fim de que outros
> > colegas possam colaborar.
> > (Eu vou ficar na torcida, e acompanhando o seu post ;-) )
> >
> > Abs,
> > Vinícius
> >
> > On 10/09/2015 02:32 PM, Pedro Emmanuel Alvarenga Americano do Brasil
> wrote:
> >
> > Amigos de R,
> >
> > Eu estou trabalhando com um banco de dados que possui mais de 220000
> linhas.
> > Eu cheguei numa parte do plano de análise em que imputação multipla será
> > conduzida.
> >
> > Eu já usei a função Hmisc::aregIMpute e mice::mice que considero muito
> boas.
> > O problema é que com essa quantidade de dados pra descobrir que deu um
> erro
> > eu levo de 2h a 8h esperando. Então eu fiz um estrategia de testar em
> bancos
> > menores subsets do principal.
> >
> > Eu procurei por ai e há outros pacotes que fazem imputação mas não
> consegui
> > encontrar qualquer um que possa fazer imputação com computação em
> paralelo.
> >
> > Alguem saberia indicar uma função que faça imputação multipla com
> computação
> > em paralelo?
> >
> > Alguem ja tentou criar um algoritmo de computação em paralelo para fazer
> > imputação multipla com Hmisc::aregImput?
> >
> > Abraço a todos,
> >
> > Pedro Brasil
> >
> >
> > _______________________________________________
> > R-br mailing list
> > R-br em 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.
> >
> >
> > --
> > Best regards,
> >
> > Vinícius Lionel Mateus, MSc (http://lattes.cnpq.br/6501001637020665)
> > Chemistry PhD Student
> > Atmospheric Chemistry Laboratory - Dep. Chemistry
> > PUC-Rio - Pontifical Catholic University of Rio de Janeiro
> > Marquês de São Vicente, 225, Gávea - Rio de Janeiro, RJ - Brazil CEP:
> > 22451-900
> > Phone:        (+45) 26 28 28 51
> >               (+55) (21) 3527-1327
> >               (+55) (21) 993 - 588 - 051
> > Skype: vinicius.lionel
> > http://www.qui.puc-rio.br/index.html
> >
> >
> > _______________________________________________
> > R-br mailing list
> > R-br em 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.
> _______________________________________________
> R-br mailing list
> R-br em 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 fornea cdigo
> mnimo reproduzvel.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20151016/c9d0f269/attachment.html>


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