R语言 将泊松二项分布拟合到数据

uujelgoq  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(176)

当我尝试使用fitdistrplus来拟合数据的分布时,总是遇到同样的错误。MWE在下面。简而言之,我想用泊松二项分布拟合一些数据。我正在使用poibin R包来处理泊松二项式p,d,q,r函数(我也尝试过poisbinom,也有同样的错误)。在MWE中,我创建了dd,成功的向量。我尝试使用fitdist来拟合start列表中给定的起始值的分布。这个错误说(我认为)我给它的开始值的名称不在dpoibin函数中,这就是我卡住的地方。

library(fitdistrplus)
library(poibin)
set.seed(123)
dd <- rpoibin(10, pp=seq(0.1, 0.5, length.out=10))
ppp <- runif(10)
ret <- try(fitdistrplus::fitdist(dd, distr=dpoibin,
    start=list(pp = ppp)))

字符串
错误消息:
checkparamlist(arg_startfix$start.arg,arg_startfix$fix.arg,:“start”必须指定作为“distr”的参数的名称。

w8ntj3qf

w8ntj3qf1#

该错误来自函数fitdistrplus:::checkparamlist,该函数由fitdist调用,以确保传递给start的列表中的名称与传递给distr的函数中的参数名称匹配。当你在start中传递一个像ppp这样的向量作为参数时,checkparamlist会通过附加一个整数来重命名向量的每个元素。这意味着参数名称变为"pp1", "pp2", "pp3",依此类推,直到"pp10"。由于没有传入名为pp的参数,因此抛出错误。
由于这个问题,我不确定是否有一种方法来估计fitdist中的矢量化参数,但幸运的是,在这种情况下,我们可以很容易地自己拟合分布。
因为我们知道分布的平均值是
x1c 0d1x的数据
方差是



(Reference)
然后我们知道,如果我们有一个样本dd,如果pp完全符合分布,以下函数将返回0:

objective <- function(pp) {
  abs(mean(dd) - sum(pp)) + abs(sum(pp * (1 - pp)) - var(dd))
}

字符串
为了演示这一点,让我们从rpoibin中取一个更大的示例

set.seed(123)

dd  <- poibin::rpoibin(100000, pp=seq(0.1, 0.5, length.out=10))
ppp <- runif(10)


现在,我们找到优化目标函数的值集:

pp_opt <- optim(par = ppp, objective)$par

pp_opt
#>  [1] 0.45594175 0.08754997 0.54250499 0.28056432 0.30363457 0.28354584
#>  [7] 0.17861750 0.21109410 0.41562763 0.23920435


我们可以通过绘制直方图并将dpoibin的输出与pp参数的计算值叠加来确认这是一个很好的拟合:

hist(dd, freq = FALSE, breaks = 0:11 - 0.5)
points(0:10, poibin::dpoibin(0:10, pp = pp_opt), col = "red")

请注意,pp的最佳值可能有许多解,我们不应该期望得到seq(0.1, 0.5, length.out = 10)。首先,顺序并没有什么不同。我们可以看到pp_opt的均值和方差与seq(0.1, 0.5, length.out = 10)非常相似,这是拟合分布的关键

mean(seq(0.1, 0.5, length.out = 10))
#> [1] 0.3
mean(pp_opt)
#> [1] 0.2998285

sum((1 - pp_opt) * pp_opt)
#> [1] 1.930687
sum((1 - seq(0.1, 0.5, length.out = 10)) * seq(0.1, 0.5, length.out = 10))
#> [1] 1.937037


一般来说,由于排序以及无限多个集合具有相同分布和计算方差的事实,不可能从给定样本中精确地恢复pp
创建于2023-07-18,使用reprex v2.0.2

相关问题