0

我嵌套了如下的 for 循环。我需要 p:q=1:300 和 n=20。函数“mark”是我感兴趣的模型(Package 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=200.09 秒n=1,所以很明显正在发生一些内存搅动。至于加速,矩阵n=20只需 1.00 秒rbind,填充只需 0.033 秒。

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 回答