2017-07-04 5 views
0

私は、整数kの確率を計算するR関数を持っています。 k = 1、...、mとなる。 kのサイズが非常に大きい場合(例えば、m = 10,000)、関数は非常に遅い。関数のパフォーマンスを改善するための提案はありますか?Rのパフォーマンスを向上させたり、R関数をC++関数に変換したりする

RからのRCPPパッケージを使用できるように、必要に応じてC++で同等の関数を作成したいが、C++についてはわからない。 C++を最初から学ぶ前に、私はあなたの提案もしたいと思います。

prob <- function(k, et, ey, nrep = 10000, m0, m1) 
{ 
    m = m0 + m1 
    t <- rnorm(nrep, et, 1) 
    p0 <- pnorm(-t) 
    p1 <- pnorm(ey - t) 

    mean0 <- (m0 - 1)*p0 + m1*p1 + 1 
    mean1 <- m0*p0 + (m1 - 1)*p1 + 1 

    var0 <- (m0 - 1)*p0*(1 - p0) + m1*p1*(1 - p1) 
    var1 <- m0*p0*(1 - p0) + (m1 - 1)*p1*(1 - p1) 

    prob <- ifelse(et == 0, mean(dnorm(k, mean0, sqrt(var0))), 
        mean(dnorm(k, mean1, sqrt(var1)))) 

    return(prob) 
} 

dnormがベクトル化機能であるので、あなただけのverctorized出力を取得するにはprob

prob_k <- prob(1:10000, et = 1, ey = 1 ,m0 = 5000, m1 = 5000) 

のように呼び出すことができ、あなたがのコードを変更する必要があります機能

prob_k <- sapply(1:10000, prob, et=1, ey=1 ,m0 = 5000, m1 = 5000) 
+0

あなたの関数にフィードするつもりだデータのですか?キーはゼロからベクトル化することです.C++でのコーディングは最後の手段です。 –

答えて

1

を適用機能はちょっとでも

prob <- function(k, et, ey, nrep = 10000, m0, m1) 
{ 
    m = m0 + m1 
    t <- rnorm(nrep, et, 1) 
    p0 <- pnorm(-t) 
    p1 <- pnorm(ey - t) 

    mean0 <- (m0 - 1)*p0 + m1*p1 + 1 
    mean1 <- m0*p0 + (m1 - 1)*p1 + 1 

    var0 <- (m0 - 1)*p0*(1 - p0) + m1*p1*(1 - p1) 
    var1 <- m0*p0*(1 - p0) + (m1 - 1)*p1*(1 - p1) 

    if(et == 0) 
    dnorm(k, mean0, sqrt(var0)) 
    else 
    dnorm(k, mean1, sqrt(var1)) 
} 
01どのような形状で

これは私のマシン上でかなり速い(平均5ミリ秒)である

microbenchmark(prob_k <- prob(1:10000, et = 1, ey = 1 ,m0 = 5000, m1 = 5000)) 
# Unit: milliseconds 
#               expr  min 
# prob_k <- prob(1:10000, et = 1, ey = 1, m0 = 5000, m1 = 5000) 4.68232 
#  lq  mean median  uq  max neval 
# 4.776912 5.168405 4.817979 4.907612 7.023989 100 
+0

しかし、これは私にk = 1:1000の確率を与えていません。ただ1つの値を与える – Shakil

+0

はい、これは今修正されました。ベンチマーク番号も更新しました。必要な時間は実際には変わっていません –

+0

ありがとうございました。今問題は、新しい関数が理論が示唆しているのと同じ結果を提供していないことです。 et = ey = 0を接続すると、prob_kは一様に分布し、すべての確率は1/10000に近くなければなりません。 – Shakil

関連する問題