如何测试数据集中的零通胀?

机器算法验证 泊松分布 零通胀
2022-03-31 12:19:54

我有一个似乎有很多零的数据集。我已经拟合了泊松回归模型和负二项式模型。我也想拟合零膨胀和跨栏模型。

在我这样做之前,我想运行一个测试来调查我的数据是否真的是零膨胀。有哪些测试可以确定我的数据是否零膨胀?

3个回答

分数测试(在 Ben Bolker 的评论中引用)是通过首先计算速率估计来执行的。然后计算观察到的 0 的数量,表示为和观察的总数计算然后通过公式计算检验统计量:该检验统计量具有分布,可以在表格中或通过统计软件查找。λ^=x¯n0np~0=exp[λ^](n0np~0)2np~0(1p~0)nx¯p~02χ12

这是一些可以执行此操作的 R 代码:

pois_data <-rpois(100,lambda=1)
lambda_est <- mean(pois_data)

p0_tilde <- exp(-lambda_est)
p0_tilde
n0 <- sum(1*(!(pois_data >0)))
n <- length(pois_data)

# number of observtions 'expected' to be zero
n*p0_tilde

#now lets perform the JVDB score test 
numerator <- (n0 -n*p0_tilde)^2
denominator <- n*p0_tilde*(1-p0_tilde) - n*lambda_est*(p0_tilde^2)

test_stat <- numerator/denominator

pvalue <- pchisq(test_stat,df=1, ncp=0, lower.tail=FALSE)
pvalue 

我认为有不同的方法可以做到这一点。您可以做的一件事是将零膨胀负二项式/泊松模型与没有零膨胀分量的常规二项式/泊松对应部分进行比较。在 R 中看起来像这样:

zinb <- read.csv("http://www.ats.ucla.edu/stat/data/fish.csv")
zinb <- within(zinb, {
  nofish <- factor(nofish)
  livebait <- factor(livebait)
  camper <- factor(camper)
})

require(pscl)
require(MASS)
require(boot)

## fit a negative binomial model
m1 <- glm.nb(count ~ child + camper, data = zinb)

## fit a zero-inflated negative binomial model
m1_zi <- zeroinfl(count ~ child + camper| persons,
               data = zinb, dist = "negbin", EM = TRUE)
## compare 2 models
vuong(m1, m1_zi)

有关更多信息,请参阅这个非常有用的教程

考虑一些模型如果我们想把变成一个零膨胀模型,那么我们定义等于的比例,等于的比例f(x)f(x)g(x)f(x)p01p

在这种情况下,这里有两个进程在起作用。一个进程只生成零,一个进程从生成结果。我的理解是,仅当存在仅生成零的替代过程时,零膨胀模型才适用。例如,如果您试图估计不同商店销售的小部件数量,但有些商店没有出售小部件,那么这里似乎有两个过程在起作用:一个只生成零的过程(那些不能销售的商店)小部件,因为他们从不库存小部件进行销售)和另一个产生不同价值的过程(那些库存小部件的商店,因此可以出售一些)。f(x)

与其进行“测试”来确定数据是否零膨胀,我建议确定是否有两个进程在工作 - 一个是工作中的零生成进程,另一个是生成非零的进程数字。如果考虑到您的数据上下文,这似乎是合理的,则使用零膨胀模型。如果考虑到您的数据上下文,它似乎不合理,那么零膨胀模型可能是不合适的,即使它看起来更适合您的数据。

(从我上面写的内容可能不清楚,但我想阐明两个进程都可以生成零的事实。 一个进程生成零,而另一个进程可以生成可能为零的不同值。例如,商店可以库存小部件并且恰好销售零小部件。这与不库存小部件的商店不同,因此默认情况下必须销售零小部件。)