Problemas com split+lapply

Caros listeiros, estou com uma base de dados para a qual preciso calcular médias móveis para dois atributos com relação a certos níveis de fatores. Para isso, pensei em utilizar uma combinação de split+lapply, mas mesmo com apenas pouco mais de 126.000 observações o split do banco de dados leva uma eternidade (um dos fatores possui 1242 níveis). Posteriormente tentei utilizar a função ddply (pacote plyr), mas retorna um erro. Alguma sugestão? Segue um exemplo abaixo (base com menos observações que a original): P<-2000:2010 Rep<-letters[1:5] TF<-1:2 CC<-paste("H-",101:299,sep="") a<-expand.grid(P=P,R=Rep,TF=TF,CC=CC) a$y<-rnorm(nrow(a)) a$z<-runif(nrow(a)) library(zoo) ma.fun<-function(x,k){ mm.y<-rollmean(x$y,k) mm.z<-rollmean(x$z,k) cbind(x[-c(1:2),-c(5:6)],ma.y=c(mm.y),ma.z=c(mm.z)) } # Abordagem 1: Nem chega a completar o split a.1<-split(a,list(a$R,a$TF,a$CC),drop=T) a.2<-lapply(a.1,ma.fun,k=3) # Abodagem 2: Mensagem de erro: # Erro em do.ply(i) : # task 1 failed - "adicionando classe "factor" a um objeto inválido" # Além disso: Mensagens de aviso perdidas: # 1: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’ # # 2: <anonymous>: ... may be used in an incorrect context: ‘.fun(piece, ...)’ library(plyr) library(doSNOW) library(foreach) ncpu<-4 cl<-makeSOCKcluster(rep("localhost",ncpu)) registerDoSNOW(cl) clusterEvalQ(cl,c(library(plyr),library(zoo))) a.2<-ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T) Grato, Rubem

O uso que vc esta' fazendo dos recursos de computacao paralela esta' incorreto. Use apenas: library(plyr) library(doMC) registerDoMC() a.2 <- ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T) Com o conjunto de dados de exemplo q vc deu, eu obtenho:
system.time(a.2<-ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T)) user system elapsed 10.426 2.318 3.933

(Reenviando a resposta, desta vez para a lista tb.) Benilton, Obrigado pela resposta. Acho que eu não fui muito claro, a mensagem de erro que eu postei foi quando tentei rodar para a base original. No exemplo que eu passei o código rodou sem problema. Além disso, não consigo usar o doMC (que depende do multicore) pois estou usando Windows (sem acesso a linux ou mac). De toda forma, ainda acho que leva tempo demais... Grato, Rubem ________________________________ De: Benilton Carvalho <beniltoncarvalho@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br> Enviadas: Segunda-feira, 31 de Outubro de 2011 10:42 Assunto: Re: [R-br] Problemas com split+lapply Por sinal, aumentando o numero de niveis de CC para 1250 e usando o codigo q te mostrei acima: CC <- paste("H-",1:1250,sep="") dim(a)
system.time(a.2 <- ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T)) user system elapsed 65.757 30.706 91.359

entendi.... olhando o fonte do plyr, vejo q seu uso do snow com clusterEvalQ deve-se ao fato de o plyr nao passar os pacotes que precisam ser utilizados para os workers.... entao nao ha mesmo o que corrigir. ao executar o seu codigo original, eu obtenho os warnings, mas nao tenho o erro... O resultado, apesar do warning parece correto... minha impressao eh q o warning deve-se a alguma interacao maluca do plyr com snow... a unica coisa q eu poderia sugerir (nao tenho win para testar) seria trocar: clusterEvalQ(cl,c(library(plyr),library(zoo))) por clusterEvalQ(cl,{library(plyr); library(zoo)}) ou clusterEvalQ(cl,library(plyr)) clusterEvalQ(cl,library(zoo)) b 2011/10/31 Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br>:
(Reenviando a resposta, desta vez para a lista tb.) Benilton, Obrigado pela resposta. Acho que eu não fui muito claro, a mensagem de erro que eu postei foi quando tentei rodar para a base original. No exemplo que eu passei o código rodou sem problema. Além disso, não consigo usar o doMC (que depende do multicore) pois estou usando Windows (sem acesso a linux ou mac). De toda forma, ainda acho que leva tempo demais... Grato, Rubem ________________________________ De: Benilton Carvalho <beniltoncarvalho@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br> Enviadas: Segunda-feira, 31 de Outubro de 2011 10:42 Assunto: Re: [R-br] Problemas com split+lapply
Por sinal, aumentando o numero de niveis de CC para 1250 e usando o codigo q te mostrei acima:
CC <- paste("H-",1:1250,sep="") dim(a)
system.time(a.2 <- ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T)) user system elapsed 65.757 30.706 91.359
_______________________________________________ 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.
-- Successful people ask better questions, and as a result, they get better answers. (Tony Robbins)

