Si usted tiene una máquina de múltiples núcleos que hay algunos beneficios del uso de todos los núcleos, por ejemplo usando mclapply
.
> library(multicore)
> M <- matrix(rnorm(40),nrow=20)
> x1 <- apply(M, 2, t.test)
> x2 <- mclapply(1:dim(M)[2], function(i) t.test(M[,i]))
> all.equal(x1, x2)
[1] "Component 1: Component 9: 1 string mismatch" "Component 2: Component 9: 1 string mismatch"
# str(x1) and str(x2) show that the difference is immaterial
Este mini ejemplo muestra que las cosas van según lo planeado. Ahora ampliar:
> M <- matrix(rnorm(1e7), nrow=20)
> system.time(invisible(apply(M, 2, t.test)))
user system elapsed
101.346 0.626 101.859
> system.time(invisible(mclapply(1:dim(M)[2], function(i) t.test(M[,i]))))
user system elapsed
55.049 2.527 43.668
Esto está utilizando 8 núcleos virtuales. Su experiencia puede ser diferente. No es una gran ganancia, pero viene de muy poco esfuerzo.
EDITAR
Si sólo se preocupan por la propia estadística t, extrayendo el campo correspondiente ($statistic
) hace las cosas un poco más rápido, en particular en el caso de varios núcleos:
> system.time(invisible(apply(M, 2, function(c) t.test(c)$statistic)))
user system elapsed
80.920 0.437 82.109
> system.time(invisible(mclapply(1:dim(M)[2], function(i) t.test(M[,i])$statistic)))
user system elapsed
21.246 1.367 24.107
O aún más rápido, calcular el valor de t directamente
my.t.test <- function(c){
n <- sqrt(length(c))
mean(c)*n/sd(c)
}
Entonces
> system.time(invisible(apply(M, 2, function(c) my.t.test(c))))
user system elapsed
21.371 0.247 21.532
> system.time(invisible(mclapply(1:dim(M)[2], function(i) my.t.test(M[,i]))))
user system elapsed
144.161 8.658 6.313
'apply' es una función muy flexible y, por lo tanto, incluye muchas cosas que no necesita en ningún caso en particular. Probablemente codificar la misma lógica manualmente con el bucle 'for' dará un aumento en el rendimiento. – ffriend