gratia包draw()绘图修正及空间变化长期趋势建模的R语法问题
解决bam模型中随空间变化的长期趋势建模与绘图问题
问题背景
需要建模模拟数据中随空间变化的长期趋势,并生成以Longitude为x轴、Latitude为y轴、按日历年CYR分面板的绘图。调整张量积项(ti)的变量顺序时出现如下报错:
Error in check.term(termi, rec) : bam can not discretize with this nesting structure
移除部分协变量可消除报错,但无法生成符合需求的绘图。
报错原因
- 张量积项(
ti)参数不匹配:原代码中ti包含3个变量,但d/bs/k的长度为2,违反mgcv的参数对应规则; discrete=TRUE模式限制:bam对张量积项的变量顺序和嵌套结构有严格要求,空间变量需优先于时间变量,否则离散化处理会触发嵌套结构错误;- 基函数与变量类型不匹配:未正确区分空间(2D)和时间(1D循环)的平滑需求。
修正后的R代码
library(mgcv) library(gratia) # 修正模型定义 m <- bam(occur ~ s(temp) + sal + s(DO) + sed_depth + water_depth + s(fCYR, bs = "re") + # 长期趋势随机效应 s(Longitude, Latitude, k = 50, bs = 'tp') + # 空间主效应 s(fSite, bs = "re") + # 重复测量随机效应 # 空间-时间交互项:随空间变化的长期趋势(核心修正) ti(Longitude, Latitude, CYR, d = c(2, 1), # 前2个变量为2D空间,第3个为1D时间 bs = c('tp', 'ds'), # 空间用薄板样条,时间用循环样条 k = c(50, 14)), # 空间基函数数量,时间基函数数量 data = toad, method = 'fREML', nthreads = 4, discrete = TRUE, family = binomial(link = "logit"), gamma = 1.5) # 生成符合需求的绘图:按CYR分面板,x=Longitude,y=Latitude draw(m, select = 7, # 对应修正后的ti项(需根据实际项数调整) scales = "fixed", # 固定各面板的坐标轴范围,便于空间趋势对比 ncol = 3) # 控制面板列数,可根据CYR数量灵活调整
关键修正说明
- 张量积项顺序:将
Longitude/Latitude放在ti的前两位,作为2D空间平滑组,CYR作为1D时间平滑组,匹配d/bs/k的参数长度与变量分组规则; - 基函数适配:空间变量用
tp(薄板样条)适配地理空间结构,时间变量CYR用ds(循环样条)适配年度周期性; - 绘图参数调整:
select需指定修正后的ti项序号(可通过summary(m)查看项的顺序),scales="fixed"保证各空间面板的坐标轴一致,避免因范围差异误导趋势判断。
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