Infelizmente o resultado é o mesmo... Acho que o problema está com a utilização do ddply na minha base. Pelo que pesquisei, utilizando o pacote data.table pode ser que o problema do tempo seja amenizado. Alguém saberia como aplicar ao exemplo que eu passei? Grato, Rubem

Prezados colegas, costumo aprender bastante com os problemas e soluções que surgem na lista, no entanto, respostas do Benilton não estou recebendo e pergunto: Benilton, há a possibilidade de eu estar com problemas de receber respostas via grupo ou vc está respondendo apenas para quem pergunta. Gostaria de receber suas respostas caso não sejam reservadas. Grato pela atenção. Helber 2011/10/31 Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br>
(Reenviando a resposta, desta vez para a lista tb.)
Benilton,
Obrigado pela resposta.
Acho que eu não fui muito claro, a mensagem de erro que eu postei foi quando tentei rodar para a base original. No exemplo que eu passei o código rodou sem problema. Além disso, não consigo usar o doMC (que depende do multicore) pois estou usando Windows (sem acesso a linux ou mac).
De toda forma, ainda acho que leva tempo demais...
Grato, Rubem
------------------------------ *De:* Benilton Carvalho <beniltoncarvalho@gmail.com> *Para:* r-br@listas.c3sl.ufpr.br; Rubem Kaipper Ceratti < rubem_ceratti@yahoo.com.br> *Enviadas:* Segunda-feira, 31 de Outubro de 2011 10:42 *Assunto:* Re: [R-br] Problemas com split+lapply
Por sinal, aumentando o numero de niveis de CC para 1250 e usando o codigo q te mostrei acima:
CC <- paste("H-",1:1250,sep="") dim(a)
system.time(a.2 <- ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T)) user system elapsed 65.757 30.706 91.359
_______________________________________________ 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.

As respostas do Benilton estão sendo enviadas para a lista, é só consultar o nabble que armazena as mensagens, veja http://r-br.2285057.n4.nabble.com/R-br-Problemas-com-split-lapply-td3955596.... Deve ser alguma configuração do meu e-mail, não? À disposição. Walmes. ========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================

Vou verificar, Walmes. Fiquei sem saber o que ocorre, pois recebo os emails de " r-br@listas.c3sl.ufpr.br" sem problemas. Muito grato. Helber 2011/10/31 Walmes Zeviani <walmeszeviani@gmail.com>
As respostas do Benilton estão sendo enviadas para a lista, é só consultar o nabble que armazena as mensagens, veja
http://r-br.2285057.n4.nabble.com/R-br-Problemas-com-split-lapply-td3955596....
Deve ser alguma configuração do meu e-mail, não?
À disposição. Walmes.
========================================================================== Walmes Marques Zeviani LEG (Laboratório de Estatística e Geoinformação, 25.450418 S, 49.231759 W) Departamento de Estatística - Universidade Federal do Paraná fone: (+55) 41 3361 3573 VoIP: (3361 3600) 1053 1173 e-mail: walmes@ufpr.br twitter: @walmeszeviani homepage: http://www.leg.ufpr.br/~walmes linux user number: 531218 ==========================================================================
_______________________________________________ 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.

