我想加快以下算法.我给函数一个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?这看起来很昂贵.也许是一些适用的变种?我愿意看看Rcpp但是想在此之前由你们运行.
编辑:哇谢谢所有的回复.有关我的数据集/算法的信息:
> dim(x.xts)目前= 2000×24.但最终,如果这表明有希望,它将必须快速运行(我会给它多个数据集).
> func(x.xts)需要约70秒.这是2000-500 prcomp调用,1500个500×24数据帧创建.
我试图使用Rprof来查看算法中最昂贵的部分,但这是我第一次使用Rprof,因此我需要更多使用此工具的经验来获得可理解的结果(感谢您的建议).
我想我会首先尝试将其转换为_apply类型循环,然后查看并行化.
最佳答案 在我的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