使用mgcv拟合带共享惩罚的分层GAM(S/GS模型)时遇错误求助
解决分层GAM(模型S/GS)拟合错误的思路
错误根源分析
你的核心问题是语法使用错误,而非k值设置问题:
- 第一种尝试中,直接将因子变量
region放入s()的变量列表,s()默认处理连续变量的张量积,会对因子执行数值运算(如减法),触发‘-’ not meaningful for factors警告,进而导致后续错误。 - 第二种尝试中,不仅延续了因子变量的错误用法,还将
family参数错误嵌套在s()内部,同时对因子变量设置k=c(10,4)完全不符合mgcv的语法规则。
正确拟合模型S(共享惩罚分层GAM)的代码
Pedersen等人2019年提出的模型S,需要使用mgcv中的**因子平滑(bs="fs")**实现,这是专门为分组平滑设计的平滑类型,支持共享惩罚结构:
modS <- gam(occurrence ~ s(temp, region, bs = "fs", k = 10, m = c(2, 1)), family = binomial, data = df, method = "REML")
参数说明:
bs="fs":指定因子平滑,第一个变量为连续协变量temp,第二个为分组因子regionk=10:设置连续变量temp的基函数数量(分组因子的水平数由数据自动识别,无需额外设置)m=c(2,1):定义惩罚结构,实现组平滑曲线向全局曲线收缩的共享惩罚,对应Pedersen的模型S
拟合模型GS(全局+共享惩罚分层GAM)的代码
如果需要拟合GS模型,只需在模型S基础上添加全局平滑项:
modGS <- gam(occurrence ~ s(temp, k = 10) + s(temp, region, bs = "fs", k = 10, m = c(2, 1)), family = binomial, data = df, method = "REML")
额外检查项
- 确认
region是因子类型:用str(df$region)检查,若不是则用df$region <- as.factor(df$region)转换 - 对于10万条观测,
k=10的基函数数量兼顾拟合灵活性与计算效率,无需调整过大
内容的提问来源于stack exchange,提问作者aczich
相关产品推荐
相关产品推荐

