2012-02-20 38 views
7

我使用mlogit包河我应该如何格式化R mlogit软件包的数据?

使用导入我的数据后:

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

,并呼吁:

x <- mlogit.data(t,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’ 

任何想法如何解决它?按以下格式

我的数据存在于一个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, 

回答

5

我的mlogit的经验是,它是不是很宽容有关的数据,是不是确切地说是它应该是。

就你而言,我注意到第一个应答者有6个选择,而第二个应答者有7个选择。如果格式化您的数据对每个受访者的选择的相同数目mlogit.data功能的工作原理:

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) 

运行的所有数据的mlogit重现错误:

> 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' 

但是,删除行号13,即第7的替代,工作原理:

> 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 

当然,这不是很令人满意,因为它破坏了一些数据。更好的解决方案是建立在mlogit()需要一个格式的数据,然后直接调用mlogit()

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

现在的数据是这样的:

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 

,您可以直接拨打mlogit()

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

结果:

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

谢谢你的提示...是否有可能虽然通过多尺寸的安置方案的? – JohnP 2012-02-20 09:04:39

+2

答案是yes和no。我又看看'mlogit.data'和代码假设每个被访者的替代方案都包含全套。这是我从不使用'mlogit.data'的部分原因,但我自己构建了长格式数据。适合模型的函数'mlogit'可以处理您描述的数据类型。 – Andrie 2012-02-20 09:18:59

+1

你能指点我一个例子吗? – JohnP 2012-02-20 09:31:55

-1

JohnP,

我认为你正在寻找的答案是maxabet。它说:

“如果读者尝试用R计算这是在第6章介绍了国土资源部,可能会出现以下错误信息:

错误`row.names < -.data.frame ... (之后的部分数据) 重复'行。名称'不允许

此错误是当前版本的R(2011年4月发布)的问题。只有在'行'(在我们的情况下为'跑者')在每场比赛中相同的情况下,MLR才会运行。因此,其中一种方法是制作一些“假马”,以便每个种族都有14名选手。读者可能会等待R来解决这个问题,或者尝试某种方式下载早期版本(我正在使用2.9.1),而不是制作虚拟跑步者。 “

所以我想你可以使用旧版本的R或更好的版本,用虚拟值填充现有的数据来完成每场比赛。我要做的一件事就是为每个字段添加一个新的变量”字段大小“通过投入假人,但在一个新的列中有正确数量的跑步者应该注意任何字段大小的变化

显然你得到的答案会不同于你正在阅读的书,但它会良好的开端,以更好地妨碍:)