RcppArmadillo的fastLm和fastLmPure函数之间的区别
Difference between fastLm and fastLmPure functions from RcppArmadillo
下面是一个例子:
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>
这是踢球者:所有方法之间的结果仍然相同,前提是我们对缺失值保持一致。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?