2016-07-01 3 views
0

Я оцениваю условные предельные плотности и оцениваю их при новых наблюдениях. Затем я ввожу оценки в массив. Этот код медленный, и я не смог значительно ускорить его. Буду признателен за любую оказанную помощь. Вот небольшой воспроизводимый пример:Замена двойного цикла для увеличения скорости

library(sm) 

y <- rep(1:6, 30) 
K <- length(unique(y)) 
X <- matrix(rnorm(180 * 1000), nrow=180) 
newx <- matrix(rnorm(20 * 1000), nrow=20) 

f.estimates <- array(dim=c(dim(newx)[1], dim(X)[2], K - 1)) 
g.estimates <- array(dim=c(dim(newx)[1], dim(X)[2], K - 1)) 
for(k in 1:(K - 1)) { 
    for(j in 1:dim(X)[2]) { 
    f.estimates[, j, k] <- sm.density(X[y <= k, j], 
           eval.points=newx[, j], 
           display="none")$estimate 
    g.estimates[, j, k] <- sm.density(X[y > k, j], 
           eval.points=newx[, j], 
           display="none")$estimate 
    } 
} 
+0

Вы можете заменить внутренний цикл двумя функциями 'sapply'. Это может иметь небольшое увеличение производительности порядка 0,2. Посмотрите, вам, возможно, придется транспонировать полученные матрицы. – lmo

+0

Ваша проблема также может быть выполнена параллельно. Вот хорошая ссылка для начала. Посмотрите на 'foreach'. Вот хороший ресурс http://www.r-bloggers.com/how-to-go-parallel-in-r-basics-tips/. –

ответ

0

Установка:

library(sm) 

y <- rep(1:6, 30) 
K <- length(unique(y)) 
X <- matrix(rnorm(180 * 1000), nrow=180) 
newx <- matrix(rnorm(20 * 1000), nrow=20) 

f.estimates <- array(dim=c(dim(newx)[1], dim(X)[2], K - 1)) 
g.estimates <- array(dim=c(dim(newx)[1], dim(X)[2], K - 1)) 

Использование plyr:

library(plyr) 
cond <- expand.grid(k=1:(K-1), j=1:dim(X)[2]) #conditions, to avoid multiple **ply loops 

f.estimates <- aaply(cond, 1, function(c) sm.density(X[y <= c[,1], c[,2]], 
               eval.points=newx[, c[,2]], 
               display="none")$estimate) 
f.estimates <- aperm(f.estimates, c(3,2,1)) 

g.estimates <- aaply(cond, 1, function(c) sm.density(X[y > c[,1], c[,2]], 
               eval.points=newx[, c[,2]], 
               display="none")$estimate) 
g.estimates <- aperm(g.estimates, c(3,2,1)) 

Использование aperm() переставляет порядок размерности массива, как t() делает для матриц.

Смежные вопросы