【问题标题】:How should I format my data for the R mlogit package?我应该如何为 R mlogit 包格式化我的数据?
【发布时间】:2017-07-30 04:40:26
【问题描述】:

我正在使用带有 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 文件中:

[垃圾.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,

【问题讨论】:

    标签: r


    【解决方案1】:

    我对@9​​87654321@ 的经验是,对于不符合完全应有方式的数据,它并不是很宽容。

    在您的情况下,我注意到第一个受访者有 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  
    

    【讨论】:

    • 感谢您的提示...是否可以通过一组多尺寸的替代方案?
    • 答案是肯定的和否定的。我又看了一下mlogit.data,代码假设每个受访者的备选方案都包含完整的集合。这也是我从不使用mlogit.data 而是自己构建长格式数据的部分原因。适合模型的函数mlogit可以处理你描述的数据类型。
    • @Andrie 与 OP 一样,我的数据中每个选项的选项数量不等,一列指示所采取的选择,另一列标记选择。正如您所建议的那样,如何将mlogit() 应用于此数据还不是很清楚。
    • @sautedman 我建议您提出一个新问题,并提供一个可重复的示例
    • @Andrie OP 的请求(和我的请求)完全在这个问题的范围内。您的回答只是说要消除部分数据,这是破坏性的。您通过将数据直接传递给mlogit() 表示有更好的解决方案,但不再详细说明。如果您在这一点上进行扩展,我认为您的答案会更好。
    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 2020-11-05
    • 2011-09-09
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    相关资源
    最近更新 更多