mlogit数据转换,R

时间:2019-02-27 10:54:33

标签: r mlogit

我有一个像这样的数据集:

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函数运行预期的回归?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将case_when()中的dplyrmutate()一起使用:

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
       ))