Helber, confirme que vc nao me colocou na sua lista negra. Rubem, tente o codigo abaixo, que seria como eu faria... No meu computador, para 1250 niveis, eu preciso de cerca de 125sec.... o codigo e' mais lento pq um cluster com SOCK e' menos eficiente... e o custo (tempo) para eu otimizar o codigo interno seria muito alto. ### library(doSNOW) library(foreach) ncpu <- 4 cl <- makeSOCKcluster(rep("localhost",ncpu)) registerDoSNOW(cl) mediaPorGrupo <- function(x, k, grp){ tmp <- subset(x, R==grp$R & CC==grp$CC & TF==grp$TF) nr <- nrow(tmp) cbind(tmp[, c('P', 'R', 'TF', 'CC')], ma.y=as.numeric(filter(tmp$y, rep(1/k, k))), ma.x=as.numeric(filter(tmp$z, rep(1/k, k))))[-c(1, nr),] } P <- 2000:2010 Rep <- letters[1:5] TF <- 1:2 CC <- paste("H-",101:299,sep="") a <- expand.grid(P=P,R=Rep,TF=TF,CC=CC) a$y <- rnorm(nrow(a)) a$z <- runif(nrow(a)) grps <- unique(a[, c('R', 'CC', 'TF')]) system.time(res <- foreach(i=1:nrow(grps), .combine=rbind) %dopar% { mediaPorGrupo(a, 3, grps[i,]) })

Benilton, novamente obrigado pela resposta e tempo. Antes de executar o seu código, porém, eu tentei rodar o seguinte: ## P <- 2000:2010 Rep <- letters[1:5] TF <- 1:2 CC <- paste("H-",101:299,sep="") a <- expand.grid(P=P,R=Rep,TF=TF,CC=CC) a$y <- rnorm(nrow(a)) a$z <- runif(nrow(a)) # Alternativa 3 library(snow) ncpu<-4 cl<-makeSOCKcluster(rep("localhost",ncpu)) clusterEvalQ(cl,library(zoo)) clusterExport(cl,'a') ind<-split(seq(nrow(a)),list(a$R,a$CC,a$TF)) a.2<-parLapply(cl,ind,function(i,k){ cbind(ma.y=c(rep(NA,k-1),rollmean(a$y[i],k)), ma.z=c(rep(NA,k-1),rollmean(a$z[i],k))) },k=3) a.2.1<-cbind(a,do.call(rbind,a.2)) a.2.2<-na.omit(a.2.1) Eu fiz um split dos índices para depois juntar as médias móveis 'a.2' na base 'a'. Tudo vai muito bem até que ao juntar as duas partes, quando para algumas linhas os valores ficam incorretos. Uma outra tentativa foi: ## # Alternativa 4 ma.fun<-function(x,k){ c(rep(NA,k-1),rollmean(x,k)) } library(data.table) a.3<-data.table(a) a.3.1<-a.3[,list(P,y=ma.fun(y,k=3),z=ma.fun(z,k=3)),by=list(R,CC,TF)] a.3.2<-na.omit(a.3.1) Mas na base original tem algumas combinações de níveis inexistentes e dá erro, avisando que estes 'tratamentos' tem comprimento zero. Como eu poderia lidar com isso na função 'ma.fun'? Grato, Rubem

erm... ainda não é isso. Um exemplo do que está acontecendo: ind[[1236]] a[ind[[1236]],] rollmean(a$y[ind[[1236]]],k=3) as.numeric(filter(a$y[ind[[1236]]],rep(1/3,3))) a.2.1[ind[[1236]],] a.3.1[ind[[1236]],] ________________________________ De: Benilton Carvalho <beniltoncarvalho@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br> Enviadas: Terça-feira, 1 de Novembro de 2011 9:28 Assunto: Re: [R-br] Problemas com split+lapply os NAs sao na primeira e ultima posicao.

