我希望加快以下算法的速度。我给函数一个xts时间序列,然后想要对前面X点上的每个时间点执行主成分分析(我现在使用的是500),然后使用该PCA的结果(5个主要成分在以下代码)来计算一些值。像这样:
lookback <- 500
for(i in (lookback+1):nrow(x))
{
x.now <- x[(i-lookback):i]
x.prcomp <- prcomp(x.now)
ans[i] <- (some R code on x.prcomp)
}
我认为这需要我将回顾行复制为列,以便x
类似于cbind(x,lag(x),lag(x,k=2),lag(x,k=3)...lag(x,k=lookback))
,然后在每一行上运行prcomp
?这看起来很昂贵。也许是apply
的一些变体?我愿意看看Rcpp但是想在此之前由你们来管理。
编辑:哇谢谢所有回复。关于我的数据集/算法的信息:
我尝试使用Rprof
查看算法中最昂贵的部分,但这是我第一次使用Rprof
因此我需要更多使用此工具的经验才能获得可理解的结果(感谢您建议)。
我想我会先尝试将其转换为_apply类型循环,然后再看看并行化。
答案 0 :(得分:2)
在我的4核桌面上,如果在合理的时间范围内无法完成,我会使用(未测试)的内容运行块:
library(snowfall)
sfInit(parallel = TRUE, cpus = 4, type = "SOCK")
lookback <- 500
sfExport(list = c("lookback", "x"))
sfLibrary(xts)
output.object <- sfSapply(x = (lookback+1):nrow(x),
fun = function(i, my.object = x, lb = lookback) {
x.now <- my.object[(i-lb):i]
x.prcomp <- prcomp(x.now)
ans <- ("some R code on x.prcomp")
return(ans)
}, simplify = FALSE) # or maybe it's TRUE? depends on what ans is