[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