Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按结果分组的事件概率_R_Combinatorics - Fatal编程技术网

R 按结果分组的事件概率

R 按结果分组的事件概率,r,combinatorics,R,Combinatorics,假设有$n$独立事件。每个都有一个概率$p\n$和一个相关损失$l\n$。我的目标是列出所有可能的损失金额及其相关概率 最后,我想将其扩展到具有可变概率和损失金额的10-20个事件集。这一切都将在R中完成 幂集给出了各种结果,例如三个事件:(空)、(A)、(B)、(C)、(A和B)、(A和C)、(B和C)、(A和C)、(A和B)、(A和B和C)。这些结果中的每一个的概率都可以通过取每个子集中概率的乘积,以及通过取每个子集中损失的总和来求总损失来求出 我的问题是如何根据损失金额进行聚合,即找到功率

假设有$n$独立事件。每个都有一个概率$p\n$和一个相关损失$l\n$。我的目标是列出所有可能的损失金额及其相关概率

最后,我想将其扩展到具有可变概率和损失金额的10-20个事件集。这一切都将在R中完成

幂集给出了各种结果,例如三个事件:(空)、(A)、(B)、(C)、(A和B)、(A和C)、(B和C)、(A和C)、(A和B)、(A和B和C)。这些结果中的每一个的概率都可以通过取每个子集中概率的乘积,以及通过取每个子集中损失的总和来求总损失来求出

我的问题是如何根据损失金额进行聚合,即找到功率集中所有唯一的损失金额并产生其概率

我觉得我已经完成了一半,但我不能完全理解如何将它应用于我的特定问题,特别是当事件数超过3时,或者在中等大小的集合的情况下,例如,如何将上面的所有2个元素集进行分组。

对于一个如此小的问题,最多有2^20(大约一百万)可能性——蛮力很管用

为了举例说明,让我们生成一些中等大小的数据:

n <- 15
set.seed(17)
p <- runif(n)
loss <- ceiling(rgamma(n, 3, 1/2))
signif(rbind(Probability=p, Loss=loss), 2)
使用
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)
(当
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")

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")