{Tendo trocado o rollmeans por as.numeric(filter(...,rep(1/k,k)))}
a[ind[[1236]],] P R TF CC y z 5336 2000 a 2 H-149 -0.58980125 0.89245059 5337 2001 a 2 H-149 -0.30313496 0.80465434 5338 2002 a 2 H-149 0.44012483 0.04397054 5339 2003 a 2 H-149 0.69327940 0.92602362 5340 2004 a 2 H-149 0.99503929 0.04675309 5341 2005 a 2 H-149 0.42726631 0.11998856 5342 2006 a 2 H-149 0.79151124 0.62517505 5343 2007 a 2 H-149 0.03419038 0.17260339 5344 2008 a 2 H-149 -1.09881623 0.06194616 5345 2009 a 2 H-149 -1.40466597 0.65221994 5346 2010 a 2 H-149 0.33611981 0.75061715
rollmean(a$y[ind[[1236]]],k=3) [1] -0.15093713 0.27675642 0.70948117 0.70519500 0.73793895 0.41765598 [7] -0.09103821 -0.82309727 -0.72245413
as.numeric(filter(a$y[ind[[1236]]],rep(1/3,3))) [1] NA -0.15093713 0.27675642 0.70948117 0.70519500 0.73793895 [7] 0.41765598 -0.09103821 -0.82309727 -0.72245413 NA
a.2.1[ind[[1236]],] P R TF CC y z ma.y ma.z 5336 2000 a 2 H-149 -0.58980125 0.89245059 NA NA 5337 2001 a 2 H-149 -0.30313496 0.80465434 0.166157683 0.4568073 5338 2002 a 2 H-149 0.44012483 0.04397054 -0.059065996 0.3583828 5339 2003 a 2 H-149 0.69327940 0.92602362 -0.753337620 0.2276365 5340 2004 a 2 H-149 0.99503929 0.04675309 -0.317292642 0.2064822 5341 2005 a 2 H-149 0.42726631 0.11998856 -0.005409283 0.4334700 5342 2006 a 2 H-149 0.79151124 0.62517505 0.922745865 0.5686237 5343 2007 a 2 H-149 0.03419038 0.17260339 0.383932084 0.8054191 5344 2008 a 2 H-149 -1.09881623 0.06194616 0.357232515 0.7202149 5345 2009 a 2 H-149 -1.40466597 0.65221994 0.460484404 0.5946082 5346 2010 a 2 H-149 0.33611981 0.75061715 NA NA
a.3.1[ind[[1236]],] R CC TF P y z [1,] a H-149 2 2000 NA NA [2,] a H-149 2 2001 -0.15093713 0.5803585 [3,] a H-149 2 2002 0.27675642 0.5915495 [4,] a H-149 2 2003 0.70948117 0.3389157 [5,] a H-149 2 2004 0.70519500 0.3642551 [6,] a H-149 2 2005 0.73793895 0.2639722 [7,] a H-149 2 2006 0.41765598 0.3059223 [8,] a H-149 2 2007 -0.09103821 0.2865749 [9,] a H-149 2 2008 -0.82309727 0.2955898 [10,] a H-149 2 2009 -0.72245413 0.4882611 [11,] a H-149 2 2010 NA NA

`a medida q vc se distancia de algo q eu possa rapidamente reproduzir do meu lado, mais dificil fica para eu ajudar. eu nao sei (apesar de poder assumir, o q eu nao quero fazer) de onde vieram a.2.1 ou a.3.1. a similaridade de filter() vs rollmean() e' que o rollmean descarta as observacoes dos extremos, para as quais vc nao obteria estimativas de media movel (isso me lembra q a solucao q passei vai funcionar para k=3 apenas).

a generalizacao da minha solucao eh: library(doSNOW) library(foreach) ncpu <- 4 cl <- makeSOCKcluster(rep("localhost",ncpu)) registerDoSNOW(cl) mediaPorGrupo <- function(x, k, grp){ tmp <- subset(x, R==grp$R & CC==grp$CC & TF==grp$TF) tmp <- cbind(tmp[, c('P', 'R', 'TF', 'CC')], ma.y=as.numeric(filter(tmp$y, rep(1/k, k))), ma.x=as.numeric(filter(tmp$z, rep(1/k, k)))) tmp[complete.cases(tmp),] } P <- 2000:2010 Rep <- letters[1:5] TF <- 1:2 CC <- paste("H-",101:299,sep="") a <- expand.grid(P=P,R=Rep,TF=TF,CC=CC) a$y <- rnorm(nrow(a)) a$z <- runif(nrow(a)) grps <- unique(a[, c('R', 'CC', 'TF')]) system.time(res <- foreach(i=1:nrow(grps), .combine=rbind) %dopar% { mediaPorGrupo(a, 3, grps[i,]) })

a.2.1 e a.3.1 vieram das alternativas 3 e 4 que eu postei (apenas trocando o rollmean pela função com filter). A minha dúvida é no sentido de não entender o porquê de na hora de juntar os dados na alternativa 3 (cbind de 'a' e 'a.2') os valores não batem. Vou testar a sua generalização e ver no que dá. Além disso, se mais alguém que estiver 'assistindo' ó tópico tiver alguma sugestão, esta será bem-vinda. Rubem ________________________________ De: Benilton Carvalho <beniltoncarvalho@gmail.com> Para: r-br@listas.c3sl.ufpr.br; Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br> Enviadas: Terça-feira, 1 de Novembro de 2011 9:58 Assunto: Re: [R-br] Problemas com split+lapply `a medida q vc se distancia de algo q eu possa rapidamente reproduzir do meu lado, mais dificil fica para eu ajudar. eu nao sei (apesar de poder assumir, o q eu nao quero fazer) de onde vieram a.2.1 ou a.3.1. a similaridade de filter() vs rollmean() e' que o rollmean descarta as observacoes dos extremos, para as quais vc nao obteria estimativas de media movel (isso me lembra q a solucao q passei vai funcionar para k=3 apenas).

