如McFadden (1978)所示,如果多项式logit模型中的替代项数量如此之大以至于无法进行计算,则仍然可以通过对替代项进行随机分组来获得一致的估计,因此每个替代项的估计概率个体基于选择的替代方案和其他随机选择的替代方案。在这种情况下,每个人的替代子集的大小为C + 1。
我的问题是有关此算法在R中的实现的。它是否已嵌入任何多项logit软件包中?如果不是这样-根据我到目前为止的了解,这似乎很可能-在不进行大量重新编码的情况下,如何将该过程包括在预先存在的软件包中?
答案 0 :(得分:3)
不确定问题是否更多是关于替代方案的抽样还是替代方案抽样后的MNL模型估计。据我所知,到目前为止,还没有R软件包可以进行替代品的采样(前者),但是使用mlogit这样的现有软件包就可以使用后者。我相信原因是采样过程取决于数据的组织方式,但是使用自己的代码相对容易。下面的代码改编自我用于this paper的代码。
library(tidyverse)
# create artificial data
set.seed(6)
# data frame of choser id and chosen alt_id
id_alt <- data.frame(
id = 1:1000,
alt_chosen = sample(1:30, 1)
)
# data frame for universal choice set, with an alt-specific attributes (alt_x2)
alts <- data.frame(
alt_id = 1:30,
alt_x2 = runif(30)
)
# conduct sampling of 9 non-chosen alternatives
id_alt <- id_alt %>%
mutate(.alts_all =list(alts$alt_id),
# use weights to avoid including chosen alternative in sample
.alts_wtg = map2(.alts_all, alt_chosen, ~ifelse(.x==.y, 0, 1)),
.alts_nonch = map2(.alts_all, .alts_wtg, ~sample(.x, size=9, prob=.y)),
# combine chosen & sampled non-chosen alts
alt_id = map2(alt_chosen, .alts_nonch, c)
)
# unnest above data.frame to create a long format data frame
# with rows varying by choser id and alt_id
id_alt_lf <- id_alt %>%
select(-starts_with(".")) %>%
unnest(alt_id)
# join long format df with alts to get alt-specific attributes
id_alt_lf <- id_alt_lf %>%
left_join(alts, by="alt_id") %>%
mutate(chosen=ifelse(alt_chosen==alt_id, 1, 0))
require(mlogit)
# convert to mlogit data frame before estimating
id_alt_mldf <- mlogit.data(id_alt_lf,
choice="chosen",
chid.var="id",
alt.var="alt_id", shape="long")
mlogit( chosen ~ 0 + alt_x2, id_alt_mldf) %>%
summary()
当然可以通过使用purrr::map
变体或遍历apply
的每一行而无需使用id_alt
函数。
答案 1 :(得分:1)
我的建议是复查mlogit软件包。
小插图:
该软件包提供了一组示例练习(我认为)值得研究:
您可能还想看看gmnl软件包(我没有用过)
问题:您还试图应用多项式logit模型的哪些具体问题?对此很感兴趣。
除了上述问题,我希望以上内容为您指明正确的方向。