计算对数概率,飞镖游戏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
我遇到了以下问题,我做了一些研究,但仍然无法找到解决这个问题的方法。
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