我使用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的,但rollapply
与fastLm
没有。据我所知,例如从HERE和HEREfastLm
基本上调用fastLmPure
,但为什么在第三种方法没有NA? fastLm
有一些额外的功能可以防止我没有发现的NA?
如何包含数据集的样本? – nrussell
拥有MWE看看真的很不错。即使使用简单数据,我也无法让您的前两行工作 – ekstroem
我使用代码示例更新了问题 –