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.