【问题标题】:Need help understanding this probability code需要帮助理解这个概率代码
【发布时间】:2018-02-11 14:29:04
【问题描述】:

R 的新手...这是著名的(也许是?)公共汽车的概率模拟,该公共汽车从空车开始,在每个停靠站接 0、1 或 2 名乘客,概率分别为 0.5、0.4 和 0.2。同样在每一站,每位乘客下车的概率为0.2

我可以看到一开始它跳过了一部分代码,因为变量“乘客”从 0 开始。但我不明白的是 runif(1) 代码 - 它在这里做什么?还有另一个问题 - 我如何跟踪向量,我想看看它是如何将信息存储在表格中的(R 新手所以不知道)。

(这段代码模拟了10站后空车的概率)

nreps <- 10000
nstops <- 10
count <- 0
for (i in 1:nreps){
  passengers <- 0
  for (j in 1:nstops){
    if(passengers > 0)
      for (k in 1:passengers)
        if(runif(1) < 0.2)
          passengers <- passengers - 1
    newpass <- sample(0:2, 1, prob=c(0.5, 0.4, 0.1))
    passengers <- passengers + newpass
  }
  if (passengers == 0) count <- count + 1
}
print(count/nreps)

【问题讨论】:

  • 函数调用runif(1)从单位区间[0,1]上的均匀分布中抽取一个随机值。这个随机值小于 0.2 的概率正好是 0.2。因此,每站一名乘客下车的概率为 0.2。
  • 哦,这很有道理。你对我的第二个问题有什么建议吗?我如何访问所有矢量数据所在的表?我正在使用 R-Studio。
  • 我也不确定你指的是什么。这段代码中实际上没有任何表格,只有乍一看都是整数的变量。
  • 那么当“nsteps”为10、100、1000时,不应该生成10、100、1000行所有变量的值吗?我想查看那些以了解它是如何工作的? (如果这有意义吗?)
  • 在这种情况下,您可以添加一些打印语句(请参阅例如 sprintf 的文档)并可能在 for 循环的每次迭代后停止执行您的脚本(请参阅 stackoverflow.com/questions/15272916/… 了解如何这可以做到)。

标签: r simulation probability


【解决方案1】:

首先,这里是对每个步骤的解释:

nreps <- 10000
nstops <- 10
count <- 0

for (i in 1:nreps){  #for 10,000 iterations
  passengers <- 0  #start with zero passengers
  for (j in 1:nstops){  #for the number of stops (10) do...
    if(passengers > 0)  #for number of passengers, when number > 0...
      for (k in 1:passengers)  #for each passenger...
        if(runif(1) < 0.2)  #take 1 random val from a uniform dist, and if less than 0.2...
          passengers <- passengers - 1  #subtract 1 from passengers (i.e. n-1)
        newpass <- sample(0:2, 1, prob=c(0.5, 0.4, 0.1))  #take one random sample from 0,1,2, with probability weights 0.5, 0.4, 0.1, respectively
        passengers <- passengers + newpass  #add existing passengers to number of new passengers
  }
  if (passengers == 0) count <- count + 1  #if the number of passengers still equal zero by now, add 1 to the count
}

print(count/nreps)  #number of times when passenger = 0 divided by number of iterations

现在,如果要跟踪每次迭代的进度,可以先设置空变量,然后根据每次迭代的索引填充这些变量,如下所示:

passengers_before <- c()  #empty vector
passengers_after <- c()  #empty vector

for (i in 1:nreps){   #for 10,000 iterations
  passengers <- 0   #start with zero passengers
  passengers_before[i] <- passengers
  for (j in 1:nstops){   #for the number of stops (10) do...
    if(passengers > 0)   #for number of passengers, when number > 0...
      for (k in 1:passengers)   #for each passenger...
        if(runif(1) < 0.2)   #take 1 random val from a uniform dist, and if less than 0.2...
          passengers <- passengers - 1   #subtract 1 from passengers (i.e. n-1)
        newpass <- sample(0:2, 1, prob=c(0.5, 0.4, 0.1))   #take one random sample from 0,1,2, with probability weights 0.5, 0.4, 0.1, respectively
        passengers <- passengers + newpass   #add existing passengers to number of new passengers
  }
  passengers_after[i] <- passengers
  if (passengers == 0) count <- count + 1   #if the number of passengers still equal zero by now, add 1 to the count
}

passenger_sample <- data.frame(passengers_before,passengers_after)

print(count/nreps)

现在,passenger_sample 将是一个 data.frame,其行数等于迭代次数(例如 10,000),它将有两列:passengers_before 和 Passengers_after。

这是前几行:

head(passenger_sample)

  passengers_before passengers_after
1                 0                2
2                 0                4
3                 0                4
4                 0                4
5                 0                1
6                 0                2

【讨论】:

    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2010-11-04
    相关资源
    最近更新 更多