【问题标题】:Handling alternative-specific NA values in mlogit在 mlogit 中处理替代特定的 NA 值
【发布时间】:2019-07-08 17:07:14
【问题描述】:

在模式选择模型中,变量随备选方案而变化(“通用变量”)但对于某些模式未定义是很常见的。例如,公共汽车和轻轨存在公交票价,但汽车和自行车未定义。请注意,票价为零。

我正在尝试使用 R 的 mlogit 包来完成这项工作。在这个 MWE 中,我断言 price 未定义用于从海滩钓鱼。这会导致奇点错误。

library(mlogit)
#> Warning: package 'mlogit' was built under R version 3.5.2
#> Loading required package: Formula
#> Loading required package: zoo
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date, as.Date.numeric
#> Loading required package: lmtest

data("Fishing", package = "mlogit")
Fishing$price.beach <- NA
Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode")
head(Fish)
#>            mode   income     alt   price  catch chid
#> 1.beach   FALSE 7083.332   beach      NA 0.0678    1
#> 1.boat    FALSE 7083.332    boat 157.930 0.2601    1
#> 1.charter  TRUE 7083.332 charter 182.930 0.5391    1
#> 1.pier    FALSE 7083.332    pier 157.930 0.0503    1
#> 2.beach   FALSE 1250.000   beach      NA 0.1049    2
#> 2.boat    FALSE 1250.000    boat  10.534 0.1574    2

mlogit(mode ~ catch + price | income, data = Fish, na.action = na.omit)
#> Error in solve.default(H, g[!fixed]): system is computationally singular: reciprocal condition number = 3.92205e-24

reprex package (v0.2.1) 于 2019-07-08 创建

price 移动到替代特定变量位置时也会发生这种情况。我认为问题可能出在na.action 函数参数上,但除了基本文档标签之外,我找不到关于此参数的任何文档:

na.action:指示当数据包含 NA 时应该发生什么的函数

似乎没有任何示例显示该术语的不同用法以及结果如何。有一个相关的未回答问题here

【问题讨论】:

    标签: r mlogit


    【解决方案1】:

    似乎发生了一些事情。

    我不太确定 na.action = na.omit 在后台是如何工作的,但在我看来它会丢弃整行。我总是觉得明确地这样做会更好。

    当您删除整行时,您将有没有选择的选择场合。这是行不通的。请记住,我们正在使用 logit 类型概率。此外,如果没有做出选择,就不会获得任何信息,因此我们需要完全放弃这些选择观察。结合执行这两个步骤,我能够运行您提出的模型。

    这是一个带注释的工作示例:

    library(mlogit)
    
    # Read in the data
    data("Fishing", package = "mlogit")
    
    # Set price for the beach option to NA
    Fishing$price.beach <- NA
    
    # Scale income
    Fishing$income <- Fishing$income / 10000
    
    # Turn into 'mlogit' data
    fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode")
    
    # Explicitly drop the alts with NA in price
    fish <- fish[fish$alt != "beach", ]
    
    # Dropping all NA also means that we now have choice occasions where no choice
    # was made and we need to get rid of these as well
    fish$choice_made <- rep(colSums(matrix(fish$mode, nrow = 3)), each = 3)
    
    fish <- fish[fish$choice_made == 1, ]
    
    fish <- mlogit.data(fish, shape = "long", alt.var = "alt", choice = "mode")
    
    # Run an MNL model
    mnl <- mlogit(mode ~ catch + price | income, data = fish)
    summary(mnl)
    

    一般来说,在使用这些模型时,我发现在运行模型之前始终进行所有数据转换而不是依赖诸如na.action 之类的函数非常有用。

    【讨论】:

    • 不会将fish &lt;- fish[fish$alt != "beach", ] 行从每个人的 选择集中删除beach 替代方案,而不仅仅是那些未定义选择的人吗?删除替代品与说价格对选择该替代品无关紧要不同。
    • 您是对的,但在您的情况下,由于您将所有海滩替代品的价格都设置为 NA,所以这里的价格是一样的。在您自己的数据中,您只会放弃备选方案(以及因此而没有做出选择的选择任务)。如果个人在做出选择时价格并不重要,则不应将其编码为 NA(缺失),而应由旨在解决特定启发式决策的不同类型模型处理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多