确定均值差异的适当方法?

机器算法验证 r 假设检验 计数数据
2022-03-29 14:19:08

当猎物可用性发生变化时,我正在研究鸟类的呼叫率。所以有两组,一个控制组(没有操纵)和实验组(增加了猎物)。我有兴趣查看两个不同组之间的平均呼叫率是否存在差异,但也想包括其他因素(如环境因素),看看它们如何影响呼叫率。

我正在使用 R 进行分析,并且想知道是否有人对我可能想要使用的统计测试类型有任何见解?

2个回答

我会将调查期间的总呼叫次数建模为带有偏移量的 Poisson GLM。

什么是偏移量?是观察到的呼叫次数,是预期的呼叫次数,是第次调查的持续时间(以分钟为单位)。为回归矩阵,为回归系数的相关向量。yiλitiiXβ

不包括持续时间的模型如下所示:

yiPoisson(λi)log(λi)=xiTβ

上述等式将总调用率表示为协变量的函数。但是,如果样本之间的调查持续时间不同,则该模型将不正确。相反,我们想要:

yiPoisson(λi/ti)log(λi/ti)=xiTβ

相反,它将每分钟呼叫率建模为协变量的函数(基本上通过采样工作量标准化预期的呼叫次数)。重新排列:

log(λi/ti)=log(λi)log(ti)=xiTβlog(λi)=xiTβ+log(ti)

log(ti)被称为“偏移”或“曝光”。如果每个调查都具有相同的持续时间,则偏移量对于推理并不重要,但我将考虑一个不是这种情况的示例,以提供更一般的答案。

使用您的样本量,假设对照组的平均调用率为每分钟 6 次调用,而实验单元中的平均调用率为每分钟 4 次。此外,让我们假设调查分布在七个站点之间。

作为环境协变量的一个例子,我们还假设植被覆盖会影响调用率,因此植被覆盖率增加 1% 会导致每分钟调用率增加 0.001。

一些R代码提供一个例子:

## simulated data
set.seed(101)
treatment   <- rep(c(0, 1), c(200, 173)) # dummy variable for treatment
n.site      <- 7 # number of sites
site.effect <- rnorm(7, 0, 0.4) # site deviations 
site.labels <- sample(1:7, length(treatment), replace = T) # random site labels 
                                                           #   for surveys
intercept   <- log(6) # rate per minute in control
exp.effect  <- log(6)-log(4) # diff. between control and experimental unit, 
                             #   in calling rate per minute
veg.cover   <- rbeta(length(treatment), 0.3*7, 0.7*7)*100 # fake vegetation cover data
veg.effect  <- 0.001 # multiplicative effect of vegetation on calling rate
l.duration  <- log(rpois(length(treatment),20)) # logged survey duration (random)
lambda      <- exp(intercept + site.effect[site.labels] + treatment*exp.effect + 
                   veg.cover*veg.effect + l.duration) # linear predictor
y           <- rpois(length(treatment), lambda) # simulated response variable 
                                                #   (ie. total number of calls)
## fit model to data
# first ignoring site effects,
m0 <- glm(y ~ treatment + veg.cover + offset(l.duration), family = poisson)
# now with random site effects
library(lme4)
m1 <- glmer(y ~ treatment + veg.cover + offset(l.duration) + (1|site.labels), 
            family = poisson) # ignore warnings

summary(m1) 
## we recover accurate estimates for treatment effect, vegetation cover, 
## and a less accurate estimate of the variance of the site effect.
## note that the regression coefficients are on a log (ie. a multiplicative) scale

该函数offset()强制回归系数为 1。

您可能还需要考虑过度分散(当然,我通常包括过度分散)。这样做的一种方法是在对 的调用中包含个人级别的随机效应(本质上是乘法残差)glmer()

id <- 1:length(treatment)
glmer(y ~ treatment + veg.cover + offset(l.duration) + (1|site.labels) + (1|id), 
      family = poisson)

在这个例子中,个体水平随机效应的方差很小,因为我们没有在模拟响应中包含过度离散。但是,实际计数数据通常会过度分散 - 换句话说,响应中会有额外的变化,这可归因于未观察到的因素(即在您的情况下,未测量的因素可能包括额外的环境变量、生物因素、人口密度、观察者效应等)

假设相当大(每组可能有 35 个或更多),那么您可以使用检验,假设方差是两组都同样大。 Nt

这是有道理的,因为您是随机的,所以我们不会期望一个观察值的方差在不同组之间系统地不同。

要在 R 中运行它,请参阅:

http://www.stat.columbia.edu/~martin/W2024/R2.pdf