2012-02-20 35 views
7

Tôi đang sử dụng gói mlogit với R.Tôi nên định dạng dữ liệu của mình cho gói mlog như thế nào?

Sau khi nhập dữ liệu của tôi sử dụng:

t <-read.csv('junk.csv',header=TRUE, sep=",", dec=".") 

và gọi:

x <- mlogit.data(t,choice="D",shape="long",id.var="key",alt.var="altkey") 

Tôi nhận được lỗi sau:

Error in `row.names<-.data.frame`(`*tmp*`, value = c("1.1", "1.2", "1.3", : 
    duplicate 'row.names' are not allowed 
In addition: Warning message: 
non-unique values when setting 'row.names': ‘1.1’, ‘1.2’, ‘1.3’, ‘1.4’, ‘1.5’, ‘1.6’ 

Bất kỳ ý tưởng nào về cách khắc phục?

Dữ liệu của tôi tồn tại trong các định dạng sau đây trong một tập tin csv:

[junk.csv]

key,altkey,A,B,C,D 
201005131,1,2.6,118.17,117,0 
201005131,2,1.4,117.11,115,0 
201005131,3,1.1,117.38,122,1 
201005131,4,24.6,,122,0 
201005131,5,48.6,91.90,122,0 
201005131,6,59.8,,122,0 
201005132,1,20.2,118.23,113,0 
201005132,2,2.5,123.67,120,1 
201005132,3,7.4,116.30,120,0 
201005132,4,2.8,118.86,120,0 
201005132,5,6.9,124.72,120,0 
201005132,6,2.5,123.81,120,0 
201005132,7,8.5,119.23,115, 

Trả lời

5

kinh nghiệm của tôi về mlogit là nó không phải là rất khoan dung về dữ liệu đó không phải là chính xác cách thức cần thực hiện.

Trong trường hợp của bạn, tôi nhận thấy rằng người trả lời đầu tiên có 6 lựa chọn thay thế, trong khi người trả lời thứ hai có 7 lựa chọn thay thế. Nếu bạn định dạng dữ liệu của bạn để có một số lượng tương đương thay thế cho mỗi người trả lời các mlogit.data chức năng hoạt động:

dat <- read.table(sep=",",text=" 
key,altkey,A,B,C,D 
201005131,1, 2.6,118.17,117,0 
201005131,2,1.4,117.11,115,0 
201005131,3,1.1,117.38,122,1 
201005131,4,24.6,,122,0 
201005131,5,48.6,91.90,122,0 
201005131,6,59.8,,122,0 
201005132,1,20.2,118.23,113,0 
201005132,2,2.5,123.67,120,1 
201005132,3,7.4,116.30,120,0 
201005132,4,2.8,118.86,120,0 
201005132,5,6.9,124.72,120,0 
201005132,6,2.5,123.81,120,0 
201005132,7,8.5,119.23,115,0 
", header=TRUE) 

Chạy mlogit trên tất cả các dữ liệu tái tạo các lỗi:

> mlogit.data(dat, choice="D", shape="long", id.var="key", alt.var="altkey") 
Error in `row.names<-.data.frame`(`*tmp*`, value = c("1.1", "1.2", "1.3", : 
    duplicate 'row.names' are not allowed 
In addition: Warning message: 
non-unique values when setting 'row.names': '1.1', '1.2', '1.3', '1.4', '1.5', '1.6' 

Tuy nhiên, loại bỏ số dòng 13, tức là thay thế thứ 7, hoạt động:

> mlogit.data(dat[-13, ], choice="D", shape="long", id.var="key", alt.var="altkey") 
      key altkey A  B C  D 
1.1 201005131  1 2.6 118.17 117 FALSE 
1.2 201005131  2 1.4 117.11 115 FALSE 
1.3 201005131  3 1.1 117.38 122 TRUE 
1.4 201005131  4 24.6  NA 122 FALSE 
1.5 201005131  5 48.6 91.90 122 FALSE 
1.6 201005131  6 59.8  NA 122 FALSE 
2.1 201005132  1 20.2 118.23 113 FALSE 
2.2 201005132  2 2.5 123.67 120 TRUE 
2.3 201005132  3 7.4 116.30 120 FALSE 
2.4 201005132  4 2.8 118.86 120 FALSE 
2.5 201005132  5 6.9 124.72 120 FALSE 
2.6 201005132  6 2.5 123.81 120 FALSE 

Tất nhiên, điều này không phải là rất thỏa đáng, vì nó phá hủy một số dữ liệu. Một giải pháp tốt hơn là xây dựng các dữ liệu trong một định dạng mà mlogit() hy vọng, và sau đó gọi mlogit() trực tiếp:

dat$key <- factor(as.numeric(as.factor(dat$key))) 
dat$altkey <- as.factor(dat$altkey) 
dat$D <- as.logical(dat$D) 
row.names(dat) <- paste(dat$key, dat$altkey, sep = ".") 

Bây giờ các dữ liệu trông như thế này:

key altkey A  B C  D 
1.1 1  1 2.6 118.17 117 FALSE 
1.2 1  2 1.4 117.11 115 FALSE 
1.3 1  3 1.1 117.38 122 TRUE 
1.4 1  4 24.6  NA 122 FALSE 
1.5 1  5 48.6 91.90 122 FALSE 
1.6 1  6 59.8  NA 122 FALSE 
2.1 2  1 20.2 118.23 113 FALSE 
2.2 2  2 2.5 123.67 120 TRUE 
2.3 2  3 7.4 116.30 120 FALSE 
2.4 2  4 2.8 118.86 120 FALSE 
2.5 2  5 6.9 124.72 120 FALSE 
2.6 2  6 2.5 123.81 120 FALSE 
2.7 2  7 8.5 119.23 115 FALSE 

Và bạn có thể gọi mlogit() trực tiếp:

mlogit(D ~ A + B + C, dat, 
     chid.var = "key", 
     alt.var = "altkey", 
     choice = "D", 
     shape = "long") 

Kết quả:

Call: 
mlogit(formula = D ~ A + B + C, data = dat, chid.var = "key",  alt.var = "altkey", choice = "D", shape = "long", method = "nr",  print.level = 0) 

Coefficients: 
2:(intercept) 3:(intercept) 4:(intercept) 5:(intercept) 6:(intercept) 
     10.7774   4.8129   5.2257  -17.2522  -7.7364 
7:(intercept)    A    B    C 
     10.0389   1.6010   2.7156   2.9888 
+0

Cảm ơn gợi ý ... Có thể mặc dù để vượt qua một tập hợp nhiều lựa chọn thay thế? – JohnP

+2

Câu trả lời là có và không, tôi đã xem xét khác 'mlogit.data' và giả định mã s rằng các lựa chọn thay thế cho mỗi người trả lời có chứa tập hợp đầy đủ. Đây là một phần lý do tại sao tôi không bao giờ sử dụng 'mlogit.data', nhưng tự xây dựng dữ liệu biểu mẫu dài. Hàm 'mlogit' phù hợp với mô hình có thể xử lý loại dữ liệu bạn mô tả. – Andrie

+1

Bạn có thể vui lòng chỉ cho tôi một ví dụ không? – JohnP

-1

JohnP,

Tôi nghĩ câu trả lời bạn đang tìm kiếm là maxabet. Nó nói:

"Nếu độc giả cố gắng sử dụng R để tính toán MLR được giới thiệu trong chương 6, thông báo lỗi sau đây có thể xảy ra:

Lỗi trong` row.names < -.data.frame ... (một số dữ liệu sau đó) hàng trùng lặp.tên 'không được phép

Lỗi này là sự cố của phiên bản hiện tại của R (được phát hành vào tháng 4 năm 2011). MLR sẽ chỉ chạy nếu số 'hàng' ('người chạy' trong trường hợp của chúng ta) giống nhau trong mọi chủng tộc. Do đó một trong những cách là làm cho một số 'ngựa giả' để mỗi chủng tộc có 14 vận động viên. Thay vì tạo các trình chạy giả, người đọc có thể đợi R giải quyết vấn đề này hoặc thử tải xuống một phiên bản cũ hơn (tôi đang sử dụng 2.9.1). "

Vì vậy, tôi đoán bạn có thể sử dụng phiên bản cũ hơn của R hoặc vẫn tốt hơn, điền vào dữ liệu hiện có với các giá trị giả để hoàn thành mỗi chủng tộc. Một điều tôi sẽ làm là thêm biến mới cho" kích thước trường "cho mỗi bằng cách ném vào các núm vú giả, nhưng có số lượng người chạy đúng trong một cột mới nên chú ý đến bất kỳ biến thể kích thước trường nào.

Rõ ràng câu trả lời bạn nhận được sẽ khác với sách bạn đang đọc, nhưng nó sẽ là tốt bắt đầu để tốt hơn handicapping :)

Các vấn đề liên quan