
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@gmail.com <mailto:luizroberto.uesc@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@gmail.com <mailto:luizroberto.uesc@gmail.com> skype: lrmpinto http://lattes.cnpq.br/2732314327604831
Em 23 de outubro de 2013 19:56, Rogério Barbosa <antrologos@gmail.com <mailto:antrologos@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@gmail.com <mailto:luizroberto.uesc@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@gmail.com <mailto:luizroberto.uesc@gmail.com> skype: lrmpinto http://lattes.cnpq.br/2732314327604831
Em 23 de outubro de 2013 19:24, Rogério Barbosa <antrologos@gmail.com <mailto:antrologos@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@gmail.com <mailto:beniltoncarvalho@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@gmail.com <mailto:luizroberto.uesc@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@gmail.com <mailto:luizroberto.uesc@gmail.com> skype: lrmpinto http://lattes.cnpq.br/2732314327604831
Em 23 de outubro de 2013 11:02, Edson Lira <edinhoestat@yahoo.com.br <mailto:edinhoestat@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@yahoo.com.br <mailto:eliaskrainski@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@gmail.com <mailto:luizroberto.uesc@gmail.com> <mailto:luizroberto.uesc@gmail.com <mailto:luizroberto.uesc@gmail.com>> > skype: lrmpinto > http://lattes.cnpq.br/2732314327604831 > > > > > _______________________________________________ > 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 <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 <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 <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 <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 <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 <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 <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 <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.