Ajuda para evitar um loop com elegância (agora correto)

Pessoal, Gostaria de evitar um loop no procedimento abaixo da forma mais elegante possível: # R help m <- matrix(runif(24), ncol=3) res <- matrix(0, nrow(m), ncol(m)) mg <- mean(m) # média geral mc <- colMeans(m) # média das colunas mr <- rowMeans (m) # médias das variáveis for (i in 1:nrow(m)) for (j in 1:ncol(m)) res[i,j] <- m[i,j] + mg - mc[j] - mr[i] res Toda ajuda é bem vinda... -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

Pessoal, Uma pequena correção (apenas no comentário) para dar mais clareza m <- matrix(1:24, ncol=3) res <- matrix(0, nrow(m), ncol(m)) mg <- mean(m) # média geral mc <- colMeans(m) # média das colunas mr <- rowMeans (m) # médias das linhas for (i in 1:nrow(m)) for (j in 1:ncol(m)) res[i,j] <- m[i,j] + mg - mc[j] - mr[i] res -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Em 14 de abril de 2012 08:06, Jose Claudio Faria <joseclaudio.faria@gmail.com> escreveu:
Pessoal,
Gostaria de evitar um loop no procedimento abaixo da forma mais elegante possível:
# R help m <- matrix(runif(24), ncol=3) res <- matrix(0, nrow(m), ncol(m)) mg <- mean(m) # média geral mc <- colMeans(m) # média das colunas mr <- rowMeans (m) # médias das variáveis for (i in 1:nrow(m)) for (j in 1:ncol(m)) res[i,j] <- m[i,j] + mg - mc[j] - mr[i] res
Toda ajuda é bem vinda... -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

Pessoal, Desculpem, a anterior fornece uma matriz nula da dimensão de 'm', acabei de observar. A correta é essa: # R help m <- matrix(runif(24), ncol=3) res <- matrix(0, nrow(m), ncol(m)) mg <- mean(m) # média geral mc <- colMeans(m) # média das colunas mr <- rowMeans (m) # médias das linhas for (i in 1:nrow(m)) for (j in 1:ncol(m)) res[i,j] <- m[i,j] + mg - mc[j] - mr[i] res -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Em 14 de abril de 2012 08:11, Jose Claudio Faria <joseclaudio.faria@gmail.com> escreveu:
Pessoal,
Uma pequena correção (apenas no comentário) para dar mais clareza
m <- matrix(1:24, ncol=3) res <- matrix(0, nrow(m), ncol(m)) mg <- mean(m) # média geral mc <- colMeans(m) # média das colunas mr <- rowMeans (m) # médias das linhas for (i in 1:nrow(m)) for (j in 1:ncol(m)) res[i,j] <- m[i,j] + mg - mc[j] - mr[i] res -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
Em 14 de abril de 2012 08:06, Jose Claudio Faria <joseclaudio.faria@gmail.com> escreveu:
Pessoal,
Gostaria de evitar um loop no procedimento abaixo da forma mais elegante possível:
# R help m <- matrix(runif(24), ncol=3) res <- matrix(0, nrow(m), ncol(m)) mg <- mean(m) # média geral mc <- colMeans(m) # média das colunas mr <- rowMeans (m) # médias das variáveis for (i in 1:nrow(m)) for (j in 1:ncol(m)) res[i,j] <- m[i,j] + mg - mc[j] - mr[i] res
Toda ajuda é bem vinda... -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\

sweep(sweep(m, 1, mr), 2, mc)+mg

B, Mais elegante impossível! ;-) Não conhecia a função "sweep"; "scale" tinha resolvido meus problemas básicos até o momento. Estava justamente olhando o código fonte de "scale" (muitas vivas a GPL!!!) e observava que ela chama a "sweep"... nisso chegou sua resposta: muitíssimo obrigado! Ab, -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Em 14 de abril de 2012 08:39, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:
sweep(sweep(m, 1, mr), 2, mc)+mg _______________________________________________ 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.

sweep e' de fato mao na roda... e o legal e' q essa decomposicao via sweep te permite usar matrizes MUITO grandes... 2012/4/14 Jose Claudio Faria <joseclaudio.faria@gmail.com>:
B,
Mais elegante impossível! ;-)
Não conhecia a função "sweep"; "scale" tinha resolvido meus problemas básicos até o momento. Estava justamente olhando o código fonte de "scale" (muitas vivas a GPL!!!) e observava que ela chama a "sweep"... nisso chegou sua resposta: muitíssimo obrigado!
Ab, -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
Em 14 de abril de 2012 08:39, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:
sweep(sweep(m, 1, mr), 2, mc)+mg _______________________________________________ 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.
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.

B, Ok, registradas as alternativas! Estou dando uma estudada em sweep: realmente uma grande pequena função. ;-) O uso dessa nova opção de centralização de matrizes é para ser usado nas novas opções gráficas do pacote bpca (Biplot aplicado aos componentes principais). Sinta-se como parte da autoria... Ab, -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Em 14 de abril de 2012 09:09, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:
sweep e' de fato mao na roda... e o legal e' q essa decomposicao via sweep te permite usar matrizes MUITO grandes...
2012/4/14 Jose Claudio Faria <joseclaudio.faria@gmail.com>:
B,
Mais elegante impossível! ;-)
Não conhecia a função "sweep"; "scale" tinha resolvido meus problemas básicos até o momento. Estava justamente olhando o código fonte de "scale" (muitas vivas a GPL!!!) e observava que ela chama a "sweep"... nisso chegou sua resposta: muitíssimo obrigado!
Ab, -- ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\ Jose Claudio Faria Estatistica UESC/DCET/Brasil joseclaudio.faria at gmail.com ///\\\///\\\///\\\///\\\///\\\///\\\///\\\///\\\
Em 14 de abril de 2012 08:39, Benilton Carvalho <beniltoncarvalho@gmail.com> escreveu:
sweep(sweep(m, 1, mr), 2, mc)+mg _______________________________________________ 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.
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.
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.

Ah... e, nao tao eficaz como minha sugestao inicial (ha' mudancas dentro de f e g que podem tornar o codigo mais rapido), mas apenas para registro, vc pode usar modelos lineares para isso: f = function(m){ y <- as.numeric(m) f1 <- factor(col(m)) f2 <- factor(row(m)) matrix(residuals(lm(y~f1+f2)), nc=3) } g <- function(m){ y <- as.numeric(m) X <- model.matrix(~factor(col(m))+factor(row(m))) b <- solve(crossprod(X), crossprod(X, y)) matrix(y-X%*%b, nc=3) } ref <- function(m){ mg = mean(m) mr = rowMeans(m) mc = colMeans(m) sweep(sweep(m, 1, mr), 2, mc)+mg } set.seed(1) m <- matrix(runif(24), ncol=3) system.time(r0 <- f(m)) system.time(r1 <- g(m)) system.time(refRes <- ref(m)) all.equal(r0, r1) all.equal(r0, refRes) b 2012/4/14 Benilton Carvalho <beniltoncarvalho@gmail.com>:
sweep(sweep(m, 1, mr), 2, mc)+mg
participantes (2)
-
Benilton Carvalho
-
Jose Claudio Faria