R包DHARMa检测偏离正态性,即使混合模型拟合高斯生成的数据

gdx19jrr  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(145)
  • [主要编辑以斜体显示]*

使用R I从正态分布生成数据,但是,当我将随机截距混合效应模型拟合到它们时,* 正态性的Kolmogorov-Smirnoff检验和分位数-分位数图 * 都由RDHARMa执行,表明偏离正态性。为什么会这样?

测试1

  • 我生成了一组随机截距数据,其中重复次数和组内标准差随随机效应的每个水平而变化:*
rm(list=ls())
library(DHARMa)
library(glmmTMB)
library(ggplot2)

# "regression" with an 8-level RE with variable slopes:
set.seed(666)
ii=8 # parameter set size; no. groups
reps <- sample(x=8:12, size=ii, replace=T)
slope <- 3
intercept <- runif(ii, min = 70, max = 140)
group.sd <- runif(ii, min = 5, max = 15)
group.ID <- LETTERS[1:ii]

xx <- 1:15

out.list <- list() # empty list to store simulated data

for (i in 1:ii){
        df00 <- data.frame(Group=rep(group.ID[i], reps[i]*length(xx)),
                                    x=rep(xx, reps[i]))
        df00$y = intercept[i] + df00$x * slope + rnorm(length(df00[,1]), 0, group.sd[i])
        out.list[[i]] = df00
        }

# to turn out.list into a data.frame:
df <- do.call(rbind.data.frame, out.list)

# data visualisation
ggplot(df, aes(x = x, y = y, colour = Group)) + 
    geom_point() + geom_smooth(method="lm") + theme_classic()

如果我将随机截距模型拟合到我的数据集:

glmmTMB_ri <- glmmTMB(y~x + (1|Group), data=df)

以下是DHARMa生成的诊断图和测试:

mem1Resids <- simulateResiduals(glmmTMB_ri, n = length(df[, 1]) * 3)
par(mfrow = c(1, 2))
plotQQunif(mem1Resids)
mtext(text = "(a)", side = 3, adj = 0, line = 2)
plotResiduals(mem1Resids, quantreg = T)
mtext(text = "(b)", side = 3, adj = 0, line = 2)

测试2

  • 我认为问题可能是模拟残差的分辨率太低。* 通过simulateResiduals()将模拟观测值的数量从数据集大小的三倍增加到数据集大小的10倍并没有改善诊断图:

测试3

我认为问题可能不是DHARMa的设置,而是我的数据集 (可能太小或太可变)。 我生成了一个新的数据集,每个 * 随机 * 组具有***更大,统一的复制水平***(每组每个x值有40个观察结果),并且具有***更低,统一的组间变异性***(所有 * 随机 * 组的SD = 5):

reps <- rep(40, length.out=ii)
# let's also reduce and uniformise maximum within-group variability:
group.sd <- rep(5, ii)

out.list <- list() # empty list to store simulated data

for (i in 1:ii){
        df00 <- data.frame(Group=rep(group.ID[i], reps[i]*length(xx)),
                                    x=rep(xx, reps[i]))
        df00$y = intercept[i] + df00$x * slope + rnorm(length(df00[,1]), 0, group.sd[i])
        out.list[[i]] = df00
        }

# to turn out.list into a data.frame:
df2 <- do.call(rbind.data.frame, out.list)

# data visualisation
ggplot(df2, aes(x = x, y = y, colour = Group)) +
    geom_point() + geom_smooth(method="lm") + theme_classic()

如果我将随机截距模型拟合到我的新数据集:

glmmTMB_ri2 <- glmmTMB(y~x + (1|Group), data=df2)

以下是DHARMa生成的诊断图和测试:

mem2Resids <- simulateResiduals(glmmTMB_ri2, n = length(df2[, 1]) * 3)
par(mfrow = c(1, 2))
plotQQunif(mem2Resids)
mtext(text = "(a)", side = 3, adj = 0, line = 2)
plotResiduals(mem2Resids, quantreg = T)
mtext(text = "(b)", side = 3, adj = 0, line = 2)

如果有什么不同的话,诊断图显示的情况比以前更糟。
为什么DHARMa表明我的模型的残差分布的非正态性,即使我生成的数据是高斯分布?如果问题不在于样本量或DHARMa,也许我模拟的数据不正确,但似乎也不是这样。

xqkwcwgp

xqkwcwgp1#

免责声明:我是DHARMa的开发者。
首先,对于DHARMA特定问题,也请考虑使用我们的问题跟踪器https://github.com/florianhartig/DHARMa/issues
第二,关于您的问题/结果:当你用RE的不同SD进行模拟时,你违反了混合模型的假设,混合模型假设RE来自具有共同标准差的正态分布。
因此,我不确定:你为什么担心我想说,DHARMa强调了这个问题,这是相当令人鼓舞的。
另外:如果您的问题是关于突出显示的具体原因-DHARMa默认是无条件重新模拟,即如果您将切换到以拟合的RE为条件的模拟,其更接近于标准残差检查,则问题可能不太明显。

biswetbf

biswetbf2#

这不是DHARMa实现中的错误,而是关于正态性检验的统计问题。
Kolmogorov-Smirnoff检验的结果是您所期望的。如果数据偏离H 0:数据是正态分布的。
由于您使用平均值0模拟这些值,并使用5到15 group.sd <- runif(ii, min = 5, max = 15)之间的标准差,因此如果它变“坏”,则sd约为15。此外,使用rnorm生成的样本越多,您将获得更多不属于正态分布的绝对数量的点,即使非正态点的概率和百分比保持不变,也会提高ks检验的功效(较大的N ->更多的检验功效)。
你可以阅读更多关于这一点:
https://stats.stackexchange.com/questions/333892/is-the-kolmogorov-smirnov-test-too-strict-if-the-sample-size-is-large
并查看这里讨论的建议替代方案:
https://stats.stackexchange.com/questions/465196/kolmogorov-smirnov-test-statistic-interpretation-with-large-samples

相关问题