我有一个像这样的数据集:
Observation Outcome VariableA VariableB VariableC
1 1 1.27 0.2 0.81
2 0 0.30 0.45 0.70
3 -1 0.27 1.2 0.56
Outcome变量可以取值1、0,-1,并且应该是多项式logit模型中的因变量,我将使用mlogit包在R中实现该模型。我已使用以下代码转换了数据:
mlogitdataset <- mlogit.data(dataset, choice = "Outcome", shape="wide")
为我提供了以下新数据集:
Observation Outcome VariableA VariableB VariableC alt
1 FALSE 1.27 0.2 0.81 -1
1 FALSE 1.27 0.2 0.81 0
1 TRUE 1.27 0.2 0.81 1
2 FALSE 0.20 0.45 0.70 -1
2 TRUE 0.20 0.45 0.70 0
2 FALSE 0.20 0.45 0.70 1
从本质上讲,这就是我希望结构化数据的方式,但是,在多项式logit回归中,我不想将VariableA-C用作独立的独立变量。相反,我希望自变量根据alt的值采用变量A,B或C的值。可以通过下表中的VariableD来表示:
Observation Outcome VariableA VariableB VariableC alt VariableD
1 FALSE 1.27 0.20 0.81 -1 0.81
1 FALSE 1.27 0.20 0.81 0 0.20
1 TRUE 1.27 0.20 0.81 1 1.27
2 FALSE 0.20 0.45 0.70 -1 0.70
2 TRUE 0.20 0.45 0.70 0 0.45
2 FALSE 0.20 0.45 0.70 1 0.20
这将允许我运行多项式logit回归:
mlog <- mlogit(Outcome ~ 1 | VariableD, data=mlogitdataset, reflevel = "0")
我尝试使用以下代码直接在mlogit对象(mlogitdataset)中创建VariableD:
outcome_map <- data.frame(alt = c(1, 0, -1), var = grep('Variable[A-C]', names(mlogitdataset)))
mlogitdataset$VariableD <- mlogitdataset[cbind(seq_len(nrow(mlogitdataset)), with(outcome_map, var[match(mlogitdataset$alt, alt)]))]
但是,当尝试运行多项式logit回归时,这会给我错误消息“所提供的行名长度错误”。
我应该如何转换/格式化/结构化数据,以便可以使用mlogit函数运行预期的回归?
谢谢!
答案 0 :(得分:1)
您可以将case_when()
中的dplyr
与mutate()
一起使用:
library(dplyr)
mlogitdataset <- read.csv(text = "Observation,Outcome,VariableA,VariableB,VariableC,alt
1,FALSE,1.27,0.20,0.81,-1
1,FALSE,1.27,0.20,0.81,0
1,TRUE,1.27,0.20,0.81,1
2,FALSE,0.20,0.45,0.70,-1
2,TRUE,0.20,0.45,0.70,0
2,FALSE,0.20,0.45,0.70,1")
mlogitdataset <- mutate(mlogitdataset,
VariableD = case_when(
alt == -1 ~ VariableC,
alt == 0 ~ VariableB,
alt == 1 ~ VariableA
))