计算对数概率,飞镖游戏R

Calculate log probability, darts game R

我遇到了以下问题,我做了一些研究,但仍然无法找到解决这个问题的方法。
Darts Player 在 42 天的时间里每晚射击 30 次。 创建一个函数,该函数采用射击目标的概率 p 并计算玩家在 42 天的每一天中完成以下目标射击的概率对数:

shots = c(
  8, 5, 12, 11, 12, 8, 6, 7, 11, 7, 11, 13, 15,
  12, 17, 12, 9, 15, 8, 11, 11, 13, 10, 8, 12, 12, 11,
  13, 12, 14, 9, 11, 13, 10, 10, 12, 13, 10, 15, 12, 15, 12
)

我不熟悉 R 中的概率和此类编程,因此,如果能提供解决此问题的任何帮助和方法,我们将不胜感激。提前致谢!

在命中概率为 0.5 的情况下,获得 8 次射击的概率 或更少 可以通过以下方式找到:

pbinom(8, 30, 0.5)

但是要找到正好 8 次射门的概率,我们需要减去得到 7 次或更少射门的概率:

pbinom(8, 30, 0.5) - pbinom(8 - 1, 30, 0.5)

由于 pbinom 是矢量化的,我们可以通过以下方式获得获得所有镜头的独立概率:

pbinom(shots, 30, 0.5) - pbinom(shots - 1, 30, 0.5)

但这给了我们一个包含 42 个概率的向量。为了得到正好这串镜头的概率,我们需要将所有这些概率相乘:

prod(pbinom(shots, 30, 0.5) - pbinom(shots - 1, 30, 0.5))
#> [1] 2.921801e-62

而这个值的日志就是我们要找的:

log(prod(pbinom(shots, 30, 0.5) - pbinom(shots - 1, 30, 0.5)))
#> [1] -141.6881

请注意,尽管我们可能 运行 遇到浮点数无法处理非常小的数字的问题,因此取对数的总和比取乘积的对数更安全,后者是否则在数学上是等价的。

sum(log(pbinom(shots, 30, 0.5) - pbinom(shots - 1, 30, 0.5)))
#> [1] -141.6881

现在我们需要做的就是将其包装在一个函数中,该函数允许我们为概率指定 0.5 以外的数字:

f <- function(p) {
  shots = c(
  8, 5, 12, 11, 12, 8, 6, 7, 11, 7, 11, 13, 15,
  12, 17, 12, 9, 15, 8, 11, 11, 13, 10, 8, 12, 12, 11,
  13, 12, 14, 9, 11, 13, 10, 10, 12, 13, 10, 15, 12, 15, 12
  )
  sum(log(pbinom(shots, 30, p) - pbinom(shots - 1, 30, p)))
}

你被问到这个问题的原因可能是作为对可能性的介绍。我们可以通过绘制在给定 p

的特定值时准确获得 shots 的对数概率来查看 p 参数的似然曲线
probs <- seq(0.01, 0.99, 0.01)
plot(probs, sapply(probs, f))

我们可以通过使用optimize:

最有可能找到p的值
optimize(f, c(0.01, 0.99), maximum = TRUE)$maximum
#> [1] 0.3714248

因此我们可以推断玩家每次击中目标的几率约为 37.14%。

我们可以通过简单地计算飞镖玩家投掷的百分比来确认这是正确的,这应该给我们相同的值:

mean(shots/30)
#> [1] 0.3714286