使用mlogit拟合随机截距多项logit模型时varying参数报错求助
随机截距多项logit模型数据转换报错解决
问题描述
尝试运行随机截距多项logit模型,使用的数据集如下:
| ID | Resolution | STATE | Index_1 | Index_2 |
|---|---|---|---|---|
| 6 | Settled | Indiana | 43.3267816 | 49.2 |
| 8 | Settled | Delaware | 72.6980536 | 48.5 |
| 9 | Dismissed | Delaware | 72.6980536 | 48.5 |
| 10 | Settled | New York | 72.0173234 | 48.4 |
| 11 | Stay | Texas | 84.8092534 | 49.8 |
其中结果变量为Resolution,Index_1和Index_2嵌套在State中。使用mlogit.data转换数据时,无论设置shape="wide"还是"long",均报错:
Error in guess(varying) : failed to guess time-varying variables from their names
使用的代码:
mlogit_data <- mlogit.data(data, shape = "wide", choice = "_Resolution", varying = 3:5, alt.levels = NULL)
问题原因与解决方法
核心错误点
- choice参数名错误:代码中写的
"_Resolution"多了下划线,实际数据中的结果变量名为Resolution,导致函数无法定位目标变量。 - varying参数误用:
varying用于指定不同备选方案对应的变量列,但当前数据是长格式(每行对应一个个体的选择记录),Index_1、Index_2是个体层面属性,并非分备选方案的变量,完全不需要设置这个参数。 - shape参数判断错误:原始数据已经是长格式,不需要强行指定
shape="wide"。
修正后的代码
步骤1:转换数据格式
# 提取所有备选方案的水平 alt_levels <- unique(data$Resolution) # 转换为mlogit所需格式 mlogit_data <- mlogit.data(data, shape = "long", choice = "Resolution", # 使用正确的变量名 alt.levels = alt_levels, id.var = "ID") # 指定个体ID变量
步骤2:验证转换结果
执行head(mlogit_data)查看转换后的数据结构,确认是否符合mlogit的要求。
步骤3:拟合随机截距多项logit模型
可以用lme4包的glmer函数实现随机截距模型:
library(lme4) model <- glmer(Resolution ~ Index_1 + Index_2 + (1 | STATE), data = data, family = multinomial(link = "logit"))
额外说明
只有当数据是宽格式(每行对应一个个体,列对应不同备选方案的属性)时,才需要设置shape="wide"并配合varying参数。当前数据属于标准长格式,无需额外指定备选方案变量列。
内容的提问来源于stack exchange,提问作者mmm coder
相关产品推荐
相关产品推荐

