2011-11-14 47 views
4

我正在加快以下算法。我給函數一個xts時間序列,然後想要對前一個X點上的每個時間點進行一次主成分分析(我現在使用500個),然後使用該PCA的結果(5個主成分下面的代碼)來計算一些值。事情是這樣的:加速沒有Rcpp?

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,但是想在這之前讓你們看看。

編輯:謝謝所有的答覆。關於我的數據集/算法的信息:

  1. dim(x.xts)當前= 2000x24。但最終,如果這顯示承諾,它將不得不跑得快(我會給它多個數據集)。
  2. func(x.xts)需要約70秒。這是2000-500 prcomp調用與1500 500x24數據幀創作。

我試圖使用Rprof,看看有什麼是算法中最昂貴的部分,但它使用Rprof所以我需要用這個工具來獲得理解的結果(建議感謝)一些更多的經驗是我的第一次。

我想我會首先嚐試將其轉換爲_apply類型的循環,然後看看並行化。

+1

沒錯,Xapply(X ='s,l,m,t':-))會有所幫助。只有一個想法:除非你現有的'for'循環需要大量的時間完成,否則不要麻煩。 –

+0

當您剖析代碼時,需要花費多少時間?如果大部分時間都花在'prcomp'上,將循環移動到編譯代碼將無濟於事。你有沒有嘗試把循環放在一個函數中,並進行字節編譯? –

+1

或者將函數doit(i,x){...}'寫成循環的內部部分,並使用'parallel :: mclapply((lookback + 1):nrow(x),doit,x)'並行評估(假設R-2.14和非Windows;如果數據不是太大而且你在Windows上,那麼'parallel :: parSapply'和一些額外的代碼可能會工作)。 –

回答

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