2011-11-10 45 views
3

我有一些麻烦的水平使用mlogit水平...运行以下:错误与R中

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

据我所知,这是我的数据格式相同。这里发生了什么?我在我身边。

+0

我从来没有能够得到'mlogit'工作的自动重塑。因此,我采取了手动重塑我的数据来创建所需的长格式。祝你好运。 – Andrie

+0

PS。感谢您提出这个问题。在开始学习R之后,我试图了解'mlogit'。我无法制作代码的头部或尾部。据我所知,代码的工作原理和算法正确,但从用户的角度来看并不是特别强大。你的问题促使我再次研究'mlogit'。 – Andrie

+0

欢迎来到StackOverflow。 – Andrie

回答

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 
+0

谢谢你们。这很有帮助。我的数据集很奇怪,因为变量不会因选择而异。但是这澄清了正在发生的事情。我认为它现在会工作! – mmann1123

+0

请注意,第一个示例中的变量参数应该是3:8,而不是3:5 – James

0

的问题是,由reshape创建的row.names并不是唯一的,这是造成麻烦。这是一个快速解决方案。您需要添加一个chid.var,这对每行都是唯一的。我已经使用了index功能从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 
+0

你是对的。您的解决方案是正确的修复方案不错的一个 – Ramnath

+0

这会通过第一个障碍,但我认为会导致虚假的模型结果。请注意,'choice'的值现在总是'FALSE',而当响应者选择匹配该替代时(即'data.frame'中的行),它应该为TRUE。 – Andrie

+0

PS。我很抱歉,我删除了我的第一条评论 - 这可能会导致混淆。我写了评论,然后开始怀疑我是否正确。然后检查了我的假设并发布了一条新评论。抱歉。 – Andrie

0

误差来源于重塑包。转换数据时无法确定时间元素。 ?

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

*注:8 NOT 3:作为被@詹姆斯提到的,你应该从3变化5。