我想对负载和需求之间的差异进行 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
实际上,replicate
或for
循环只有在要保留每个模拟的结果时才有意义。由于您只对整体结果感兴趣,因此第二个代码块的性能更高且类似于 R。