3

同じ予測子と多数の応答を使用して最小二乗モデルを当てはめています。必要なのは残差だけです。この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)
4

2 に答える 2

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

y変数に多くの列があり、x変数に1つしかないのはなぜですか?それらを混同しましたか?

lsfitは、たとえばlsfit()$ Residualsを介して、より良い結果を出しますか?それはまだqr分解を使用しているので、役に立たないかもしれません。

于 2012-06-20T07:17:53.157 に答える