私は自分のRコードをスピードアップする必要があります。私のボトルネックはchoose関数を使用する必要がある関数です。R:機能を選択する、効率的
P_ni <- function(Pn,Pi,eta1,eta2,p,d=NA)
{
if(is.na(d)) d <- 1-p
if(Pn==Pi) output <- p^Pn
else
{
if(Pi==1)seq1 <- seq_len(Pn-1)
if(Pi>1)seq1 <- seq_len(Pn-1)[-seq_len(Pi-1)]
output <- sum(choose((Pn-Pi-1),c(seq1-Pi))*choose(Pn,seq1)*
(eta1/(eta1+eta2))^c(seq1-Pi)*
(eta2/(eta1+eta2))^c(Pn-seq1)*p^seq1*d^c(Pn-seq1)
)
}
return(output)
}
この関数は、異なるPnとPiで数回呼び出す必要があります。ここでの問題は、PnとPiだけが単一の数値をとり、ベクトルでは動作できないということです。これはchoose() - 関数によって発生します。
私は現時点でforループでこれを行いますが、完全に動作しますが、遅いです。
for(i in 1:nrow(n_k_matrix_p))
{
n_k_matrix_p[i,4] <- P_ni(n_k_matrix_p[i,1],n_k_matrix_p[i,2],eta1,eta2,p)
}
それが再現可能にするために:
eta1 <- 10
eta2 <- 5
p <- 0.4
n_k_matrix <- expand.grid(c(1:20),c(1:20))
n_k_matrix <- n_k_matrix[n_k_matrix[,1] >=n_k_matrix[,2],]
n_k_matrix <- n_k_matrix[order(n_k_matrix[,1]),]
n_k_matrixがPnとパイのための私の番号が含まれているため、ループ ザ・は次のようになります。 残念ながら、ループは適用を使用するよりもまだ高速です。 誰かが物事をスピードアップする方法を知っていますか?
私は完全ではないことを理解しています。 'choose'引数' n'と 'k'は*ヘルプのページの*数値ベクトル*ですので、' choose(4:6,1:3) 'が動作することを確認しました。また、 'for'と' apply'を使って言及しますが、どちらもここには含まれていません。 – r2evans
私はfor-loopを追加します! –
質問を編集してください。コメント内の複雑なコードやデータは本当に難しいです。 – r2evans