Ok, Benilton. Enfim rodei o script que vc passou -- levou um tempinho, mas funcionou! Obrigado pela ajuda. Rubem ________________________________ De: Benilton Carvalho <beniltoncarvalho@gmail.com> Para: Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br> Cc: "r-br@listas.c3sl.ufpr.br" <r-br@listas.c3sl.ufpr.br> Enviadas: Terça-feira, 1 de Novembro de 2011 10:47 Assunto: Re: [R-br] Problemas com split+lapply apenas note que assumo que vc nao passara' um data.frame com valores faltantes.

Acho que mudaram alguma configuração. Qdo se dá Reply, a resposta está indo para o usuário, não pra lista. Reply to All vai pra lista. Isto está recorrente a uma semana, acho. []s Leonard de Assis assis <dot> leonard <at> gmail <dot> com Em 31/10/2011 12:41, Helber Freitas escreveu:
Prezados colegas, costumo aprender bastante com os problemas e soluções que surgem na lista, no entanto, respostas do Benilton não estou recebendo e pergunto: Benilton, há a possibilidade de eu estar com problemas de receber respostas via grupo ou vc está respondendo apenas para quem pergunta. Gostaria de receber suas respostas caso não sejam reservadas. Grato pela atenção.
Helber
2011/10/31 Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br <mailto:rubem_ceratti@yahoo.com.br>>
(Reenviando a resposta, desta vez para a lista tb.)
Benilton,
Obrigado pela resposta.
Acho que eu não fui muito claro, a mensagem de erro que eu postei foi quando tentei rodar para a base original. No exemplo que eu passei o código rodou sem problema. Além disso, não consigo usar o doMC (que depende do multicore) pois estou usando Windows (sem acesso a linux ou mac).
De toda forma, ainda acho que leva tempo demais...
Grato, Rubem
------------------------------------------------------------------------ *De:* Benilton Carvalho <beniltoncarvalho@gmail.com <mailto:beniltoncarvalho@gmail.com>> *Para:* r-br@listas.c3sl.ufpr.br <mailto:r-br@listas.c3sl.ufpr.br>; Rubem Kaipper Ceratti <rubem_ceratti@yahoo.com.br <mailto:rubem_ceratti@yahoo.com.br>> *Enviadas:* Segunda-feira, 31 de Outubro de 2011 10:42 *Assunto:* Re: [R-br] Problemas com split+lapply
Por sinal, aumentando o numero de niveis de CC para 1250 e usando o codigo q te mostrei acima:
CC <- paste("H-",1:1250,sep="") dim(a)
> system.time(a.2 <- ddply(a,c('R','CC','TF'),ma.fun,k=3,.parallel=T)) user system elapsed 65.757 30.706 <tel:65.757%C2%A0%2030.706> 91.359
_______________________________________________ R-br mailing list R-br@listas.c3sl.ufpr.br <mailto: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.
_______________________________________________ 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.
participantes (5)
-
Benilton Carvalho
-
Helber Freitas
-
Leonard de Assis
-
Rubem Kaipper Ceratti
-
Walmes Zeviani