【问题标题】:R: How do i aggregate losses by a poisson observation?R:我如何通过泊松观察来汇总损失?
【发布时间】:2026-02-11 11:10:01
【问题描述】:

我是 R 新手,但我正在尝试使用它来汇总从严重性分布中观察到的损失,这些损失是通过从频率分布中观察到的 - 基本上是 rcompound 所做的。但是,我需要一种更精细的方法,因为我需要在“聚合”之前操纵严重性分布。

让我们举个例子。假设你有:

rpois(10,lambda=3)

因此,给你类似的东西:

[1] 2 2 3 5 2 5 6 4 3 1

此外,假设我们的损失严重程度由以下因素决定:

rgamma(20,shape=1,scale=10000)

这样我们也有如下输出:

 [1]   233.0257   849.5771  7760.4402   731.5646  8982.7640 24172.2369 30824.8424 22622.8826 27646.5168  1638.2333  6770.9010  2459.3722   782.0580 16956.1417  1145.4368  5029.0473  3485.6412  4668.1921  5637.8359 18672.0568

我的问题是:让 R 依次进行每个泊松观察,然后从我的严重性分布中汇总损失的有效方法是什么?例如,第一个泊松观测值是 2。因此,从我的 Gamma 分布中添加两个观测值(前两个)得到 1082.61。

我说这需要“高效”(运行时间),因为: - 泊松参数可能非常大,即高达 1000 左右。 - 实现可能多达 1,000,000 个,即多达 100 万个泊松和 Gamma 观测值需要整理。

任何帮助将不胜感激。

谢谢,戴夫。

【问题讨论】:

  • 第二个泊松条目 2 的期望输出是什么?它也是1082.61吗?或者它会是伽马系列中接下来两个条目的总和 7760.4402+731.5646=8492.0048?
  • 抱歉,不清楚。这将是您的第二个建议,即 8492.00。为了完整起见,这将使泊松分布“3”的第三次观察等于“8982.7640 24172.2369 30824.8424”的总和。有什么想法吗?

标签: r statistics sum aggregate distribution


【解决方案1】:

您似乎想在泊松向量的累积指示的位置拆分伽马向量。

以下函数 (from here) 进行拆分:

splitAt <- function(x, pos) unname(split(x, cumsum(seq_along(x) %in% pos)))

pois <- c(2, 2, 3, 5, 2, 5, 6, 4, 3, 1)
gam <- c(233.0257, 849.5771, 7760.4402, 731.5646, 8982.7640, 24172.2369, 30824.8424, 22622.8826, 27646.5168, 1638.2333, 6770.9010, 2459.3722, 782.0580, 16956.1417, 1145.4368, 5029.0473, 3485.6412, 4668.1921, 5637.8359, 18672.0568)
posits <- cumsum(pois)

然后执行以下操作:

sapply(splitAt(gam, posits + 1), sum)
[1]  1082.603  8492.005 63979.843 61137.906 17738.200 19966.153 18672.057

根据我链接到上面的帖子,splitAt() 函数对于大型数组会变慢,因此您可以(如有必要)考虑该帖子中提出的替代方案。就我而言,我生成了 1e6 泊松和 1e6 伽马,上面的函数在我的机器上运行了 0.78 秒。

【讨论】:

  • 这正是我所追求的。谢谢你的分享。然而不幸的是,这个函数“忽略”了泊松分布产生的零值。你能想到如何添加它吗?换句话说,id 像 sappy 函数一样能够在泊松分布给出零值的情况下返回零值。希望这很清楚!
  • 嗯,我不确定是否可以直接修改拆分方法以照顾零位。您可以创建一个零位置向量:zero_ind &lt;- which(pois==0),然后从pois (pois &lt;- pois[pois != 0]) 中去除零,运行上述代码以获取相关的 gamma;最后在zero_ind 向量指定的位置处将 0 插入到伽马输出中。以See here 为例。