选择实验数据:mlogit练习3“reformelong中的错误...."可变参数必须具有相同的长度”

nbnkbykc  于 2023-01-06  发布在  Git
关注(0)|答案(1)|浏览(100)

遵循mlogit包https://cran.r-project.org/web/packages/mlogit/vignettes/e3mxlogit.html的练习3,但尝试使用我自己的数据(见下文)

structure(list(Choice.Set = c(4L, 5L, 7L, 8L, 10L, 12L), Alternative = c(2L, 
1L, 1L, 2L, 2L, 2L), respondent = c(1L, 1L, 1L, 1L, 1L, 1L), 
    code = c(7L, 9L, 13L, 15L, 19L, 23L), Choice = c(1L, 1L, 
    1L, 1L, 1L, 1L), price1 = c(0L, 0L, 1L, 1L, 0L, 0L), price2 = c(0L, 
    1L, 0L, 0L, 1L, 1L), price3 = c(0L, 0L, 0L, 0L, 0L, 0L), 
    price4 = c(1L, 0L, 0L, 0L, 0L, 0L), price5 = c(0L, 0L, 0L, 
    0L, 0L, 0L), zone1 = c(0L, 0L, 0L, 1L, 1L, 1L), zone2 = c(0L, 
    0L, 0L, 0L, 0L, 0L), zone3 = c(1L, 0L, 1L, 0L, 0L, 0L), zone4 = c(0L, 
    1L, 0L, 0L, 0L, 0L), lic1 = c(0L, 0L, 0L, 0L, 0L, 0L), lic2 = c(1L, 
    0L, 1L, 0L, 1L, 1L), lic3 = c(0L, 1L, 0L, 1L, 0L, 0L), enf1 = c(0L, 
    0L, 1L, 0L, 1L, 0L), enf2 = c(0L, 0L, 0L, 1L, 0L, 1L), enf3 = c(1L, 
    1L, 0L, 0L, 0L, 0L), chid = 1:6), row.names = c(4L, 5L, 7L, 
8L, 10L, 12L), class = "data.frame")

我在运行代码时遇到了错误:

dfml <- dfidx(df, idx=list(c("chid", "respondent")), 
              choice="Alternative", varying=6:20, sep ="")

“整形长型错误(数据,idvar = idvar,时间变量=时间变量,变化=变化,:“variing”参数的长度必须相同
我已经检查了数据,从6:20开始的每一列都是一样长的,但是,一些受访者选择了一些选项,而不是其他选项。有人能指出我哪里出错了吗?这是我第一次尝试分析选择实验数据。

szqfcxe2

szqfcxe21#

这个错误意味着,你的 price 有五个选项,而其他的 zone,lic,enf 有更少的选项。dfidx显然不能处理这个问题。你需要提供它们,至少作为NA列。

df <- transform(df, zone5=NA, lic4=NA, lic5=NA, enf4=NA, enf5=NA)

library(mlogit)

dfml <- dfidx(df, idx=list(c("chid","respondent")), choice="Alternative", 
              varying=grep('^price|^zone|^lic|^enf', names(df)), sep="")

dfml
# ~~~~~~~
#   first 10 observations out of 30 
# ~~~~~~~
#    Choice.Set Alternative code Choice price zone lic enf idx
# 1           4       FALSE    7      1     0    0   0   0 1:1
# 2           4        TRUE    7      1     0    0   1   0 1:2
# 3           4       FALSE    7      1     0    1   0   1 1:3
# 4           4       FALSE    7      1     1    0  NA  NA 1:4
# 5           4       FALSE    7      1     0   NA  NA  NA 1:5
# 6           5        TRUE    9      1     0    0   0   0 2:1
# 7           5       FALSE    9      1     1    0   0   0 2:2
# 8           5       FALSE    9      1     0    0   1   1 2:3
# 9           5       FALSE    9      1     0    1  NA  NA 2:4
# 10          5       FALSE    9      1     0   NA  NA  NA 2:5
# 
# ~~~ indexes ~~~~
#    chid respondent id2
# 1     1          1   1
# 2     1          1   2
# 3     1          1   3
# 4     1          1   4
# 5     1          1   5
# 6     2          1   1
# 7     2          1   2
# 8     2          1   3
# 9     2          1   4
# 10    2          1   5
# indexes:  1, 1, 2

我在这里使用grep来标识varying=列,摆脱懒惰地将变量指定为数字的习惯;这是危险的,因为脚本中的一些小改动很容易改变顺序。

相关问题