r语言 - 使用 copy over for 循环



我想对负载和需求之间的差异进行 10000 次模拟。我需要所有模拟中负差异的比例。我使用了下面的 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()函数不是必需的(代码块返回它执行的最后一行),但我添加了它,以便您立即看到将存储在res中的内容。

但实际上你不需要循环来做到这一点(假设你准确地描述了你想要的东西)。您可以使用矢量化和回收来执行此操作:

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。

最新更新