0

以下のようにforループをネストしました。p:q = 1:300、n=20が必要です。関数「マーク」は私の興味のあるモデルです(パッケージRMark)。rbindは遅くなる可能性があることは知っていますが、それを置き換えるために何を使用すべきかわかりません。それ以外の場合、この機能を高速化するために他に何ができますか?ありがとう。

foo<-function(data, p, q, n){
results.frame <- data.frame()
for (i in 1:n){
    for (i in p:q) {
        run.model<-mark(data[sample(nrow(data), i),], model="Occupancy")       
        results<-data.frame(summary(run.model)$real$p, Occupancy=summary(run.model)$real$Psi, se.p=t(as.matrix(summary(run.model, se=T)$real$p$se)), se.Psi=summary(run.model, se=T)$real$Psi$se, stations=i)
        results.frame<-rbind(results.frame, results)
        } 
    }
write.table(results.frame, "C:\\RWorkspace\\simulation_results.txt")
return(results.frame)
}
4

1 に答える 1

0

はい、rbind遅くなる可能性があります。通常は、マトリックスを最初から適切なサイズにして、適切に入力することをお勧めします。また、通常は、データ フレームではなくマトリックスを入力する方が高速です。

ただし、あなたが示したサイズでは、それがmark関数の速度を低下させていると思われ、それを行うことで顕著なスピードアップは得られません。単一の結果を保存し、run.modelその行をループからコメントアウトすることで簡単にテストできます。結果を保存するだけでどれだけの時間が費やされているかがわかります。(関数を「プロファイリング」することもできますが、その方が簡単です。)

編集:私は実際に間違っています。あなたが示したサイズは十分に大きいので、rbind問題を引き起こす可能性は十分にあります。rbindかなり高速で十分な量のメモリを備えた私のシステムでは、 でデータ フレームを使用するのに 7.73 秒かかりn=20n=1. 高速化に関しては、行列に 1.00 秒、入力に 0.033 秒n=20しかかかりません。rbind

foo <- function(data, p, q, n){
  # make a single results line; remove this line when you put in your code 
  results <- c(1, Occupancy=2, se.p=3, se.Psi=4, stations=5)
  # make the matrix the right size to start with
  results.frame <- matrix(ncol=5, nrow=(q-p+1)*n)
  for (i in 1:n){
    for (j in p:q) {
      # get results here; commented out to show loop speed only
      # put in your actual code here instead
      results.frame[ 1+(i-1)*(q-p+1)+(j-p), ] <- results
    } 
  }
  # get the names right by taking the names from the last time through the loop
  colnames(results.frame) <- names(results)
  results.frame
}
于 2012-09-01T01:16:08.470 に答える