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 <[email protected]
<mailto:[email protected]>>

    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

    [email protected] <mailto:[email protected]>
    skype: lrmpinto
    http://lattes.cnpq.br/2732314327604831




    Em 23 de outubro de 2013 19:56, Rogério Barbosa
    <[email protected] <mailto:[email protected]>> escreveu:

        desculpe, foi um erro. A linha correta é:

        form = y ~ factor(Treat) + factor(block)


        2013/10/23 Luiz Roberto Martins Pinto
        <[email protected] <mailto:[email protected]>>

            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

            [email protected] <mailto:[email protected]>
            skype: lrmpinto
            http://lattes.cnpq.br/2732314327604831




            Em 23 de outubro de 2013 19:24, Rogério Barbosa
            <[email protected] <mailto:[email protected]>> 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 <[email protected]
                <mailto:[email protected]>>

                    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" <[email protected]
                    <mailto:[email protected]>> 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

                        [email protected]
                        <mailto:[email protected]>
                        skype: lrmpinto
                        http://lattes.cnpq.br/2732314327604831




                        Em 23 de outubro de 2013 11:02, Edson Lira
                        <[email protected]
                        <mailto:[email protected]>> 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 <[email protected]
                            <mailto:[email protected]>> 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
                             >
                             > [email protected]
                            <mailto:[email protected]>
                            <mailto:[email protected]
                            <mailto:[email protected]>>
                             > skype: lrmpinto
                             > http://lattes.cnpq.br/2732314327604831
                             >
                             >
                             >
                             >
                             >
                            _______________________________________________
                             > R-br mailing list
                             > [email protected]
                            <mailto:[email protected]>
                             >
                            
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
                            [email protected]
                            <mailto:[email protected]>
                            
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
                            [email protected]
                            <mailto:[email protected]>
                            
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
                        [email protected]
                        <mailto:[email protected]>
                        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
                    [email protected]
                    <mailto:[email protected]>
                    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
                [email protected] <mailto:[email protected]>
                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
            [email protected] <mailto:[email protected]>
            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
        [email protected] <mailto:[email protected]>
        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
    [email protected] <mailto:[email protected]>
    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
[email protected]
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
[email protected]
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.

Responder a