[R-br] Não consigo fazer uma ANOVA com arquivo com 1e+06 registros.

Elias T Krainski eliaskrainski em yahoo.com.br
Quinta Outubro 24 05:50:03 BRST 2013


Pessoal, gostaria de ressaltar algumas coisas...

Ha pelo menos duas formas de obter o quadro de uma anova quando temos 
apenas covariaveis to tipo fator.

1) aplicar formulas de somas de quadrados
2) usar regressao linear

Com a primeira forma, basta-se aplicar algumas formulas e em segundos e 
sem gastar memoria temos o quadro da anova.

Com a segunda forma, precisamos obter a matrix de delineamento, X, que 
tem muitas colunas simplesmente nao cabe na memoria de muitos computadores.

Talvez poderia aproveitar-se da esparcidade dessa matrix... mas ha 
solucoes como biglm ou a solucao por partes implementada no speedglm

'biglm' sozinho nao resolve esse problema num computador com pouca 
memoria :)

 > a <- biglm(form, data=dados.ff)
Error: cannot allocate vector of size 14.9 Gb

A estrategia postada pelo Rogerio (usando biglm), que e' a mesma 
implementada no pacote 'speedglm'. Basicamente o que se faz e' calcular 
a matrizes X'X e X'y como somas de dessas matrizes obtidas com partes 
dos dados. Assim, evita-se construir a matrix X toda de uma vez.

Ainda resta um problema nessa solucao... sorry:
 > anova(biglmfit)
Error in UseMethod("anova") :
   no applicable method for 'anova' applied to an object of class "biglm"
e, se o objetivo e' ter o resumo das coisas num quadro de anova, 
precisamos ainda de mais alguns calculos...

Resumindo:
1) usar formulas de somas de quadrados tomam poucos segundos e nao usa 
muita memoria.
2) speedglm ou biglm step by step demoram minutos e ainda usa muita 
memoria.

Abs,
Elias

