同じ予測子と多数の応答を使用して最小二乗モデルを当てはめています。必要なのは残差だけです。このqr.resid
関数は、これを実行するために私が見つけた最も単純なものですが、内部の Fortran コードがqr.resid
結果を返す前に破棄される不要なものを返すため、必要以上のメモリを必要とします。
これは、応答の数が十分に多い場合、システムがメモリのスワップを開始する必要があり、応答に到達するまでに非常に長い時間がかかることを意味します。(R でループを使用して) 1 つずつ実行すると、スワップしないため高速になりますが、ベクトル化された方法ですべてを実行するよりも (おそらく) 遅くなります。
つまり、このバージョンは、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)