使用marginaleffects对multinom模型做联合假设检验报错咨询
多分类逻辑回归预测概率联合检验的问题解决办法
问题场景
使用nnet::multinom()拟合了一个多分类逻辑回归模型,因变量包含3个类别,仅纳入1个预测变量,目标是对因变量某一特定类别的预测概率(针对预测变量的特定取值计算)做联合原假设检验,但执行代码时遇到样本量提取错误,单独检验可正常运行但无法完成联合检验。
原代码
library(nnet) library(marginaleffects) mod <- multinom(factor(gear) ~ mpg, data = mtcars, trace = FALSE) # 拟合模型 pred <- predictions(mod, newdata = data.frame(mpg = c(10, 20, 25))) # 计算预测变量特定取值下的预测概率 hypotheses(pred, hypothesis = c("b1 = b2", "b1 = b3"), joint = TRUE) # 联合检验第一类别的概率相等原假设
报错信息
Error: Could not extract sample size from model object.
单独运行以下代码仅能完成单个假设的检验,无法实现联合检验:
hypotheses(pred, hypothesis = c("b1 = b2", "b1 = b3"))
解决办法
方案1:手动指定样本量与自由度
marginaleffects无法自动从multinom模型中提取样本量用于联合检验,可手动获取样本量并指定自由度,同时传入预测概率的方差-协方差矩阵:
library(nnet) library(marginaleffects) mod <- multinom(factor(gear) ~ mpg, data = mtcars, trace = FALSE) pred <- predictions(mod, newdata = data.frame(mpg = c(10, 20, 25))) # 获取样本量 n <- nrow(mtcars) # 提取预测概率的方差-协方差矩阵 vc <- vcov(pred) # 执行联合检验,指定自由度为样本量减去模型自由度 hypotheses(pred, hypothesis = c("b1 = b2", "b1 = b3"), joint = TRUE, vcov = vc, df = n - mod$rank)
方案2:使用emmeans包实现联合检验
emmeans包对多分类模型的预测概率检验支持更友好,可直接针对特定类别和预测变量取值构建联合假设:
library(nnet) library(emmeans) mod <- multinom(factor(gear) ~ mpg, data = mtcars, trace = FALSE) # 获取mpg取10、20、25时,gear类别为"3"的预测概率(category参数根据实际类别调整) emm <- emmeans(mod, ~ mpg, at = list(mpg = c(10, 20, 25)), type = "response", category = "3") # 构建联合对比:检验三个取值下的概率是否相等 joint_test <- contrast(emm, list( "10 vs 20" = c(1, -1, 0), "10 vs 25" = c(1, 0, -1) ), joint = TRUE) # 查看联合检验结果 print(joint_test)
内容的提问来源于stack exchange,提问作者ASt
相关产品推荐
相关产品推荐

