使用更少的内存从最小二乘拟合中获取残差

时间:2012-06-19 19:24:22

标签: r least-squares

我使用相同的预测器和大量响应来拟合最小二乘模型,而我所需要的只是残差。 qr.resid函数是我发现的最简单的函数,但它占用的内存超过了必要的内存,因为它内部的Fortran代码会返回一些不必要的东西,这些东西会在qr.resid返回结果之前被丢弃。 / p>

这意味着当响应数量足够大时,我的系统必须开始交换内存,并且需要很长时间才能得到答案。一个接一个地做(在R中有一个循环)会更快,因为它不会交换,但是(可能)比以矢量化方式完成整个事情要慢。

也就是说,当y足够小而不会导致交换时,此版本会更快:

reslsfit1 <- function (x, y) {
  qr.resid(qr(x),y)
}

但是这个版本对于大型y更快,因为它不会交换:

reslsfit2 <- function (x, y) {
  x <- unname(x)
  y <- unname(y)
  out <- matrix(NA, ncol=ncol(y), nrow=nrow(y))
  qrx <- qr(x)
  for(i in 1:ncol(y)) {out[,i] <- qr.resid(qrx, y[,i])}
  out
}

有什么建议吗?我更喜欢使用现有的函数(或者至少是现有的算法)而不是自己编写函数,因为可能存在数值问题。

这是重新创建问题的代码;你必须让你的系统N足够大。

set.seed(5)
n <- 1000
N <- 10000 # make this big enough for your system to swap
y <- matrix(rnorm(n*N), ncol=N)
x <- rnorm(n)
r1 <- reslsfit1(x,y)
r2 <- reslsfit2(x,y)

2 个答案:

答案 0 :(得分:1)

有趣的是,qr.fittedqr.coef似乎没有占用太多内存,所以这些都可以为我工作而不会耗尽内存。 qr.coef版本似乎稍快一些。

reslsfit3 <- function(x,y) { y - qr.fitted(qr(x), y) }
reslsfit4 <- function(x,y) { y - A %*% qr.coef(qr(x), y) }

答案 1 :(得分:0)

为什么你的y变量有很多列而你的x变量只有一个?你搞砸了吗?

lsfit是否做得更好,比如通过lsfit()$ residuals?它仍然使用qr分解,所以它可能没有帮助。