0

ベクトル化と、それを適用して R の for ループを高速化する方法については認識していますが、各反復が前の反復の結果に依存している、または依存しているベクトルを使用してコードを高速化する方法を理解できません。反復ランダム間隔計算。

例えば:

ジョシュ・・・ごめんなさい。だから、ここに詳細があります:

m <- c(1, 1)
w.r <- c(0.33592935393, 0.63825353030, 0.15335253356 )

rlistl は 3 つの 2x2 行列のリストです。ですから、会話のために、

r0 <- matrix(0, 2, 2) 
r1 <- matrix(1, 2, 2)
r2 <- matrix(2, 2, 2)
rlist <- list(r0, r1, r2)

N <- 500
E <- matrix(0, N, 2)

for(i in 1:N) {
    r <- c(c(1:3) %*% rmultinom(1, 1, w.r))
    E[i, ] <- mvrnorm(1, m, rlist[[r]])
}

「r <- multinom()」の計算をループの外で実行しようとしましたが、rprof は、費やされた時間の大部分が明らかに mvnorm にあることを示しています。ベクトルを使用してこれを高速化する方法をRで見つけられる人はいますか?

ここに別の例があります

for(i in 1:N) {
    if(d$V[i, 1] & d$V[i, 2]) QQ <- 1
    else if(! d$V[i, 1] & d$V[i, 2]) QQ <- 2
    else if(! d$V[i, 1] & ! d$V[i, 2]) QQ <- 3
    else if(d$V[i, 1] & ! d$V[i, 2]) QQ <- 4

    U[i, ] <- r1bvtruncnorm(mux=mu.U[i, ]/sd.r[r1], rho=rho, q=QQ)

}

それをより速く実行する方法を理解できません。私の問題の一部は、私が C/C++ プログラマーであることですが、R について調べようとしていて、何か簡単なことを見逃していないことを確認したいと考えています。

ありがとう。

編集:

ジャスティン:

わかりました-あなたの提案を試しましたが、恐れていたように、rep() は期待どおりに動作しません。毎回別の乱数が必要ですが、rep() を使用すると、rmultinom を 1 回呼び出すだけで、結果が 100 回複製されます。

>rep(c(c(1:3) %*% rmultinom(1, 1, ww.r)), 100)
  [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [38] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 [75] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

> rep(c(c(1:3) %*% rmultinom(1, 1, ww.r)), 100)
  [1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [38] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 [75] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4

1 に答える 1

0

私が正しく推測できなかったことについては、Josh のコメントを参照してください。

しかし、他に何も残さなかったと仮定すると、w.rは一定であり、ループから削除する必要があります。 mも一定です。'r' と rlist[[r]] はランダムに生成されますが、パラメーターは一定です。Nあなたがしているのは、同じパラメータから配布時間を生成することですよね? その場合は、for ループよりも優れた選択肢がたくさんあります。例えば

E <- matrix(rep(mvrnorm(1, 
                       m, 
                       rlist[[c(1:3 %*% rmultinom(1, 1, w.r))]]), 
                N),  
            N, 
            2)

最初の for ループと同じ結果が得られるはずです。

2 番目の例は、単に関数になり、 を使用できますapply。ただし、dオブジェクトの実際の構造を知らなければ、最適なアプローチ方法を知ることは困難です。data.frames の data.frame またはリストの名前付きリストのようなものを想定しています。d$V2次元データ構造はどこにありますか:

my.fun <- function(vec) {
    if(vec[1] & vec[2]) return(1)
    else if(! vec[1] & vec[2]) return(2)
    else if(! vec[1] & ! vec[2]) return(3)
    else if(vec[1] & ! vec[2]) return(4)
}

QQ <- apply(d$V, 1, my.fun)

コメントごとに編集:

r  <- 1:3 %*% rmultinom(N, 1, w.r)
E <- t(sapply(r, function(x) mvrnorm(1, m, rlist[[x]])))

または、1 つの乱雑な行で:

t(sapply(1:3 %*% rmultinom(N, 1, w.r), function(x) mvrnorm(1, m, rlist[[x]])))
于 2012-05-18T16:39:30.377 に答える