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

如何在R的mgcv包GAM模型中为X添加正单调约束?

为mgcv的GAM模型添加X的正单调约束:可行且实现方法

当然可行,mgcv包支持为P-spline(bs="ps")或立方回归样条(bs="cr")添加单调约束,正好你已经用了ps类型的光滑项,直接借助mono.con()生成约束矩阵即可实现。具体步骤如下:

1. 生成单调约束矩阵

mono.con()的作用是生成针对光滑项参数的线性约束矩阵,确保拟合的光滑函数满足单调递增/递减要求。针对你的需求(正单调=递增),代码如下:

# 基于X的取值生成正单调约束矩阵
con <- mono.con(X = df$X, increasing = TRUE)
  • increasing = TRUE 指定函数随X递增(正单调),若需递减则设为FALSE
  • 传入df$X是因为函数需要根据X的实际取值顺序构建约束,保证单调性的方向与X的取值逻辑一致

2. 在GAM模型中应用约束

将生成的约束矩阵通过gam()的constraint参数传入,注意要对应到目标光滑项s(X):

# 构建约束列表,指定第一个光滑项(s(X))使用上述约束
constraints_list <- list("s(X)" = con$A)

# 拟合带单调约束的GAM模型
gamm_model <- gam(Y ~ s(X, bs = "ps") + B + C + s(D, bs = 're') + s(E, bs = 're'),
                  data = df,
                  constraint = constraints_list)

summary(gamm_model)

3. 验证约束是否生效

你可以通过以下方式确认约束生效:

  • 绘制光滑项曲线:plot(gamm_model, select = 1)(select=1对应第一个光滑项s(X)),观察曲线是否呈递增趋势
  • 查看模型输出:summary(gamm_model)中会显示约束的相关信息,确认约束已被应用

注意:只有ps、cr类型的光滑项支持这种单调约束,你模型中的随机效应项s(D, bs='re')、s(E, bs='re')不受影响,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 04:46:08