如何在GAM框架中仅当虚拟变量为TRUE时估计平滑效应?
在GAM中仅对特定子集拟合平滑项(针对夜间月光效应场景)
要实现仅当isnight == TRUE时估计月光占比的非线性平滑效应,你可以利用mgcv包中s()函数的by参数,这是最直接且符合GAM语法的方案:
核心实现代码
m2 <- gam(activity ~ s(hourofday, bs = "cr", k = 10) + # 昼夜节律平滑项 s(moonfraction, bs = "cr", k = 8, by = isnight) + # 仅夜间生效的月光平滑项 s(id, bs = "re"), # 个体随机效应 data = df, family = "binomial")
原理说明
by = isnight参数会让月光的平滑项s(moonfraction)的效应与isnight变量相乘:- 对于白天样本(
isnight = 0),该平滑项的贡献直接为0,完全不参与模型拟合; - 对于夜间样本(
isnight = 1),平滑项会正常估计月光占比与活动概率之间的非线性关系,完全匹配你的研究假设。
- 对于白天样本(
注意事项
- 确保
isnight是数值型(0/1)或二分类因子,mgcv会自动识别并处理by变量的作用; - 可根据数据量和预期的非线性程度调整
k值(平滑项的基函数数量),k越大允许的非线性越复杂,但也可能增加过拟合风险; - 如果需要研究夜间时段下昼夜节律与月光的联合效应,可进一步扩展为
s(hourofday, moonfraction, by = isnight),拟合二者的交互平滑项。
内容的提问来源于stack exchange,提问作者HammerKop
相关产品推荐
相关产品推荐

