相关疑难解决方法(0)

为什么内置的lm功能在R中如此之慢?

我一直认为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)

regression r linear-regression lm

13
推荐指数
2
解决办法
2090
查看次数

如何有效地计算诊断(X%*%求解(A)%*%t(X))而不采用矩阵逆?

我需要以下对角线:

diag(X %*% solve(A) %*% t(X))
Run Code Online (Sandbox Code Playgroud)

其中A是满秩矩阵,X是矩形矩阵.这两个AX稀疏.

我知道发现矩阵的逆是坏的,除非你真的需要它.但是,我无法看到如何重写公式,以便用两个参数solve(A)替换solve,这样线性系统就可以在没有显式反转的情况下得到解决.那可能吗?

algorithm r matrix matrix-inverse

5
推荐指数
1
解决办法
664
查看次数

什么时候“crossprod”比“%*%”更受欢迎,什么时候不是?

当恰好被crossprod(X,Y)优选t(X) %*% Y,当X和Y都是矩阵?文档说

给定矩阵xy作为参数,返回矩阵叉积。这在形式上等同于(但通常略快于)调用t(x) %*% y( crossprod) 或x %*% t(y)( tcrossprod)。

那么什么时候不是更快呢?在网上搜索时,我发现了几个来源,这些来源要么crossprod通常是首选的,应作为默认值使用(例如此处),要么取决于比较结果并无定论。例如,Douglas Bates (2007) 说

请注意,在较新版本的 R 和 BLAS 库(截至 2007 年夏季)中,R%*%能够检测到许多零mm并简化许多操作,因此对于这种稀疏矩阵来说,速度比crossprod当前没有使用的要快得多这样的优化 [...]

那么我应该什么时候使用%*%,什么时候使用crossprod

r matrix blas matrix-multiplication

3
推荐指数
1
解决办法
1973
查看次数