我使用相同的预测器和大量响应来拟合最小二乘模型,而我所需要的只是残差。 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)
答案 0 :(得分:1)
有趣的是,qr.fitted
和qr.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分解,所以它可能没有帮助。