You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何DHARMa对高斯生成数据的混合模型检测出正态性偏离?

为何模拟的高斯数据拟合随机截距模型后,DHARMa诊断显示残差偏离正态?

我使用R生成了正态分布数据,但对其拟合随机截距混合效应模型后,R包DHARMa执行的Kolmogorov-Smirnoff正态性检验和分位数-分位数图均显示数据偏离正态分布。这是为什么?

测试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()

测试1数据可视化图

我对数据集拟合随机截距模型:

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)

测试1诊断图

测试2

我猜测问题可能是模拟残差的分辨率过低。 将simulateResiduals()生成的模拟观测数从数据集大小的3倍增加到10倍后,诊断图并未改善:

测试2诊断图

测试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()

测试3数据可视化图

我对新数据集拟合随机截距模型:

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)

测试3诊断图

诊断图显示情况甚至比之前更差。为何我生成的是高斯数据,DHARMa却显示模型残差分布偏离正态?若问题不在样本量或DHARMa,难道是我模拟数据的方式有误?但看起来并非如此。


内容的提问来源于stack exchange,提问作者Marco Plebani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:20:22