以下是一个例子:
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
的第二个方法不生成。
以下是指向fastLm
&amp;的链接用{:
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?最重要的问题是什么例程/部分代码阻止NAs在第二种方法中出现以及它是如何实现的?
答案 0 :(得分:3)
您正在使用两个不同的接口调用两个不同的功能。
特别是,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>
以下是踢球者:如果我们对缺失值保持一致,那么所有方法的结果仍然相同。