R语言nlme包带自相关误差混合效应模型如何检验ARMA假设
核心要检验的是组内标准化残差是否满足独立假设,注意不要直接用原始响应残差做检验,也不要跨组计算自相关——你在模型里指定了corARMA(form = ~x | group),自相关结构仅在同一group内生效,跨组观测默认独立。
方法1:nlme内置ACF法(最推荐,无额外依赖)
不要用基础R的acf()函数直接计算全样本残差的自相关,该函数不会识别模型的分组结构,会把不同组的残差拼接计算,结果完全失真。nlme包自带的ACF()方法针对混合模型做了适配,会自动按分组拆分残差,仅计算组内滞后自相关,还可以直接生成带置信区间的自相关图。
操作代码:
# 计算最多滞后10阶的组内标准化残差自相关,maxLag可根据你的数据观测密度调整 acf_res <- ACF(model, maxLag = 10, resType = "normalized") # 绘制自相关图,默认绘制95%置信区间 plot(acf_res, alpha = 0.05)
结果判断:如果所有滞后阶数的自相关系数都落在图中两条虚线标记的95%置信区间范围内,就可以认为残差不存在显著的剩余自相关。你也可以用同样的方法绘制无ARMA结构的对照模型ACF图,对比自相关的消除效果。
方法2:Durbin-Watson检验(针对一阶自相关)
如果你重点关注相邻观测的一阶自相关是否被消除,可以按组拆分标准化残差,逐组执行Durbin-Watson检验,避免跨组计算带来的偏差。
操作代码:
library(lmtest) # 合并标准化残差、分组、排序变量 resid_df <- data.frame( group = data$group, x = data$x, std_resid = residuals(model, type = "normalized") ) # 按组、x值排序,保证组内观测顺序和建模时一致 resid_df <- resid_df[order(resid_df$group, resid_df$x), ] # 逐组做DW检验 dw_pvalue <- by(resid_df, resid_df$group, function(subdf) { dwtest(std_resid ~ 1, data = subdf)$p.value }) # 查看各组检验p值的分布 summary(dw_pvalue)
结果判断:如果绝大多数组的检验p值都大于0.05,说明一阶自相关已被充分消除。
方法3:Ljung-Box检验(多阶自相关联合检验)
如果需要检验多个滞后阶数的自相关是否联合显著,可以逐组对标准化残差做Ljung-Box检验。注意要设置fitdf参数扣除ARMA结构估计消耗的自由度,你用的ARMA(1,1)结构估计了2个相关参数,所以fitdf=2。
操作代码:
lb_pvalue <- by(resid_df, resid_df$group, function(subdf) { Box.test( subdf$std_resid, lag = 10, # 和之前ACF的maxLag保持一致即可 type = "Ljung-Box", fitdf = 2 )$p.value }) summary(lb_pvalue)
结果判断:和DW检验一致,绝大多数组p值大于0.05即可认为无显著剩余自相关。
关键注意点:所有检验都必须使用
type = "normalized"的标准化残差,不能用默认的原始响应残差。原始残差没有经过随机效应和相关结构的变换,本身自带相关结构,用来检验会得到完全错误的结论。
内容的提问来源于stack exchange,提问作者Pibil