On 10/24/2013 01:29 AM, Rogério Barbosa wrote:
> O código abaixo toma partes de  scripts do PDF dos pacotes ff e ffbase.
>
> Eu testei com seus dados  e deu certo. Mas na hora de copiar e colar
> para o e-mail, houve erros... Acho que agora está certo.
> Mas ressalto, isso é só uma regressão linear. Não sei como calcular o
> two-way anova a partir disso.. somente uma anova comum. Mas estou certo
> de que tem jeito...
>
>
> #####################################
>
> require(ff)
> require(ffbase)
> require(biglm)
>
> load("RCBD_Data.Rdata")
>
> dados.ff = as.ffdf(Data)
> rm(Data)
> gc()
>
> form = y ~ factor(Treat) + factor(block)
>
> for (i in chunk(dados.ff, by=25000)){
>    if (i[1]==1){
>      message("first chunk is: ", i[[1]],":",i[[2]])
>      biglmfit <- biglm(form, data=dados.ff[i,,drop=FALSE])
>    }else{
>      message("next chunk is: ", i[[1]],":",i[[2]])
>      biglmfit <- update(biglmfit, dados.ff[i,,drop=FALSE])
>    }
> }
>
> summary(biglmfit)
>
>
> 2013/10/23 Luiz Roberto Martins Pinto <luizroberto.uesc em gmail.com
> <mailto:luizroberto.uesc em gmail.com>>
>
>     Agora deu o seguinte erro...
>
>     Erro em is.data.frame(data) : objeto 'firis' não encontrado
>
>
>     Luiz Roberto Martins Pinto
>     Prof. Pleno/DCET/UESC
>     Laboratório de Estatística Computacional
>     Universidade Estadual de Santa Cruz
>     Ilhéus-Bahia
>
>     luizroberto.uesc em gmail.com <mailto:luizroberto.uesc em gmail.com>
>     skype: lrmpinto
>     http://lattes.cnpq.br/2732314327604831
>
>
>
>
>     Em 23 de outubro de 2013 19:56, Rogério Barbosa
>     <antrologos em gmail.com <mailto:antrologos em gmail.com>> escreveu:
>
>         desculpe, foi um erro. A linha correta é:
>
>         form = y ~ factor(Treat) + factor(block)
>
>
>         2013/10/23 Luiz Roberto Martins Pinto
>         <luizroberto.uesc em gmail.com <mailto:luizroberto.uesc em gmail.com>>
>
>             Rogério,
>
>             Agradeço sua colaboração, e o script enviado.
>
>             O comando form(y ~ factor(Treat) + factor(block)) não foi
>             aceito.
>
>
>
>
>             Luiz Roberto Martins Pinto
>             Prof. Pleno/DCET/UESC
>             Laboratório de Estatística Computacional
>             Universidade Estadual de Santa Cruz
>             Ilhéus-Bahia
>
>             luizroberto.uesc em gmail.com <mailto:luizroberto.uesc em gmail.com>
>             skype: lrmpinto
>             http://lattes.cnpq.br/2732314327604831
>
>
>
>
>             Em 23 de outubro de 2013 19:24, Rogério Barbosa
>             <antrologos em gmail.com <mailto:antrologos em gmail.com>> escreveu:
>
>                 O biglm funciona bem. Apliquei nos dados do Luiz Roberto
>                 e deu certo. Mas é bem lento (a função rxLinMod do
>                 pacote RevoScalerR, do RevolutionR é bemmm mais rápida).
>                 Mas se o negócio é continuar usando o R convencional,
>                 então funciona bem.
>
>                 Segue abaixo o código.
>
>                 Mas a função "aov" não funciona em cima do objeto gerado
>                 pelo biglm (e funciona em cima do lm...)
>
>                 Eu não sei como calcular um two-way anova a partir
>                 desses resultados... mas creio que tem jeito. Aliás...
>                 gostaria muito mesmo de saber como fazê-lo.
>
>                 Ma se o objetivo não envolve diferenciar os quadrados de
>                 regressão entre as variáveis "Treat" e "block", então um
>                 anova simples é facil de calcular -- a partir dos
>                 valores preditos e resíduos.
>
>
>                 abraços,
>                 Rogério
>
>                 #####################################
>
>                 require(ff)
>                 require(ffbase)
>                 require(biglm)
>
>                 load("RCBD_Data.Rdata")
>
>                 dados.ff = as.ffdf(Data)
>                 rm(Data)
>                 gc()
>
>                 form(y ~ factor(Treat) + factor(block))
>
>
>                 for (i in chunk(dados.ff, by=25000)){
>                    if (i[1]==1){
>                      message("first chunk is: ", i[[1]],":",i[[2]])
>                      biglmfit <- biglm(form, data=dados.ff[i,,drop=FALSE])
>                    }else{
>                      message("next chunk is: ", i[[1]],":",i[[2]])
>                      biglmfit <- update(biglmfit, firis[i,,drop=FALSE])
>                    }
>                 }
>
>
>
>
>
>                 2013/10/23 Benilton Carvalho <beniltoncarvalho em gmail.com
>                 <mailto:beniltoncarvalho em gmail.com>>
>
>                     Sugestão completamente sem checar dados: biglm ou
>                     mesmo o biganalytics (sugestão por esse último, já
>                     que o usuário não parece ter RAM suficiente) foram
>                     tentados?
>
>                     On Oct 23, 2013 12:24 PM, "Luiz Roberto Martins
>                     Pinto" <luizroberto.uesc em gmail.com
>                     <mailto:luizroberto.uesc em gmail.com>> wrote:
>
>                         Edson,
>
>                         Agradeço a sugestão.
>                         Vou experimentar.
>                         Abraços,
>                         Luiz Roberto
>
>                         Luiz Roberto Martins Pinto
>                         Prof. Pleno/DCET/UESC
>                         Laboratório de Estatística Computacional
>                         Universidade Estadual de Santa Cruz
>                         Ilhéus-Bahia
>
>                         luizroberto.uesc em gmail.com
>                         <mailto:luizroberto.uesc em gmail.com>
>                         skype: lrmpinto
>                         http://lattes.cnpq.br/2732314327604831
>
>
>
>
>                         Em 23 de outubro de 2013 11:02, Edson Lira
>                         <edinhoestat em yahoo.com.br
>                         <mailto:edinhoestat em yahoo.com.br>> escreveu:
>
>                             Tem um pacote chamado ff que executa a
>                             leitura de arquivos grandes.
>
>                             Transforme seus dados para um arquivo .csv
>                             (caso não seja) e tente a leitura com este
>                             pacote.
>
>                             [  ]'s.
>                             Edson Lira
>                             Estatístico
>                             Manaus-Amazonas
>
>
>                             Em Quarta-feira, 23 de Outubro de 2013 5:35,
>                             Elias T Krainski <eliaskrainski em yahoo.com.br
>                             <mailto:eliaskrainski em yahoo.com.br>> escreveu:
>                             Oi Luiz,
>
>                             O problema e' que vc tem 1000 niveis em cada
>                             um de dois fatores. Como a
>                             funcao aov() usa a funcao lm(), esta monta a
>                             matriz de delineamento, ne
>                             neste caso tem dimensao de um milhao por
>                             1999. Para armazenar essa
>                             matriz vc precisa de 14.9Gb
>
>                             print(object.size(double(1999))*1e6, unit='Gb')
>
>                             Se seu computador tivesse 16Gb de memoria vc
>                             conseguiria fazer
>                             calculando as estatistica suficientes X'X e
>                             X'y. Foi o que eu fiz e
>                             enviei X'X e X'y no seu e-mail. Mas isso
>                             ainda nao 'e a melhor solucao
>                             nesse caso particular.
>
>                             Como vc nao tem fator continuo, e' muito
>                             barato computacionalmente fazer
>                             o quadro de anova calculando as expressoes
>                             de soma de quadrados.
>                             Dessa forma vc consegue montar um quadro de
>                             anova facilmente num
>                             computador com pouca memoria. Note que seu
>                             dado consiste em apenas dois
>                             fatores e uma resposta continua, cada um com
>                             1 milhao de registros. Isso
>                             ocupa apenas 19.2Mb em memoria
>
>                             print(object.size(Data), un='Mb')
>
>                             Veja como montar o quadro de anova:
>
>                             attach(Data)
>                             n <- length(y)
>                             ntr <- c(length(levels(block)),
>                             length(levels(Treat)))
>                             gltot <- n-1
>                             gltra <- ntr - 1
>                             glres <- n - sum(ntr)
>
>                             correcao <- (sum(y)^2)/n
>                             sqtot <- sum(y^2)-correcao
>                             bltot <- tapply(y, block, sum)
>                             trtot <- tapply(y, Treat, sum)
>
>                             sqbl <- sum(bltot^2)/ntr[2] - correcao
>                             sqtr <- sum(trtot^2)/ntr[1] - correcao
>                             sqres <- sqtot - sqbl - sqtr
>
>                             qmbl <- sqbl/gltra[1]
>                             qmtr <- sqtr/gltra[2]
>                             qmres <- sqres/glres
>
>                             fval <- c(qmbl, qmtr)/qmres
>                             pval <- pf(fval, gltra, glres, lower.tail=FALSE)
>
>                             data.frame(gl=c(gltra, glres, gltot),
>                             sqt=c(sqbl, sqtr, sqres, sqtot),
>                                          qm=c(qmbl, qmtr, qmres, NA),
>                                          fval=c(fval, NA, NA),
>                                          pval=c(pval, NA, NA))
>
>
>                             On 10/22/2013 08:13 PM, Luiz Roberto Martins
>                             Pinto wrote:
>                              > Caros companheiros da R-BR.
>                              >
>                              > Não consigo fazer uma ANOVA com arquivo
>                             com 1e+06 registros.
>                              > Então... preciso de ajuda!!!
>                              >
>                              > Dados:
>                              >
>                              > http://www1.datafilehost.com/d/c0d31775
>                              >
>                              > Meu pc
>                              > R for windows 2.15.1(x64)
>                              > 8 Gb de Memo
>                              >
>                              > load('RCBD_Data.Rdata') # Arquivo com
>                             1e+06 registros
>                              >
>                              > m=aov(y~Treat+block,data=Data)
>                              > summary(m)
>                              >
>                              > Mensagem de erro:
>                              >
>                              > Erro: não é possível alocar vetor de
>                             tamanho 14.9 Gb
>                              > Além disso: Mensagens de aviso perdidas:
>                              > 1: In model.matrix.default(mt, mf,
>                             contrasts) :
>                              >    Reached total allocation of 8086Mb:
>                             see help(memory.size)
>                              > 2: In model.matrix.default(mt, mf,
>                             contrasts) :
>                              >    Reached total allocation of 8086Mb:
>                             see help(memory.size)
>                              > 3: In model.matrix.default(mt, mf,
>                             contrasts) :
>                              >    Reached total allocation of 8086Mb:
>                             see help(memory.size)
>                              > 4: In model.matrix.default(mt, mf,
>                             contrasts) :
>                              >    Reached total allocation of 8086Mb:
>                             see help(memory.size)
>                              >
>                              >
>                              > Luiz Roberto Martins Pinto
>                              > Prof. Pleno/DCET/UESC
>                              > Laboratório de Estatística Computacional
>                              > Universidade Estadual de Santa Cruz
>                              > Ilhéus-Bahia
>                              >
>                              > luizroberto.uesc em gmail.com
>                             <mailto:luizroberto.uesc em gmail.com>
>                             <mailto:luizroberto.uesc em gmail.com
>                             <mailto:luizroberto.uesc em gmail.com>>
>                              > skype: lrmpinto
>                              > http://lattes.cnpq.br/2732314327604831
>                              >
>                              >
>                              >
>                              >
>                              >
>                             _______________________________________________
>                              > R-br mailing list
>                              > R-br em listas.c3sl.ufpr.br
>                             <mailto: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
>                             <mailto: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
>                             <mailto: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
>                         <mailto: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
>                     <mailto: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 <mailto: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 <mailto: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 <mailto: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 <mailto: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 forneça código mínimo reproduzível.
>


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