如何在R的mlogit包中获取交互项的正确系数名称?
解决mlogit交互项系数名称显示问题
在使用R的mlogit包做多项logit回归时,加入个体特定变量的交互项(比如income*size)后,系数名称会出现重复,无法区分主效应和交互效应。比如用TravelMode数据复现的情况:
data("TravelMode", package = "AER") Tr2 <- TravelMode[-c(2, 7, 9),] model_travel <- mlogit(choice ~ 0 | income*size, Tr2) summary(model_travel)
输出的系数中会重复出现income:train这类名称,分不清哪个是income的主效应,哪个是income*size的交互效应:
Coefficients : Estimate Std. Error z-value Pr(>|z|) (Intercept):train 3.079774 0.929604 3.3130 0.000923 *** (Intercept):bus 2.608694 1.197038 2.1793 0.029310 * (Intercept):car 1.934101 1.064597 1.8167 0.069256 . income:train -0.100133 0.026481 -3.7814 0.000156 *** income:bus -0.074617 0.031675 -2.3557 0.018487 * income:car -0.076934 0.026126 -2.9448 0.003232 ** size:train -0.643083 0.475573 -1.3522 0.176302 size:bus -1.318797 0.753714 -1.7497 0.080165 . size:car -1.099769 0.574192 -1.9153 0.055450 . income:train 0.023946 0.013701 1.7477 0.080512 . income:bus 0.025389 0.019805 1.2820 0.199856 income:car 0.042375 0.014036 3.0190 0.002536 **
解决办法
方法1:手动构建交互项(推荐)
不要用*自动展开交互项,而是手动创建交互变量并在公式中显式指定,这样系数名称会清晰区分主效应和交互效应:
data("TravelMode", package = "AER") Tr2 <- TravelMode[-c(2, 7, 9),] # 手动生成交互项 Tr2$income_size <- Tr2$income * Tr2$size # 公式中明确写主效应+交互效应 model_travel <- mlogit(choice ~ 0 | income + size + income_size, Tr2) summary(model_travel)
此时系数会显示为income:xxx(主效应)、size:xxx(主效应)、income_size:xxx(交互效应),不会重复。
方法2:修改已拟合模型的系数名称
如果已经拟合好模型,直接修改系数的名称即可,不影响后续计算:
# 先拟合原模型 model_travel <- mlogit(choice ~ 0 | income*size, Tr2) # 获取当前系数名称 coef_names <- names(coef(model_travel)) # 把重复的income:xxx替换为income_size:xxx(对应交互项) coef_names[10:12] <- gsub("income:", "income_size:", coef_names[10:12]) # 重新赋值系数名称 names(model_travel$coefficients) <- coef_names # 查看修正后的结果 summary(model_travel)
注意事项
以上两种方法都不会改变模型的系数值和结构,完全不影响后续使用sandwich包的vcovCL计算聚类标准误,因为vcovCL是基于模型的系数矩阵和原始数据进行计算的,名称修正只是显示层面的调整。
内容的提问来源于stack exchange,提问作者Moe Izawa
相关产品推荐
相关产品推荐

