在循环中使用复制

Using replicate over for loop

我想模拟10000次负载和需求之间的差异。我需要所有模拟中负差异的比例。我在下面使用了 for 循环,但这对于大型模拟来说性能不佳,因为它需要我稍后手动计算所有内容。

如何对复制进行同样的操作?使用 replicate over for 循环有什么好处?

 for(i in 1:10){
 load<-rnorm(10,8,2)
 demand<-c(6,7,6,5,6,7,8,7,6,5)
 diff<-load-demand
 res<-sum(diff<0) / 10# sum the negative differences
 print(res)
 }

使用 for 循环的最大缺点是您不会自动将所有内容存储在对象中。 replicate() 为您完成。

另一个提示:将所有不会改变的东西都排除在循环之外(比如 demand 的定义)

如何使用 replicate() 执行您描述的操作:

nsim <- 10000
demand <- c(6,7,6,5,6,7,8,7,6,5)
res <- replicate(nsim,{
  load <- rnorm(10,8,2)
  diff <- load - demand
  return(sum(diff < 0))
})
res <- sum(res) / nsim

return() 函数不是必需的(一个代码块 returns 它执行的最后一行),但我添加它以便您立即看到将要存储在 [=16= 中的内容].

但您实际上不需要循环来执行此操作(前提是您准确描述了您想要的内容)。您可以只使用矢量化和回收来做到这一点:

nsim <- 10000
demand <- c(6,7,6,5,6,7,8,7,6,5)
load <- rnorm(10*nsim, 8, 2)
diff <- load - demand
res <- sum(diff < 0) / nsim

replicatefor 循环实际上只有在您想保留每次模拟的结果时才有意义。由于您只对整体结果感兴趣,因此第二个代码块的性能会更高并且更像 R。