首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mlogit数据转换,R

mlogit数据转换,R
EN

Stack Overflow用户
提问于 2019-02-27 18:54:33
回答 1查看 692关注 0票数 1

我有一个数据集,如下所示:

代码语言:javascript
复制
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中实现该模型。我已经使用以下代码转换了我的数据:

代码语言:javascript
复制
mlogitdataset <- mlogit.data(dataset, choice = "Outcome", shape="wide")

这为我提供了以下新的数据集:

代码语言:javascript
复制
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表示:

代码语言:javascript
复制
 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回归:

代码语言:javascript
复制
mlog <- mlogit(Outcome ~ 1 | VariableD, data=mlogitdataset, reflevel = "0") 

我尝试使用以下代码在mlogit对象(mlogitdataset)中直接创建VariableD:

代码语言:javascript
复制
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函数运行预期的回归?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-02-27 19:26:21

您可以将dplyr中的case_when()mutate()一起使用

代码语言:javascript
复制
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
       ))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54903819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档