R中嵌套multinom多分类模型如何保证样本量N及观测一致
R实现嵌套模型共用统一观测样本的方法
和Stata的e(sample)逻辑一致,你只需先获取变量最多、缺失最多(样本量最小)的模型的有效观测标记,所有后续模型都用该标记筛选数据即可,以下是适配你示例场景的两种实现方案:
方案1:提前筛选全变量无缺失样本(最简便)
提前整理所有嵌套模型用到的全部变量,直接筛选出无缺失的统一分析样本,所有模型共用该数据集即可:
library(palmerpenguins) library(nnet) library(modelsummary) # 列出所有模型用到的全部变量,生成无缺失样本标记 all_vars <- c("island", "bill_length_mm", "bill_depth_mm", "sex", "year") sample_keep <- complete.cases(penguins[, all_vars]) # 生成统一分析用数据集 penguins_analysis <- penguins[sample_keep, ] # 所有模型都使用筛选后的数据集拟合 multinom_islands <- list( "模型1" = multinom(island ~ bill_length_mm + bill_depth_mm, data = penguins_analysis, trace = FALSE, na.action = "na.exclude"), "模型2" = multinom(island ~ bill_length_mm + bill_depth_mm + sex + year, data = penguins_analysis, trace = FALSE, na.action = "na.exclude")) # 输出的两个模型样本量完全一致 modelsummary(multinom_islands, group = y.level + term ~ model, exponentiate = TRUE, stars = c("*"=.05, "**"=.01, "***"=0.001), title = "嵌套多分类回归模型预测企鹅所在岛屿", output = "markdown")
方案2:从已拟合的最复杂模型中提取样本标记(完全等价Stata e(sample)逻辑)
如果你已经先拟合了最复杂的模型,可以直接从模型对象中提取有效观测标记,用于后续样本筛选:
# 先拟合最复杂的模型(样本量最小) model2 <- multinom(island ~ bill_length_mm + bill_depth_mm + sex + year, data = penguins, trace = FALSE, na.action = na.exclude) # 提取该模型的有效观测标记,等价于Stata的gen e_sample = e(sample) # 通用方法:匹配模型拟合所用观测的行号 model2_rows <- as.integer(rownames(model.frame(model2))) sample_keep <- 1:nrow(penguins) %in% model2_rows # 后续所有模型都用该标记筛选数据 penguins_analysis <- penguins[sample_keep, ] model1 <- multinom(island ~ bill_length_mm + bill_depth_mm, data = penguins_analysis, trace = FALSE)
以上两种方法适配绝大多数R的回归模型对象,包括nnet::multinom、lm、glm、lme4::lmer等。你之前尝试用tidy()、augment()没有达到效果,是因为这两个函数默认仅返回模型拟合所用的观测对应结果,不会直接生成全数据集的筛选标记,用上述方法即可解决。
内容的提问来源于stack exchange,提问作者kaseyzapatka
相关产品推荐
相关产品推荐

