相关疑难解决方法(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
查看次数

lm():LINPACK / LAPACK中QR分解返回的qraux是什么

rich.main3是R中的线性模型。我了解列表的其余元素,但我不知道这qraux是什么。文档指出它是

一个长度为ncol(x)的向量,其中包含有关\ bold {Q}“的附加信息。

这意味着什么附加信息?

str(rich.main3$qr)

qr   : num [1:164, 1:147] -12.8062 0.0781 0.0781 0.0781 0.0781 ...


..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:164] "1" "2" "3" "4" ...
  .. ..$ : chr [1:147] "(Intercept)" "S2" "S3" "x1" ...
  ..- attr(*, "assign")= int [1:147] 0 1 1 2 3 4 5 6 7 8 ...
  ..- attr(*, "contrasts")=List of 3
  .. ..$ S    : chr "contr.treatment"
  .. ..$ ID   : chr "contr.treatment"
  .. ..$ …
Run Code Online (Sandbox Code Playgroud)

regression r matrix linear-regression lm

4
推荐指数
1
解决办法
523
查看次数

R中的QR分解和Choleski分解

我最近读到了如何使用Choleski分解计算QR分解的R矩阵.关系是:

R = Choleski分解(A ^ TA)

例:

> A=matrix(c(1,2,3,2,3,5,1,3,2), nrow=3)
> A
     [,1] [,2] [,3]
[1,]    1    2    1
[2,]    2    3    3
[3,]    3    5    2

> AtA = t(A)%*%A
> AtA
     [,1] [,2] [,3]
[1,]   14   23   13
[2,]   23   38   21
[3,]   13   21   14
Run Code Online (Sandbox Code Playgroud)

现在计算QR和Choleski分解:

> chol(AtA)
         [,1]     [,2]       [,3]
[1,] 3.741657 6.147009  3.4743961
[2,] 0.000000 0.462910 -0.7715167
[3,] 0.000000 0.000000  1.1547005

> qr_A = qr(A)
> qr.R(qr_A)
          [,1]      [,2]       [,3]
[1,] -3.741657 -6.147009 -3.4743961
[2,] …
Run Code Online (Sandbox Code Playgroud)

r linear-algebra decomposition qr-decomposition

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

一次拟合多个公式,比lapply更快的选择?

我有一个要适合数据的公式列表,而不是运行一个循环,出于性能考虑,我想立即执行此操作。估算应该仍然是分开的,我不是要估算SUR或其他任何值。下面的代码做我想要的

x <- matrix(rnorm(300),ncol=3)
y <- x %*% c(1,2,3)+rnorm(100)
formulae <-list(y~x[,1],
                y~x[,2],
                y~x[,1] + x[,2])
lapply(formulae,lm)
Run Code Online (Sandbox Code Playgroud)

不幸的是,formulae随着增加长度的增加,这变得有些慢了,有没有办法真正将其向量化?

如果有帮助,lm我唯一关心的结果就是系数和一些标准误差。

r vectorization lm

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