这是一个例子:

require(Rcpp)
require(RcppArmadillo)
require(zoo)
require(repmis)

myData <- source_DropboxData(file = "example.csv",
                              key = "cbrmkkbssu5bn96", sep = ",", header = TRUE)

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

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

summary(myCoef) # 80923 NA's

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

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

summary(myCoef2) #  0 NA's

在上面的示例中,第一种使用fastLmPure的方法会在输出中生成NA,而第二种使用fastLm的方法则不会。

这是用R编写的fastLmfastLmPure函数的链接:

https://github.com/RcppCore/RcppArmadillo/blob/master/R/fastLm.R

这是用C++编写的底层fastLm函数的链接:

https://github.com/RcppCore/RcppArmadillo/blob/master/src/fastLm.cpp

从这些链接和RcppArmadillo的文档中,我不知道是什么导致输出差异?为什么第二输出中没有NA?最重要的问题是,哪种例程/代码的一部分阻止了NA在第二种方法中的出现,以及如何实现?

最佳答案

您正在通过两个不同的接口(interface)调用两个不同的函数。

特别地,当通过公式fastLm()使用y ~ X时,它将依靠R内部函数(慢速!!)为您创建一个与fastLm(X, y)相对应的 vector 和矩阵。

这是一个简单的示例,它可以进行设置:

R> data(mtcars)
R> lm(mpg ~ cyl + disp + hp + wt - 1, data=mtcars)

Call:
lm(formula = mpg ~ cyl + disp + hp + wt - 1, data = mtcars)

Coefficients:
    cyl     disp       hp       wt
 5.3560  -0.1206  -0.0313   5.6913

R> fastLm(mpg ~ cyl + disp + hp + wt - 1, data=mtcars)

Call:
fastLm.formula(formula = mpg ~ cyl + disp + hp + wt - 1, data = mtcars)

Coefficients:
      cyl      disp        hp        wt
 5.356014 -0.120609 -0.031306  5.691273
R> fastLm(mtcars[, c("cyl","disp","hp","wt")], mtcars[,"mpg"])

Call:
fastLm.default(X = mtcars[, c("cyl", "disp", "hp", "wt")], y = mtcars[,
    "mpg"])

Coefficients:
      cyl      disp        hp        wt
 5.356014 -0.120609 -0.031306  5.691273
R>

现在让我们在左侧和右侧添加NA。为了便于索引,我们将使用整行:
R> mtcars[7, ] <- NA
R> lm(mpg ~ cyl + disp + hp + wt - 1, data=mtcars)

Call:
lm(formula = mpg ~ cyl + disp + hp + wt - 1, data = mtcars)

Coefficients:
    cyl     disp       hp       wt
 5.3501  -0.1215  -0.0332   5.8281

R> fastLm(mpg ~ cyl + disp + hp + wt - 1, data=mtcars)

Call:
fastLm.formula(formula = mpg ~ cyl + disp + hp + wt - 1, data = mtcars)

Coefficients:
      cyl      disp        hp        wt
 5.350102 -0.121478 -0.033184  5.828065
R> fastLm(na.omit(mtcars[, c("cyl","disp","hp","wt")]), na.omit(mtcars[,"mpg"]))

Call:
fastLm.default(X = na.omit(mtcars[, c("cyl", "disp", "hp", "wt")]),
    y = na.omit(mtcars[, "mpg"]))

Coefficients:
      cyl      disp        hp        wt
 5.350102 -0.121478 -0.033184  5.828065
R>

更重要的是:只要我们对缺失值保持一致,所有方法之间的结果仍然相同。

09-08 09:37