[R-br] Ajuda para evitar um loop com elegância (agora correto)

Benilton Carvalho beniltoncarvalho em gmail.com
Sábado Abril 14 09:07:24 BRT 2012


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 em gmail.com>:
> sweep(sweep(m, 1, mr), 2, mc)+mg


Mais detalhes sobre a lista de discussão R-br