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
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
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
Bạn có thể vui lòng chỉ cho tôi một ví dụ không? – JohnP