【问题标题】:Error with levels using mlogit in R在 R 中使用 mlogit 的级别出错
【发布时间】:2018-01-23 00:20:51
【问题描述】:

我在关卡方面遇到了一些问题...运行以下命令:

library(mlogit)

panel.datasm = data.frame(
    cbind( 
        round(runif(100, min=1, max=6)), 
        rep(1:20,each=5), runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6) , 
        runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6)  ))
names(panel.datasm) = c("choice", "id", "data_1991","data_1992",
  "data_1993", "data2_1991", "data2_1992","data2_1993") 


logit.data <- mlogit.data(panel.datasm, id = "id", choice = "choice", 
    varying= 3:5, shape = "wide", sep = "_")

不断收到错误Error in Ops.factor(data[[choice]], alt) : level sets of factors are different

我也尝试过手动分配级别:

panel.datasm$id= factor(
    panel.datasm$id, 
    levels = sort(as.character(unique(panel.datasm$id)))  )

我尝试了很多方法,但无法弄清楚出了什么问题。为了比较,请看:

data("Electricity", package = "mlogit")
head(Electricity)
Electr <- mlogit.data(Electricity, id = "id", choice = "choice", 
    varying = 3:26, shape = "wide", sep = "")

据我所知,这与我的数据格式相同。这里发生了什么?我已经走到了尽头。

【问题讨论】:

  • 我一直无法让mlogit 的自动重塑工作。因此,我不得不手动重塑我的数据以创建所需的长格式。祝你好运。
  • 附言。感谢您提出这个问题。在开始学习 R 后不久,我试图理解 mlogit。我无法理解代码的开头或结尾。据我所知,该代码有效并且在算法上是正确的,但从用户的角度来看并不是特别健壮。你的问题促使我再次研究mlogit
  • 也许你还想用varying= c(data=3:5, data2=6:8)区分datadata2
  • 感谢所有帮助。我现在就试试看!

标签: r levels


【解决方案1】:

我相信我已经找到了问题所在。您的choice 变量和您的alternative 变量应该相同。

如果您将data.frame 的第一列更改为1991:1993 之间的值,它将起作用。

panel.datasm = data.frame(
    cbind( 
        sample(1991:1993, 100, replace=TRUE), 
        rep(1:20,each=5), runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6) , 
        runif(100, min=0, max=1), 
        runif(100, min=0, max=6), 
        runif(100, min=2, max=6)  ))
names(panel.datasm) = c("choice", "id", "data_1991","data_1992",
    "data_1993", "data2_1991", "data2_1992","data2_1993") 


logit.data <- mlogit.data(panel.datasm, id = "id", choice = "choice", 
    varying= 3:5, shape = "wide", sep = "_") 

结果:

head(logit.data)
       choice id  alt       data     data2 chid
1.1991  FALSE  1 1991 0.03540498 0.9726110    1
1.1992  FALSE  1 1992 5.85285278 2.7973798    1
1.1993   TRUE  1 1993 5.80795641 3.7360297    1
2.1991   TRUE  1 1991 0.59255235 0.2564928    2
2.1992  FALSE  1 1992 5.81443351 3.0820215    2
2.1993  FALSE  1 1993 2.11699854 5.4161634    2

如果现在将其与Electricity 进行比较,差异就很明显了。请注意,选项是1:4,每个选项的范围从 1 到 4。

head(Electricity)
  choice id pf1 pf2 pf3 pf4 cl1 cl2 cl3 cl4 loc1 loc2 loc3 loc4 wk1 wk2 wk3 wk4
1      4  1   7   9   0   0   5   1   0   5    0    1    0    0   1   0   0   1
2      3  1   7   9   0   0   0   5   1   5    0    0    1    0   1   1   0   0
3      4  1   9   7   0   0   5   1   0   0    0    0    0    1   0   1   1   0
4      4  1   0   9   7   0   1   1   0   5    0    0    1    0   1   0   0   1
5      1  1   0   9   0   7   0   1   0   5    1    0    0    0   0   1   0   1
6      4  1   0   9   0   7   0   0   1   5    0    0    1    0   0   0   0   1

【讨论】:

  • 谢谢大家。这很有帮助。我的数据集很奇怪,因为变量不会因选择而异。但这澄清了发生了什么。我认为它现在可以工作了!
  • 请注意,第一个示例中的可变参数应该是 3:8,而不是 3:5
【解决方案2】:

问题是reshape 创建的row.names 不是唯一的,这会造成麻烦。这是一个快速修复。您需要添加一个chid.var,这对于每一行都是唯一的。我使用了zoo 中的index 函数来做到这一点。我想你也可以使用其他方式。

mlogit.data(panel.datasm, choice = 'choice', id = 'id', shape = 'wide', 
 varying = 3:8, sep = "_", chid.var = 1:NROW(index))

        choice id  alt     data      data2
1.1991  FALSE  1 1991 0.4769187 0.97381645
1.1992  FALSE  1 1992 3.2998748 0.70989021
1.1993  FALSE  1 1993 5.6199917 5.53069555
2.1991  FALSE  1 1991 0.3615670 0.02066214
2.1992  FALSE  1 1992 2.0461820 0.41804600
2.1993  FALSE  1 1993 2.2764992 3.93337758

【讨论】:

  • 这克服了第一个障碍,但我认为会导致虚假的模型结果。请注意,choice 的值现在始终为FALSE,而当受访者的选择与该备选方案匹配时(即data.frame 中的行),它应该为 TRUE。
  • 附言。我很抱歉我删除了我的第一条评论——这可能会导致混乱。我写了一条评论,然后开始怀疑我是否正确。然后检查了我的假设并发表了一条新评论。对不起。
【解决方案3】:

错误来自 reshape 包。转换数据时无法确定时间元素。

mlogit 帮助指南 ?mlogit.data 在“alt.levels”选项下提供了解决方案,说明: “替代品的名称:如果为null,对于宽data.frame,它们是从变量名和选择变量中猜测出来的(两者应该是相同的)”。

由于您没有给出替代品的名称,因此重塑是猜测并且无法确定它们。然后解决方法是手动提供这些名称。保留问题中提供的数据,您可以使用以下内容:

logit.data <- mlogit.data(panel.datasm, id = "id", choice = "choice", 
                      varying= 3:8, shape = "wide", sep = "_",
                      alt.levels = c("data_1991","data_1992","data_1993", "data2_1991", "data2_1992", "data2_1993"))

*注意:正如@James 所提到的,你应该从 3:8 而不是 3:5 变化。

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多