在使用交叉的整洁蒙特卡洛模拟中使用sample(...,replace = FALSE)

时间:2019-01-11 17:13:12

标签: r for-loop tidyverse montecarlo

我正在研究Digital Dice by Paul Nahin,以自学Monte Carlo模拟。我在第一遍将书中的Matlab代码转换为R代码,然后在第二遍将for循环替换为整齐的版本。

编辑:这是我要建模的内容:

  • 想象一下,您面临一个流行测验,一个19世纪24位总统的名单以及他们任职期间却被争夺的另一个名单
  • 目的是使总统与该词匹配
  • 您每次都会猜一猜
  • 平均而言,您猜对了多少?

这是使用for循环的R代码:

m <- 24
total_correct <- 0
n <- 10000

for (i in 1:n) {
  correct <- 0
  term <- sample(m, replace = TRUE)
  for (j in 1:m) {
    if (term[j] == j) {
      correct <- correct + 1
    }
  }
  total_correct = total_correct + correct
}
total_correct <- total_correct / n
print(total_correct)

这有效(但是我承认给出了错误的答案)。接下来要整理一下-这是我的尝试:

crossing(trials = 1:10, 
         m = 1:24) %>% 
  mutate(guess = sample.int(24, n(), replace = F), result = m == guess) %>% 
  summarise(score = sum(result) / n())

但是,我收到一条错误消息,内容为Error in sample.int(x, size, replace, prob): cannot take a sample larger than the population when 'replace = FALSE'

我了解发生了什么:n()语句中的mutate()命令返回240。使用replace = FALSE从总体24进行采样240是没有意义的,因此会出现错误消息。

如何获得mutuate()语句以在每次迭代(或试用)中获得24的大小?

0 个答案:

没有答案