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

R语言mgcv包multinomial GAM参考水平类别缺失的非换参解决方案问询

在mgcv中处理多分类GAM的参考水平类别缺失问题

问题说明

我使用R语言的mgcv包构建多分类广义可加模型(GAM),拟合代码如下:

library(mgcv)

multinom = gam(list(sound ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat),
                          ~ word + s(long, lat)),
                          data=pronunciation, method="ML", optimizer="efs", family=multinom(K=5))

其中:

  • sound为数值型变量,取值0-5,共6个类别;
  • word为分类变量,包含6个类别,要求将word的第一个类别(alpha)设为参考水平;
  • 但参考水平word=alpha中没有sound=3(对应数值2)的样本,出现次数为0。

模型仅在使用optimizer="efs"或optimizer=c("outer","bfgs")时可运行,但针对参考水平缺失的sound类别,会输出不切实际的结果。想寻找无需将参考水平更换为包含所有sound类别的word类别的解决办法。

模拟数据代码

以下代码用于复现问题:将word=alpha中的sound=3(数值2)替换为sound=4(数值3),制造参考水平缺失sound类别的场景:

sound         <- sample(0:5, size=960, replace=T)
word          <- as.factor(rep(c('alpha', 'bravo', 'charlie', 'delta', 'echo', 'foxtrot'), each=4))
age           <- as.factor(rep(c('young', 'old'), times=480))
gender        <- as.factor(rep(c('female', 'female', 'male', 'male'), times=240))
long          <- rep(c(runif(40)), each=24)
lat           <- rep(c(runif(40)), each=24)
pronunciation <- data.frame(sound, word, age, gender, long, lat)

pronunciation$sound[pronunciation$word == "alpha" & pronunciation$sound == 2] = 3

可行解决方法

1. 添加极小权重的伪数据

给参考水平缺失的word-sound组合添加少量伪数据,并设置极小权重,既不影响模型拟合结果,又能让模型识别该类别的参数,避免数值不稳定:

# 生成伪数据:对应word=alpha、sound=2的组合
fake_data <- data.frame(
  sound = 2,
  word = "alpha",
  age = sample(c("young", "old"), 3, replace = TRUE),
  gender = sample(c("female", "male"), 3, replace = TRUE),
  long = runif(3),
  lat = runif(3),
  weight = 1e-6  # 极小权重
)

# 给原数据设置权重为1
pronunciation$weight <- 1

# 合并原数据与伪数据
full_data <- rbind(pronunciation, fake_data)

# 拟合模型时指定权重参数
multinom <- gam(list(
  sound ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat)
), data = full_data, method = "ML", optimizer = "efs", 
family = multinom(K=5), weights = full_data$weight)

2. 使用bam函数替代gam

bam是mgcv中针对大数据优化的拟合函数,其优化器对参数识别问题的鲁棒性更强,可尝试直接拟合:

multinom_bam <- bam(list(
  sound ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat)
), data = pronunciation, method = "ML", optimizer = "efs", 
family = multinom(K=5))

3. 调整优化器控制参数

通过gam.control调整优化器的收敛阈值和迭代设置,缓解因参数无法识别导致的不合理结果:

multinom <- gam(list(
  sound ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat),
  ~ word + s(long, lat)
), data = pronunciation, method = "ML", optimizer = "efs", 
family = multinom(K=5), control = gam.control(trace = 0, epsilon = 1e-8))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:38:11