首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中的foreach循环中使用multiply imputed set (mids)对象?

如何在R中的foreach循环中使用multiply imputed set (mids)对象?
EN

Stack Overflow用户
提问于 2020-07-01 00:04:54
回答 1查看 354关注 0票数 2

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

我想在foreach循环中使用mids (或多个推定数据集的列表)对象,执行引导,并将结果汇集在一起。通过将mids对象转换为一个列表,然后使用该列表中的一个元素,我成功地仅基于一个数据集获得了结果。尽管如此,我还是想一次使用所有数据集。

一个可重复的例子:

代码语言:javascript
运行
复制
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)

下面是我尝试过的:

代码语言:javascript
运行
复制
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)

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

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

发布于 2020-07-06 16:04:27

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

代码语言:javascript
运行
复制
longlist_ = longlist[[1]]
for (j in 2:length(longlist))
  {
    longlist_ = rbind(longlist_,longlist[[i]])
  }
boot_dat <- longlist_[sample(1:nrow(longlist[[6]]), replace = TRUE), ]

另一种方法是随机选择一个数据集,随机选择一行,然后重复几次。

代码语言:javascript
运行
复制
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中设计矩阵奇异性的错误,可以添加一些小的噪声。

代码语言:javascript
运行
复制
boot_dat[,'hyp'] = boot_dat[,'hyp'] + runif(nrow(boot_dat), -1e-10, 1e-10)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62661585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档