You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于R语言mgcv包构建含三交互与随机项的GAM模型求助

用mgcv构建包含分类-分类-连续三向交互的GAM模型

核心思路

你需要的x1(分类)× x2(分类)× s(x3)(连续光滑)三向交互,本质是让x1和x2的每一个水平组合,都对应一条独立的x3光滑曲线。在mgcv中,利用by参数结合分类变量的交互项是最直接的实现方式,不需要用te/ti(这两个是用于连续变量间的张量积光滑,不适合分类变量场景)。

正确模型写法

简洁版(推荐)

library(mgcv)
# 假设你的数据集名为dat
model <- gam(y ~ x1 * x2 + s(x3, by = x1:x2) + 
               s(x4, bs = "re") + s(x3, x4, bs = "re"),
             data = dat)
  • x1 * x2:自动展开为x1 + x2 + x1:x2,包含x1、x2的主效应及二者的二向固定交互
  • s(x3, by = x1:x2):为x1和x2的每一个水平组合,拟合独立的x3光滑曲线,这就是你要的三向交互
  • s(x4, bs = "re"):x4的随机截距效应
  • s(x3, x4, bs = "re"):x4关于x3的随机斜率效应(每个x4水平对应独立的x3线性系数)

显式低阶项版

如果你想明确写出所有低阶组件,也可以这样写(和上面的模型等价,参数化方式不同):

model <- gam(y ~ x1 + x2 + x1:x2 + s(x3, by = x1:x2) +
               s(x4, bs = "re") + s(x3, x4, bs = "re"),
             data = dat)

纠正你之前的误区

  1. 你写的gam(y ~ x1 + x2 + x1:x2 + s(x3))没有实现三向交互:这里的s(x3)是全局光滑曲线,和x1、x2无关,只是同时纳入了x1-x2的二向交互和全局x3效应。
  2. s(x3, by='x1')或s(x3, by='x2')只能实现二向交互(x1×s(x3)或x2×s(x3)),无法覆盖x1和x2共同组合的差异,因此不等于三向交互。

注意事项

如果x1和x2的水平数较多,二者的组合数会快速增加(比如x1有3个水平、x2有4个水平,就会产生12组光滑曲线),此时需要确保样本量足够支撑模型拟合,避免过拟合。

内容的提问来源于stack exchange,提问作者Jim H

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:13:20