使用margins函数计算multinom多分类模型边际效应时出现‘jacobian %*% vcov: non-conformable arguments’错误的原因及解决方法
解决
margins()计算多分类模型边际效应时的矩阵不匹配错误 这个错误Error in jacobian %*% vcov : non-conformable arguments本质是矩阵乘法维度不匹配导致的,问题出在你调用multinom()的方式上:
nnet包的multinom()函数默认不会计算完整的Hessian矩阵,因此返回的方差协方差矩阵(vcov(test))只包含第一个非参考类别的系数协方差(维度4×4),但margins()计算边际效应时需要对应所有模型系数的完整vcov矩阵(你的模型有2个非参考类别,每个类别4个系数,所以需要8×8的vcov矩阵),两者维度不匹配就触发了这个错误。
解决步骤:
- 在训练
multinom模型时添加Hess=TRUE参数,强制计算完整的Hessian矩阵,从而生成完整的方差协方差矩阵:
ml <- read.dta("https://stats.idre.ucla.edu/stat/data/hsbdemo.dta") ml$prog2 <- relevel(ml$prog, ref = "academic") # 添加Hess=TRUE参数 test <- multinom(prog2 ~ ses + write, data = ml, Hess=TRUE) library(margins) margins(test) # 现在可以正常运行了
- 验证一下:运行
dim(vcov(test))会返回[1] 8 8,这就是对应所有8个模型系数的完整协方差矩阵,margins()可以正常进行矩阵运算了。
额外说明:
如果你不需要计算边际效应的标准误,也可以在调用margins()时指定vce="none",跳过vcov矩阵的运算,但这会丢失标准误信息,一般不推荐:
margins(test, vce="none")
内容的提问来源于stack exchange,提问作者cliu
相关产品推荐
相关产品推荐

