我正在拟合具有相同预测变量和大量响应的最小二乘模型,而我需要的只是残差。该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)