RcppArmadillo的fastLm和fastLmPure函数之间的区别

Difference between fastLm and fastLmPure functions from RcppArmadillo

本文关键字:之间 区别 函数 fastLm RcppArmadillo fastLmPure      更新时间:2023-10-16

下面是一个例子:

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编写的fastLm&fastLmPure函数的链接:

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 出现以及如何实现?

您正在使用两个不同的接口调用两个不同的函数

特别是,fastLm()当通过公式使用时y ~ X将依靠 R 内部(和慢 !!(函数为您创建对应于fastLm(X, y)的向量和矩阵。

下面是一个设置的简单示例:

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> 

这是踢球者:所有方法之间的结果仍然相同,前提是我们对缺失值保持一致