gpt4 book ai didi

r - 多项回归的多重插补和 mlogit

转载 作者:行者123 更新时间:2023-12-04 07:19:28 25 4
gpt4 key购买 nike

我正在尝试使用估算数据运行多项回归。我可以用 nnet 包做到这一点,但是我想使用 mlogit。使用 mlogit 包,我不断收到以下错误“1:nrow(data) 中的错误:长度为 0 的参数”。
所以制作数据

library(mlogit)
library(nnet)
library(tidyverse)
library(mice)

df <- data.frame(vax = sample(1:6, 500, replace = T),
age = runif(500, 12, 18),
var1 = sample(1:2, 500, replace = T),
var2 = sample(1:5, 500, replace = T))

# Create missing data using the mice package:
df2 <- ampute(df, prop = 0.15)
df3 <- df2$amp

df3$vax <- as.factor(df3$vax)
df3$var1 <- as.factor(df3$var1)
df3$var2 <- as.factor(df3$var2)

# Inpute missing data:
df4 <- mice(df3, m = 5, print = T, seed = 123)
它使用 nnet 的 multinom 工作:
multinomtest <- with(df4, multinom(vax ~ age + var1 + var2, data = df, model = T))
summary(pool(multinomtest))
但是当我尝试将数据 reshape 为 mlogit 格式时会引发错误
test <- with(df4, dfidx(data = df4, choice = "vax", shape = "wide"))
有谁知道我如何将插补数据转换为 mlogit 格式,甚至 mlogit 是否与鼠标或任何其他插补包兼容?

最佳答案

回答
您正在使用 with.mids不正确,因此两行代码都是错误的; multinom行只是没有给出错误。如果您想将多个函数应用于估算数据集,最好使用 lapply 之类的东西。 :

analyses <- lapply(seq_len(df4$m), function(i) {
data.i <- complete(df4, i)
data.idx <- dfidx(data = data.i, choice = "vax", shape = "wide")
mlogit(vax ~ 1 | age + var1 + var2,
data = data.idx,
reflevel = "1",
nests = list(type1 = c("1", "2"), type2 = c("3","4"), type3 = c("5","6")))
})
test <- list(call = "", call1 = df4$call, nmis = df4$nmis, analyses = analyses)
oldClass(test) <- c("mira", "matrix")
summary(pool(test))

如何with.mids作品
申请时 withmids对象(又名 mice::mice 的输出),那么您实际上是在调用 with.mids .
如果您使用 getAnywhere(with.mids) (或者直接输入 mice:::with.mids ),你会发现它做了几件事:
  • 它遍历所有估算的数据集。
  • 它使用 complete得到一个数据集。
  • 它以数据集作为环境运行表达式。

  • 第三步是问题。对于使用公式的函数(如 lmglmmultinom ),您可以在给定环境中使用该公式。如果变量不在当前环境中(而是在例如数据框中),您可以通过设置 data 来指定新环境。多变的。

    问题
    这就是您的两个问题的根源:
  • 在您的 multinom打电话,你设置data变量为 df .因此,您实际上是在运行 multinom原创 df , 不是 估算的数据集!
  • 在您的 dfidx打电话,你又在填data直接地。这也是错误的。但是,将其留空也会产生错误。这是因为 with.mids未填写 data论据,但只有环境。这对你来说还不够。

  • 修复 multinom
    您的 multinom 的解决方案行很简单:只是不要指定 data :
    multinomtest <- with(df4, multinom(vax ~ age + var1 + var2, model = T))
    summary(pool(multinomtest))
    正如您将看到的,这将产生非常不同的结果!但重要的是要意识到这是你想要获得的。

    修复 dfidx(和 mlogit)
    我们不能用 with.mids 做到这一点,因为它使用估算数据集作为环境,但您想使用修改后的数据集(在 dfidx 之后)作为您的环境。因此,我们必须编写自己的代码。您可以使用任何循环函数来执行此操作,例如 lapply :
    analyses <- lapply(seq_len(df4$m), function(i) {
    data.i <- complete(df4, i)
    data.idx <- dfidx(data = data.i, choice = "vax", shape = "wide")
    mlogit(vax ~ 1 | age + var1 + var2, data = data.idx, reflevel = "1", nests = list(type1 = c("1", "2"), type2 = c("3","4"), type3 = c("5","6")))
    })
    从那里开始,我们所要做的就是制作一个看起来像 mira 的东西。对象,这样我们仍然可以使用 pool :
    test <- list(call = "", call1 = df4$call, nmis = df4$nmis, analyses = analyses)
    oldClass(test) <- c("mira", "matrix")
    summary(pool(test))

    关于r - 多项回归的多重插补和 mlogit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68594000/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com