我一直认为lmR 中的函数非常快,但正如本例所示,使用solve函数计算的闭合解更快.
data<-data.frame(y=rnorm(1000),x1=rnorm(1000),x2=rnorm(1000))
X = cbind(1,data$x1,data$x2)
library(microbenchmark)
microbenchmark(
solve(t(X) %*% X, t(X) %*% data$y),
lm(y ~ .,data=data))
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下,如果这个玩具示例是一个坏的例子,或者情况lm实际上是慢的吗?
编辑:正如Dirk Eddelbuettel所建议的,由于lm需要解决公式,比较是不公平的,所以更好地使用lm.fit,不需要解决公式
microbenchmark(
solve(t(X) %*% X, t(X) %*% data$y),
lm.fit(X,data$y))
Unit: microseconds
expr min lq mean median uq max neval cld
solve(t(X) %*% X, t(X) %*% data$y) 99.083 108.754 125.1398 118.0305 131.2545 236.060 100 a
lm.fit(X, y) 125.136 136.978 151.4656 143.4915 156.7155 262.114 100 b
Run Code Online (Sandbox Code Playgroud) 我需要以下对角线:
diag(X %*% solve(A) %*% t(X))
Run Code Online (Sandbox Code Playgroud)
其中A是满秩矩阵,X是矩形矩阵.这两个A和X稀疏.
我知道发现矩阵的逆是坏的,除非你真的需要它.但是,我无法看到如何重写公式,以便用两个参数solve(A)替换solve,这样线性系统就可以在没有显式反转的情况下得到解决.那可能吗?
当恰好被crossprod(X,Y)优选t(X) %*% Y,当X和Y都是矩阵?文档说
给定矩阵
x并y作为参数,返回矩阵叉积。这在形式上等同于(但通常略快于)调用t(x) %*% y(crossprod) 或x %*% t(y)(tcrossprod)。
那么什么时候不是更快呢?在网上搜索时,我发现了几个来源,这些来源要么crossprod通常是首选的,应作为默认值使用(例如此处),要么取决于比较结果并无定论。例如,Douglas Bates (2007) 说:
请注意,在较新版本的 R 和 BLAS 库(截至 2007 年夏季)中,R
%*%能够检测到许多零mm并简化许多操作,因此对于这种稀疏矩阵来说,速度比crossprod当前没有使用的要快得多这样的优化 [...]
那么我应该什么时候使用%*%,什么时候使用crossprod?