3

我正在拟合具有相同预测变量和大量响应的最小二乘模型,而我需要的只是残差。该qr.resid函数是我发现执行此操作的最简单的函数,但它占用的内存比必要的多,因为它内部的 Fortran 代码返回了一些不必要的东西,这些东西在qr.resid返回结果之前被丢弃。

这意味着当响应的数量足够大时,我的系统必须开始交换内存,并且需要很长时间才能得到答案。一个一个地做(在 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)
4

2 回答 2

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) }
于 2012-06-21T04:25:46.090 回答
0

为什么你的 y 变量有很多列而你的 x 变量只有一个?你把他们弄混了吗?

lsfit 是否做得更好,比如通过 lsfit()$residuals?它仍然使用 qr 分解,因此可能无济于事。

于 2012-06-20T07:17:53.157 回答