gmnl包拟合多分类Logit模型报错argument is not a matrix求助
gmnl包
t.default(x) : argument is not a matrix报错解决方案 核心原因
gmnl包最后一次更新为2020年,仅适配1.1-0及更早版本的mlogit包。新版本mlogit(1.2.0及以上)修改了mlogit.data()生成的对象结构,导致gmnl读取数据时无法正确识别为矩阵,触发报错。你用mixl包可以正常运行数据,也进一步验证了是包兼容性问题而非数据本身的问题。
修复方案
方案1:降级mlogit到兼容版本(最稳妥,成功率最高)
- 先卸载现有版本的mlogit和gmnl:
remove.packages(c("mlogit", "gmnl"))
- 安装1.1.0版本的mlogit,再重新安装gmnl:
# 未安装devtools的话先执行install.packages("devtools") library(devtools) install_version("mlogit", version = "1.1-0") install.packages("gmnl")
- 重启R会话后重新运行原有代码即可。
方案2:手动调整数据结构(不想改动现有包版本时使用)
在mlogit.data()生成df01后,添加两行代码清除数据的特殊属性:
# 强制转为纯数据框,清除tibble遗留属性 df01 <- as.data.frame(df01) # 确保所有自变量为数值型 model_cols <- c("MODE", "DWELLING", "SIZE", "COST", "DISTANCE") df01[model_cols] <- lapply(df01[model_cols], as.numeric)
调整完成后再运行gmnl估计代码即可。
替代分析方案
如果不想修复gmnl的兼容问题,可直接用成熟替代工具完成需求:
- 你已经验证过mixl包可正常运行该数据,mixl的混合Logit、潜在类别Logit估计结果和gmnl完全可比,且输出的支付意愿测算接口更完善,直接用mixl完成后续分析即可
- 也可使用mlogit包自带的
mlogit()函数,通过设置rpar参数完成随机参数/潜在类别离散选择模型估计,或者用flexmix包实现潜在类别模型估计
内容的提问来源于stack exchange,提问作者Bas
相关产品推荐
相关产品推荐

