2015-11-02 69 views
1

我使用R中的滾動迴歸了很多,我的初始設置是一樣的東西:爲什麼RcppArmadillo的fastLmPure會在輸出中產生NA,但fastLm不會?

dolm <- function(x) coef(lm(x[,1] ~ x[,2] + 0, data = as.data.frame(x))) 
rollingCoef = rollapply(someData, 100, dolm) 

上面的例子完美的作品,但它是緩慢的,如果你有很多的迭代。

爲了加快速度,我決定試用Rcpp包。

首先我用lm代替fastLm,結果有點快但是仍然很慢。所以這促使我嘗試在循環中編寫整個滾動迴歸的係數函數,並將它與Rcpp幫助一起整合到R中。

所以我已經改變了原來的RcppArmadillo的功能fastLm這樣:

// [[Rcpp::depends(RcppArmadillo)]] 

#include <RcppArmadillo.h> 

using namespace Rcpp; 

// [[Rcpp::export]] 

List rollCoef(const arma::mat& X, const arma::colvec& y, double window) { 

    double cppWindow = window - 1; 
    double matRows = X.n_rows; 
    double matCols = X.n_cols - 1; 

    arma::mat coef(matRows - cppWindow, X.n_cols); // matrix for estimated coefficients 

    //for loop for rolling regression. 
    for(double i = 0 ; i < matRows - cppWindow ; i++ ) 
    { 
     coef.row(i) = arma::trans(arma::solve(X(arma::span(i,i + cppWindow), arma::span(0,matCols)) , y.rows(i,i + cppWindow))); 
    } 

    return List::create(_["coefficients"] = coef); 
} 

,比它sourceCpp(file=".../rollCoef.cpp")

下載至R所以它比rollapply快得多,它的小例子運行良好,但比我應用它大約20萬觀測數據它產生的NA的一半在輸出,同時rollapply/fastLm組合沒有產生任何。

所以在這裏我需要一些幫助。我的功能有什麼問題?爲什麼在我的函數輸出中有NA,並且在rollapply/fastLm中沒有NA,但是,如果我理解正確,它們都基於arma::solve?任何幫助,高度讚賞。

UPDATE
下面是可重複的代碼:

require(Rcpp) 
require(RcppArmadillo) 
require(zoo) 
require(repmis) 
myData <- source_DropboxData(file = "example.csv", 
           key = "cbrmkkbssu5bn96", sep = ",", header = TRUE) 

## in order to use my custom function "rollCoef" you should download it to R. 
## The c++ code is presented above in the main question. 
## Download it where you want as "rollCoef.cpp" and then download it to R with: 

sourceCpp(file=".../rollCoeff.cpp"). # there should be your actual path. 

myCoef = rollCoef(as.matrix(myData[,2]),myData[,1],260) 

summary(unlist(myCoef)) # 80923 NA's 

dolm = function(x) coef(fastLmPure(as.matrix(x[,2]), x[,1])) 

myCoef2 = rollapply(myData, 260, dolm, by.column = FALSE) 

summary(myCoef2) # 80923 NA's 

dolm2 = function(x) coef(fastLm(x[,1] ~ x[,2] + 0, data = as.data.frame(x))) 

myCoef3 = rollapply(myData, 260, dolm2, by.column = FALSE) 

summary(myCoef3) # !!! No NA's !!! 

head(unlist(myCoef)) ; head(unlist(myCoef2)) ; head(myCoef3) 

所以我的函數的輸出是相同的與rollapply結合RcppArmadillo的fastLmPure的輸出和他們都產生NA的,但rollapplyfastLm沒有。據我所知,例如從HEREHEREfastLm基本上調用fastLmPure,但爲什麼在第三種方法沒有NA? fastLm有一些額外的功能可以防止我沒有發現的NA?

+1

如何包含數據集的樣本? – nrussell

+1

擁有MWE看看真的很不錯。即使使用簡單數據,我也無法讓您的前兩行工作 – ekstroem

+0

我使用代碼示例更新了問題 –

回答

1

整個程序包RcppRoll只能進行自定義滾動 - 您應該能夠擴展它,並且它的rollit()函數也可以滾動lm()

+0

我知道RcppRoll並在某些情況下使用它,但自定義代碼可能會更快,更不用說從編寫自己的代碼中獲得額外的實際好處;) –

相關問題