2011-11-10 48 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。