假设有$ n $独立事件。每个都有概率$ p_n $和相关损失$ l_n $。我的目标是列出所有可能的损失金额及其相关概率。
最后,我想将此扩展到具有可变概率和损失金额的10-20个事件集。这一切都将在R。
中完成各种结果由功率组给出,例如对于三个事件:(null),(A),(B),(C),(A和B),(A和C),(B和C),(A和B和C)。通过获取每个子集中概率的乘积,以及通过获取每个子集中的损失总和,可以找到每个结果的概率。
我的问题是如何按损失金额汇总,即找出权力集中的所有唯一损失金额并产生其概率。
我觉得我已经在inclusion/exclusion principle的中途,但我无法理解如何将它应用于我的特定问题,特别是当事件数超过3时,或者在例如,中间尺寸集合的情况如何对上面的所有2个元素集进行分组。
答案 0 :(得分:1)
对于一个小问题 - 最多有2 ^ 20(大约一百万)的可能性 - 蛮力工作正常。
为了说明,让我们生成一些中等大小的数据:
n <- 15
set.seed(17)
p <- runif(n)
loss <- ceiling(rgamma(n, 3, 1/2))
signif(rbind(Probability=p, Loss=loss), 2)
以下是此示例的输入值:
Probability 0.16 0.97 0.47 0.78 0.41 0.54 0.21 0.19 0.78 0.19 0.43 0.0023 0.83 0.83 0.96
Loss 12.00 4.00 10.00 8.00 10.00 6.00 12.00 5.00 4.00 8.00 8.00 8.0000 4.00 4.00 4.00
使用expand.grid
生成功率集的二进制指示符,然后使用数组运算来相对快速地计算损失和所有可能结果的概率:
powerset <- t(expand.grid(lapply(p, function(x) 0:1)))
probability <- apply(powerset * (2*p - 1) + (1-p), 2, prod)
losses <- colSums(powerset * loss)
(在这个老化的Xeon工作站上,当n
为20时,这最多需要5秒。)
使用tapply
按损失汇总:
x <- tapply(probability, losses, sum)
(当n
为20时,这需要1到2秒。)
我们可以通过(a)验证概率总和为统一来检查一致性,以及(b)检查预期损失是个别事件的预期损失之和:
if(sum(probability) - 1 != 0) warning("Unnormalized probability.")
if(sum(probability * losses) - sum(p*loss) != 0) warning("Inconsistent result.")
让我们绘制由此产生的损失分布。
library(ggplot2)
ggplot(data.frame(Loss=as.numeric(names(x)), Probability=x),
aes(Loss, Probability)) +
geom_col(color="White")