【问题标题】:mlogit data transformation, Rmlogit 数据转换,R
【发布时间】:2019-02-27 10:54:32
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 请分享用于创建VariableD 的代码和str(mlogitdataset) 的输出。

标签: r mlogit


【解决方案1】:

您可以将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
       ))

【讨论】:

  • 这允许我以我想要的方式构造变量 D,但是,当我使用它作为自变量运行 mlogit 回归时,我仍然收到错误消息:“data.frame 中的错误(lapply(index , function(x) x[drop = TRUE]), row.names = rownames(mydata)) : 提供的行名长度错误”知道如何解决这个问题吗?
  • 不幸的是,我对mlgit包不熟悉,但错误似乎是由不正确(或丢失)的行名引起的。在我的示例中,我们实际上没有创建任何行名,但这似乎是mlogit 正在寻找的东西,可能是为了连接属于同一观察的行?所以这似乎不是关于我们创建新变量的方式,而是更多关于mlogit 期望作为输入数据格式的格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2014-04-03
  • 2017-10-07
  • 1970-01-01
相关资源
最近更新 更多