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
相关产品推荐
相关产品推荐

