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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:55:57