3

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

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

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

4

3 回答 3

2

我相信我已经找到了问题所在。你的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
于 2011-11-10T21:31:44.343 回答
0

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

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
于 2011-11-10T21:11:10.743 回答
0

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

mlogit 帮助指南 ?mlogit.data 在选项“alt.levels”下提供了解决方案,说明: “替代品的名称:如果为空,对于宽 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 变化。

于 2018-01-22T16:20:51.943 回答