我有一个数据集,如下所示:
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 结果变量可以取值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函数运行预期的回归?
谢谢!
发布于 2019-02-27 19:26:21
您可以将dplyr中的case_when()与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
))https://stackoverflow.com/questions/54903819
复制相似问题