零膨胀泊松分布:使用错误代码100无法估计参数

3

以下是我正在处理的一种数据集:

data <- c(0, 1, 0, 11, 2, 0, 3, 0, 0, 2, 1, 3, 1, 0, 1, 0, 0, 0, 2, 3, 
0, 0, 0, 8, 1, 1, 1, 0, 1, 1, 2, 7, 0, 0, 0, 5, 2, 3, 6, 1, 1, 
5, 2, 9, 0, 0, 1, 21, 16, 2, 9, 6, 25, 2, 1, 12, 16, 14, 15, 
15, 6, 1, 12, 12, 13, 5, 5, 6, 4, 7, 11, 8, 4, 5, 8, 3, 8, 4, 
7, 4, 7, 2, 5, 6, 4, 5, 1, 0, 8, 5, 6, 8, 9, 8, 9, 7, 7, 9, 8, 
9, 4, 4, 7, 13, 9, 13, 12, 10, 9, 8, 7, 11, 5, 5, 0, 1, 33, 4, 
22, 19, 22, 9, 5, 4, 17, 7, 7, 4, 5, 3, 0, 0, 9, 3, 0, 0, 36, 
40, 5, 4, 0, 11, 0, 7, 5, 25, 39, 26, 4, 20, 12, 4, 17, 3, 22, 
12, 14, 8, 9, 11, 7, 11, 10, 9, 16, 6, 24, 8, 5, 6, 14, 3, 9, 
4, 1, 20, 0, 1, 7, 9, 0, 12, 2, 29, 56, 16, 8, 28, 0, 19, 25, 
35, 87, 56, 66, 60, 58, 14, 10, 12, 13, 13, 34, 26, 18, 13, 22, 
13, 12, 15, 41, 11, 11, 11, 5, 6, 7, 8, 8, 17, 16, 12, 21, 38, 
34, 10, 77, 41, 7, 12, 1, 16, 20, 8, 5, 2, 20, 7, 16, 12, 6, 
10, 31, 12)

我使用fitdistrplus包进行最大似然拟合分布。
同样的, gamlss包定义了零膨胀泊松分布的概率密度函数和累积分布函数。

library(fitdistrplus)   
library(gamlss)  

以下是数据集的平均值和标准差。

mu=mean(data)
sigma=sd(data)

数据集的平均数为10.75,标准差为13.050。我尝试使用以下的fitdist函数来拟合零膨胀Poisson分布。
fit_zip = fitdist(data, 'ZIP', start = list(mu = mu, sigma = sigma))

一旦指定的函数被编译,编译器将抛出以下错误

Error in fitdist(data, "ZIP", start = list(mu = mu, sigma = sigma)) : 
  the function mle failed to estimate the parameters, 
                with the error code 100

很明显,mu和sigma的初始值存在问题。我不确定在什么依据下初始化起始值。
感激任何帮助。

  1. 学习help("zip")。参数sigma不是标准差。
  2. 回想一下泊松分布E(x)==var(x)。然后比较mean(data[data != 0])var(data[data != 0])。你的数据不太可能来自于零膨胀泊松分布。
  3. 我认为你不能使用fitdist来处理这个分布。首先,fitdist和你一样犯了一个错误,假设sigma是标准差。这个问题可以解决。但是,当我使用模拟数据时,由于d/pZIP函数对于不正确的输入表现不如预期,我会遇到错误。
- Roland
1个回答

0
你可以使用 VGAM::*zipois() 替代 gamlss.dist::*ZIP()。起始参数有些不同,可以参考 ?dzipois,并且不一定要是输入数据的平均值。
library('fitdistrplus')
library('VGAM')  
fitdist(x, 'zipois', start=list(lambda=1, pstr0=.1))
# $start.arg
# $start.arg$lambda
# [1] 1
# 
# $start.arg$pstr0
# [1] 0.1
# 
# 
# $fix.arg
# NULL
# 
# Fitting of the distribution ' zipois ' by maximum likelihood 
# Parameters:
#   estimate Std. Error
# lambda 12.2009631 0.23823650
# pstr0   0.1187056 0.02069464
# Warning messages:
#   1: In fitdist(x, "zipois", start = list(lambda = 1, pstr0 = 0.1)) :
#   The dzipois function should return a zero-length vector when input has length zero
# 2: In fitdist(x, "zipois", start = list(lambda = 1, pstr0 = 0.1)) :
#   The pzipois function should return a zero-length vector when input has length zero

虽然我不确定这个警告是什么意思。

您可以使用另一个向量x1(如下)进行比较,它不会与gamlss.dist失败。


数据:

x <- c(0, 1, 0, 11, 2, 0, 3, 0, 0, 2, 1, 3, 1, 0, 1, 0, 0, 0, 2, 3, 
0, 0, 0, 8, 1, 1, 1, 0, 1, 1, 2, 7, 0, 0, 0, 5, 2, 3, 6, 1, 1, 
5, 2, 9, 0, 0, 1, 21, 16, 2, 9, 6, 25, 2, 1, 12, 16, 14, 15, 
15, 6, 1, 12, 12, 13, 5, 5, 6, 4, 7, 11, 8, 4, 5, 8, 3, 8, 4, 
7, 4, 7, 2, 5, 6, 4, 5, 1, 0, 8, 5, 6, 8, 9, 8, 9, 7, 7, 9, 8, 
9, 4, 4, 7, 13, 9, 13, 12, 10, 9, 8, 7, 11, 5, 5, 0, 1, 33, 4, 
22, 19, 22, 9, 5, 4, 17, 7, 7, 4, 5, 3, 0, 0, 9, 3, 0, 0, 36, 
40, 5, 4, 0, 11, 0, 7, 5, 25, 39, 26, 4, 20, 12, 4, 17, 3, 22, 
12, 14, 8, 9, 11, 7, 11, 10, 9, 16, 6, 24, 8, 5, 6, 14, 3, 9, 
4, 1, 20, 0, 1, 7, 9, 0, 12, 2, 29, 56, 16, 8, 28, 0, 19, 25, 
35, 87, 56, 66, 60, 58, 14, 10, 12, 13, 13, 34, 26, 18, 13, 22, 
13, 12, 15, 41, 11, 11, 11, 5, 6, 7, 8, 8, 17, 16, 12, 21, 38, 
34, 10, 77, 41, 7, 12, 1, 16, 20, 8, 5, 2, 20, 7, 16, 12, 6, 
10, 31, 12)

x1 <- c(0, 63, 1, 4, 1, 44, 2, 2, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 3, 
0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
6, 1, 11, 1, 1, 0, 0, 0, 2)

1
你确定这个数据确实适合零膨胀分布吗?我用 print(fitdist(data, 'pois', start = list(lambda = 10), discrete = TRUE, method = "mle")) 得到了完全相同的 lambda 和不确定性。但当然,OP的数据可能不是零膨胀的。 - Roland
@Roland 你是对的,谢谢。pstr0= 还需要优化,目前只适用于泊松分布,我会编辑它。 - jay.sf
似乎可以工作,但与OP的数据非常不匹配。也许加入一些图形?hist(data, freq = FALSE, breaks = 0:90 - 0.5); curve(dzipois(x, lambda = 12.2, pstr0 = 0.12), add = TRUE, col = "blue", from = 0, to = 90, type = "p", n = 91) - Roland
1
@Roland 当然,没有要求适配:) 还可以查看其他问题中的图表。 - jay.sf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接