gpt4 book ai didi

r - 如何在 R 中的 foreach 循环中使用多重估算数据集(mids)对象?

转载 作者:行者123 更新时间:2023-12-05 06:14:56 24 4
gpt4 key购买 nike

我正在尝试使用并行计算来计算最小绝对偏差回归参数的百分位数自举 95% 置信区间,如本 article 中所述.但是,我没有使用单个数据框,而是使用 mids 获得的多重推算数据集 ( mice) 对象。多重插补包。这就是问题所在。

我想使用 mids (或多重估算数据集的列表)对象在 foreach 循环中,执行 Bootstrap ,并将结果合并。通过转换 mids,我设法仅基于一个数据集获得结果。对象放入列表中,然后使用该列表中的一个元素。尽管如此,我还是想一次使用所有数据集。

一个可重现的例子:

library(foreach)
library(doParallel)
cores_2_use <- detectCores() - 1

cl <- makeCluster(cores_2_use)
clusterSetRNGStream(cl, 9956)
registerDoParallel(cl)

library(mice)
imp_merged <-
foreach(no = 1:cores_2_use,
.combine = ibind,
.export = "nhanes",
.packages = "mice") %dopar%
{
mice(nhanes, m = 30, printFlag = FALSE)
}
stopCluster(cl)

这里是我尝试过的:

library(quantreg)
library(mitml)
library(miceadds)
library(splines)

cl <- makeCluster(cores_2_use)
clusterSetRNGStream(cl, 9956)
registerDoParallel(cl)

boot.1 <- foreach(i = 1:100,
.combine = rbind,
.packages = c('quantreg', 'mice', 'mitml', 'splines')) %dopar% {

longlist <- miceadds::mids2datlist(imp_merged)
boot_dat <- longlist[[6]][sample(1:nrow(longlist[[6]]), replace = TRUE), ]
## This is now based only on the 6th element of longlist
## I would like to use the whole mids/longlist object (330 data sets on my PC)

fit1 <- rq(chl ~ ns(bmi, df = 2, B = c(21, 33)) +
hyp + age, tau = 0.5,
data = boot_dat)
fit1$coef
}
stopCluster(cl)

boot.1.df <- as.data.frame(boot.1)
boot.1.pooled <- do.call(cbind, boot.1.df)
boot.1.ci <- apply(boot.1.pooled, 2, quantile, probs = c(0.025, 0.975))
t(boot.1.ci)

我转换了 mids使用 longlist <- miceadds::mids2datlist(imp_merged) 将对象放入多重估算数据集列表中并通过 boot_dat <- longlist[[6]][sample(1:nrow(longlist[[6]]), replace = TRUE), ] 基于该列表的一个单一元素(即推算数据集)执行采样.我想使用整个 mids longlist 的对象或所有元素.

任何帮助将不胜感激!

最佳答案

一种可能的方法是简单地将数据集组合成一个大数据集,并直接从中采样。

longlist_ = longlist[[1]]
for (j in 2:length(longlist))
{
longlist_ = rbind(longlist_,longlist[[i]])
}
boot_dat <- longlist_[sample(1:nrow(longlist[[6]]), replace = TRUE), ]

另一种方式是随机选择一个数据集,随机选择一行,重复多次。

boot_dat = NULL
for (j in seq(nrow(longlist[[6]])))
{
boot_dat = rbind(boot_dat,
longlist[[sample(length(longlist),1)]][sample(nrow(longlist[[1]]),1),])
}

请注意,为避免rq中奇异设计矩阵的误差,可以添加一个小噪声。

boot_dat[,'hyp'] = boot_dat[,'hyp'] + runif(nrow(boot_dat), -1e-10, 1e-10)

关于r - 如何在 R 中的 foreach 循环中使用多重估算数据集(mids)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62661585/

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