使用mlogit函数报错‘replacement has 8 rows, data has 9’求助
问题原因与解决方案
错误原因
你遇到的replacement has 8 rows, data has 9错误,核心是模型公式设定错误:
你将object_id(产品标识)和price(产品-个体层面变量)放到了公式中|的右侧,这部分是用来定义仅随个体变化的变量的,但price是随个体和产品共同变化的,object_id是产品属性而非个体属性。mlogit在处理这部分变量时,会尝试为每个个体生成单一值,但每个个体对应多个产品,导致内部生成的变量行数与原数据的9行不匹配,触发替换行数错误。
解决方案
你的目标是估计price的系数β和各产品的固定效应fixed_effect_j,需要根据mlogit的公式规则,正确区分变量类型:
price属于备选方案-个体层面变量(随个体i和产品j变化),应放在~之后、第一个|之前;- 产品固定效应属于备选方案层面变量(仅随产品j变化),可通过公式第三部分(第二个
|之后)指定,或直接作为分类变量纳入公式。
修正后的代码示例
方式一:用公式第三部分指定产品固定效应
library(mlogit) library(data.table) # 示例数据 temp <- data.table( session_id = c(1, 1, 2, 2, 2, 3, 3, 3, 3), object_id = c(1, 2, 1, 2, 3, 1, 2, 3, 4), chosen = c(0, 1, 1, 0, 0, 0, 1, 0, 0), price = c(10, 20, 30, 25, 20, 15, 30, 25, 10) ) # 转换为mlogit专用格式(可选,让数据结构更清晰) temp_mlogit <- mlogit.data(temp, shape = "long", choice = "chosen", alt.var = "object_id", id.var = "session_id") # 拟合模型:price在第一部分,产品固定效应在第三部分 formula <- chosen ~ price | 0 | object_id model <- mlogit(formula, data = temp_mlogit) # 查看估计结果 summary(model)
方式二:将object_id作为分类变量纳入公式
# 拟合模型:直接将object_id作为分类变量,去掉基准组以保留所有产品固定效应 formula <- chosen ~ price + factor(object_id) - 1 model <- mlogit(formula, data = temp_mlogit) # 查看估计结果 summary(model)
说明
两种方式都能得到你需要的β系数和各产品的固定效应,结果等价。方式一更贴合mlogit的变量类型区分逻辑,方式二通过分类变量直接实现固定效应估计,更直观。
内容的提问来源于stack exchange,提问作者user20380762
相关产品推荐
相关产品推荐

