相关疑难解决方法(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会耗尽内存?

我试图用R做固定效应线性回归.我的数据看起来像

dte   yr   id   v1   v2
  .    .    .    .    .
  .    .    .    .    .
  .    .    .    .    .
Run Code Online (Sandbox Code Playgroud)

然后我决定通过制作yr一个因子并使用它来做到这一点lm:

lm(v1 ~ factor(yr) + v2 - 1, data = df)
Run Code Online (Sandbox Code Playgroud)

但是,这似乎耗尽了内存.我的因素有20个级别,df有1400万行,大约需要2GB才能存储,我在22 GB专用于这个过程的机器上运行它.

于是我决定尝试的东西的老式方法:为每一个我多年的虚拟变量t1t20这样做:

df$t1 <- 1*(df$yr==1)
df$t2 <- 1*(df$yr==2)
df$t3 <- 1*(df$yr==3)
...
Run Code Online (Sandbox Code Playgroud)

并简单地计算:

solve(crossprod(x), crossprod(x,y))
Run Code Online (Sandbox Code Playgroud)

这没有问题,几乎立即产生答案.

我特别好奇当我能够很好地计算系数时,lm会使内存耗尽吗?谢谢.

memory regression r linear-regression lm

11
推荐指数
5
解决办法
1782
查看次数

如何有效地计算诊断(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
查看次数

是否有简单回归的快速估计(仅具有截距和斜率的回归线)?

该问题涉及机器学习特征选择过程.

我有一个很大的特征矩阵 - 列是主题(行)的特征:

set.seed(1)
features.mat <- matrix(rnorm(10*100),ncol=100)
colnames(features.mat) <- paste("F",1:100,sep="")
rownames(features.mat) <- paste("S",1:10,sep="")
Run Code Online (Sandbox Code Playgroud)

S在不同条件(C)下测量每个受试者()的响应,因此看起来像这样:

response.df <-
data.frame(S = c(sapply(1:10, function(x) rep(paste("S", x, sep = ""),100))),
           C = rep(paste("C", 1:100, sep = ""), 10),
           response = rnorm(1000), stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)

所以我匹配的主题是response.df:

match.idx <- match(response.df$S, rownames(features.mat))
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种快速计算每个特征和响应的单变量回归的方法.

比这更快的东西?:

fun <- function(f){
  fit <- lm(response.df$response ~ features.mat[match.idx,f])
  beta <- coef(summary(fit))
  data.frame(feature = colnames(features.mat)[f], effect = beta[2,1],
             p.val = beta[2,4], stringsAsFactors = F))
  }

res <- do.call(rbind, lapply(1:ncol(features.mat), …
Run Code Online (Sandbox Code Playgroud)

regression r linear-regression lm

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