当我尝试使用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”的参数的名称。
1条答案
按热度按时间w8ntj3qf1#
该错误来自函数
fitdistrplus:::checkparamlist
,该函数由fitdist
调用,以确保传递给start
的列表中的名称与传递给distr
的函数中的参数名称匹配。当你在start
中传递一个像ppp
这样的向量作为参数时,checkparamlist
会通过附加一个整数来重命名向量的每个元素。这意味着参数名称变为"pp1", "pp2", "pp3"
,依此类推,直到"pp10"
。由于没有传入名为pp
的参数,因此抛出错误。由于这个问题,我不确定是否有一种方法来估计
fitdist
中的矢量化参数,但幸运的是,在这种情况下,我们可以很容易地自己拟合分布。因为我们知道分布的平均值是
x1c 0d1x的数据
方差是
的
(Reference)
然后我们知道,如果我们有一个样本
dd
,如果pp
完全符合分布,以下函数将返回0:字符串
为了演示这一点,让我们从
rpoibin
中取一个更大的示例型
现在,我们找到优化目标函数的值集:
型
我们可以通过绘制直方图并将
dpoibin
的输出与pp
参数的计算值叠加来确认这是一个很好的拟合:型
请注意,
pp
的最佳值可能有许多解,我们不应该期望得到seq(0.1, 0.5, length.out = 10)
。首先,顺序并没有什么不同。我们可以看到pp_opt
的均值和方差与seq(0.1, 0.5, length.out = 10)
非常相似,这是拟合分布的关键型
一般来说,由于排序以及无限多个集合具有相同分布和计算方差的事实,不可能从给定样本中精确地恢复
pp
。创建于2023-07-18,使用reprex v2.0.2