在 R 中运行 mlogit 函数后进行预测

机器算法验证 r 物流 罗吉特 多项分布
2022-03-12 17:24:12

这就是我想要做的,但似乎没有predict适用于 mlogit 的方法。有任何想法吗?

library(mlogit)
data("Fishing", package = "mlogit")
Fish <- mlogit.data(Fishing, varying = c(2:9), shape = "wide", choice = "mode")

Fish_fit<-Fish[-1,]
Fish_test<-Fish[1,]
m <- mlogit(mode ~price+ catch | income, data = Fish_fit)
predict(m,newdata=Fish_test)
4个回答

mlogit 包确实有一个 predict() 方法,至少在我使用的版本中(0.2-3 和 R 2.15.3)。

@Zach 提供的代码有一个错误。mlogit() 使用的“长格式”数据每个选项都有一行;这是由 mlogit.data() 函数创建的格式。因此,要获得第一个案例的预测,您需要提取该案例的所有行,并且有 4 个:

Fish_fit<-Fish[-(1:4),]
Fish_test<-Fish[1:4,]
m <- mlogit(mode ~price+ catch | income, data = Fish_fit)
predict(m,newdata=Fish_test)

这给出了一个很好的结果。

在尝试对人口使用预测功能进行了大量努力之后,我想我可以为您的所有答案添加一些见解。

mlogit的predict功能运行良好,您只需要进行一些调整并确保以下事项得到处理:

  1. (如预期的newdata那样)应该包含与用于模型估计的样本完全相同的数据。这意味着人们应该检查数据的“隐藏”属性(例如factor继承不存在的级别 -droplevel在这种情况下可能有用 - 或未在样本因子中引入,或错误colname等)。

  2. 您必须在 newdata(如果它不存在)中做出任意选择,这些选择可以使用该sample函数轻松完成:

    MrChoice <-sample(c("Car", "Bus", "Walk"),nrow(datase),replace=TRUE, prob = c(0.5, 0.4, 0.1))
    mynewData$mode<-MrChoice
    
  3. 下一个需要的步骤是再次将数据转换为 mlogit 数据,使用与示例数据相同的函数,例如:

    ExpData3<- mlogit.data(mynewData, shape="wide", choice = "mode",sep=".",id = "TripID")
    
  4. 最后一步是使用该predict函数进行实际预测。

    resulted<-predict(ml1,newdata=ExpData3)
    

这是一个有用的技巧:将要预测的数据添加到原始估计样本中,但使用权重变量将这些新观测值的权重设置为零。估计模型(新观察值的权重为零),并从“概率”输出中获得预测。这样你就可以绕过预测功能,这是一团糟。

为了回答我自己的问题,我转而使用“glmnet”包来拟合我的多项式 logits,它具有使用套索或弹性网络来规范我的自变量的额外优势。glmnet 似乎是一个比 mlogit 更“完成”的封装,具有“预测”功能。