使用gratia::data_slice()处理含offset的GAM模型遇错求助
解决gratia包data_slice()处理带offset的GAM模型报错问题
我使用GitHub版本的gratia包,尝试从带有offset的GAM模型中提取拟合值,但调用data_slice()时遇到报错。
场景复现
数据集定义:
df <- data.frame(...)
构建的GAM模型:
gam <- gam(Landings~s(per.change)+offset(log(lmb_eff)), data=df)
执行以下代码时触发错误:
ds <- data_slice(gam, per.change = evenly(per.change, n = 100), Season = evenly(Season), lmb_eff=1)
错误信息:
Error in eval(predvars, data, env) : object 'lmb_eff' not found
解决方案
gratia的data_slice()针对offset有专门的参数配置方式,不需要直接传入offset对应的原始变量(比如lmb_eff),而是通过offset参数直接指定offset的计算值:
- 当你想固定
lmb_eff=1时,对应的offset值为log(1)=0,可以直接设置:
ds <- data_slice(gam, per.change = evenly(per.change, n = 100), Season = evenly(Season), offset = 0)
- 如果需要基于不同
lmb_eff值计算offset,也可以直接传入计算后的offset向量,比如:
# 假设要测试lmb_eff从1到10的情况 lmb_vals <- seq(1,10, by=1) ds <- data_slice(gam, per.change = evenly(per.change, n = 100), Season = evenly(Season), offset = log(lmb_vals))
之后就可以正常用fitted_values()处理生成的切片数据:
fv <- fitted_values(gam, data = ds)
注意:如果你的模型公式中没有包含Season变量,data_slice()里指定Season = evenly(Season)可能会生成多余的列,但不会影响拟合值计算;如果不需要按Season分组,可去掉该参数。
内容的提问来源于stack exchange,提问作者David Smith
相关产品推荐
相关产品推荐

