R语言多项逻辑回归出现‘groups are empty’警告求助
解决R语言多项逻辑回归的空分组警告问题
问题根源
你遇到的警告是因为原始数据中的id是因子类型——虽然你通过子集化删除了a/b/c/d对应的观测,但因子变量的「水平(levels)」并没有自动删除。这些空水平依然存在于数据的因子属性中,当multinom建模时检测到训练集里这些水平没有对应数据,就会抛出警告。
你可以先运行以下代码验证这一点:
levels(train$id)
输出里肯定还能看到a/b/c/d这几个水平。
解决方法
方法1:子集化后清理因子水平
在子集化数据后,用droplevels()函数移除没有观测的空因子水平,再进行抽样和建模:
# 子集化数据 data <- subset(data, !(id %in% c('a','b', 'c', 'd'))) # 清理空因子水平 data$id <- droplevels(data$id) # 后续抽样与建模步骤 set.seed(1) sample <- sample(c(TRUE, FALSE), nrow(data), replace=TRUE, prob=c(0.7,0.3)) train <- data[sample, ] test <- data[!sample, ] model <- multinom(id ~ x + y + z, data=train, maxit = 1000)
方法2:直接转换为字符再转回因子
如果确认不再需要旧的因子水平,可以将id先转成字符型,再重新转为因子,自动过滤空水平:
data$id <- as.factor(as.character(data$id))
方法3:建模前单独处理训练集
如果不想修改原始子集化后的data,也可以在建模前单独清理训练集的id因子水平:
train$id <- droplevels(train$id) model <- multinom(id ~ x + y + z, data=train, maxit = 1000)
预防措施
后续处理因子型变量时,只要做了子集化、筛选等删除部分观测的操作,都建议用droplevels()清理无效水平,避免类似的警告或分析误差。
内容的提问来源于stack exchange,提问作者BeginnersMindTruly
相关产品推荐
相关产品推荐

