在mgcv的使用-可获得性设计中,如何为二项BAM仅对存在点设置AR1结构?
仅对存在点纳入AR1结构的使用-可获得性模型构建方案
一、直接通过bam的AR.start参数实现需求
核心思路是让仅存在点的觅食行程形成连续时间序列,控制点则被标记为独立序列的起点(无后续观测,自然不会产生自相关)。具体步骤如下:
标记存在/控制点并构建序列起点标记列
# 假设数据中type列区分存在点("used")和控制点("available") dat$used <- as.integer(dat$type == "used") # 构建AR.start列:标记每个时间序列的起点 dat$ar_start <- FALSE # 存在点:每个觅食行程的第一个观测设为序列起点 dat$ar_start[dat$used == 1 & !duplicated(dat$trip_id)] <- TRUE # 控制点:每个单独设为序列起点(无后续观测,AR1无作用) dat$ar_start[dat$used == 0] <- TRUE拟合带AR1结构的
bam模型library(mgcv) # 权重设置:存在点权重1,控制点权重0.2(5个等价1个) dat$weight <- ifelse(dat$used == 1, 1, 1/5) # 拟合模型 final_model <- bam( used ~ s(cov1) + s(cov2) + s(individual, bs = "re") + ti(cov1, cov2), data = dat, family = binomial(), weights = dat$weight, rho = NULL, # 留空让模型自动估计AR1系数,也可指定初始值如0.7 AR.start = dat$ar_start )原理:
AR.start标记后,AR1自相关仅在同一序列内的连续观测间生效。控制点每个都是独立序列,无后续观测,因此不会引入自相关;存在点则按觅食行程形成序列,仅在同行程内的存在点间计算自相关。
二、替代方案:使用gamm结合corAR1相关结构
若bam的方案效果不佳,可尝试gamm(mgcv中混合模型接口),通过自定义相关分组实现仅存在点的自相关:
构建相关分组变量
# 存在点用觅食行程ID作为分组,控制点用唯一ID(每个单独分组) dat$cor_group <- ifelse( dat$used == 1, as.character(dat$trip_id), paste0("ctrl_", seq_len(nrow(dat))) )拟合带
corAR1的混合模型library(nlme) # 定义AR1相关结构:仅在同一cor_group内生效 ar1_cor <- corAR1(form = ~ 1 | cor_group) gamm_model <- gamm( used ~ s(cov1) + s(cov2) + s(individual, bs = "re") + ti(cov1, cov2), data = dat, family = binomial(), weights = dat$weight, correlation = ar1_cor )原理:控制点的分组唯一,每个分组仅含1个观测,
corAR1无法计算自相关;存在点的分组为觅食行程,同组内的观测会应用AR1结构。
三、模型诊断建议
拟合后需验证残差自相关是否改善:
# 提取存在点的Pearson残差 used_resid <- resid(final_model, type = "pearson")[dat$used == 1] # 按觅食行程分组绘制ACF by(used_resid, dat$trip_id[dat$used == 1], acf, plot = TRUE)
内容的提问来源于stack exchange,提问作者Matt Carter
相关产品推荐
相关产品推荐

