我尝试做的最简单示例:
dX_i <- rnorm(100, 0, 0.0002540362)
p_vec <- seq(0, 1, 0.25)
gamma_vec <- seq(1, 2, 0.25)
a_vec <- seq(2, 6, 1)
sigma_hat_vec <- c(0.03201636, 0.05771143, 0.07932116, 0.12262327, 0.15074560)
delta_j_vec <- c(0.0000005850109, 0.0000011700217, 0.0000017550326, 0.0000035100651, 0.0000052650977)
parameters <- expand.grid("p" = p_vec, "gamma" = gamma_vec, "a" = a_vec, "sigma_hat" = sigma_hat_vec, "delta_j" = delta_j_vec)
result <- sapply(1:nrow(parameters), function(x) {
tmp <- parameters[x,]
p <- tmp$p
a <- tmp$a
gamma <- tmp$gamma
sigma_hat <- tmp$sigma_hat
delta_j <- tmp$delta_j
B <- sum( (abs(dX_i)^p) * ( abs(dX_i) < gamma * a * sigma_hat * delta_j^(1/2) ))
return(B)
})
目标:根据所有组合的p、a、gamma、sigma_hat和delta_j,在向量dX上计算B。
但实际情况是,网格“parameters”有大约60万行,“dX_i”的长度为大约80k。此外,我有一个包含约1000个“dX_i”的列表。因此,我希望尽可能高效地进行这个计算。其他方法,例如将“parameters”转换为data.table并在该数据表中运行sapply,并没有给出速度提升。
我尝试了并行化函数(受限于在虚拟Windows机器上运行脚本)。
cl <- makePSOCKcluster(numCores)
num.iter <- 1:nrow(parameters)
parSapply(cl, num.iter, function(x, parameters, dX_i) {
tmp <- parameters[x,]
p <- tmp$p
a <- tmp$a
gamma <- tmp$gamma
sigma_hat <- tmp$sigma_hat
delta_j <- tmp$delta_j
sum( (abs(dX_i)^p) * ( abs(dX_i) < gamma * a * sigma_hat * delta_j^(1/2) ))
}, parameters, dX_i)
stopCluster(cl)
虽然这给了我加速的效果,但我仍然觉得自己没有用最有效的方式解决这个问题,如果有建议,将不胜感激。
optim
或optimx
包。 - Gregor Thomas