在R中的模拟中使用地图功能重复或循环

问题描述

下面是我的数据,其中列组,分数和概率表示治疗组,分数结局和分数结局发生的可能性

data1 <- tibble(group = rep(c('A','B'),each = 5),score = c(0,1,2,3,4,4),prob = c(.08,.8,.1,.02,.4,.2)) 

data1

我想使用此数据并模拟R次得分,因此我按如下所示进行扩展

R <- 1:10 # number of simulations

data2 <- data1 %>%
  nest(data = c(score,prob)) %>%
  unnest_wider(col = data) %>%
  mutate(size = 15) 

data3 <- data2 %>%
  group_by(group,score,prob,size) %>%
  tidyr::expand(iter = R) %>%
  ungroup 

data3

我使用多项式分布模拟数据的功能如下

sim_data <- function(dt,n,size,prob){
  d1 <- dt %>%
    mutate(sim_score = pmap(list(n    = 1,size = size,prob = prob),rmultinom)) %>%
    select(-prob) %>%
    unnest(cols = c(sim_score,score))
  
  # create real scores from counts above
  d2 <- d1 %>%
    rowwise %>%
    mutate(outcome = map(score,rep,times = sim_score)) %>%
    unnest(cols = outcome) %>%
    select(size,contains('iter'),group,outcome) %>%
    nest(data = c(group,outcome))
  
  return(d2)
}

data4 <- sim_data(data3,prob)
data4

这很好用,但是我想忽略每个组的唯一性分数小于或等于2的情况。在这种情况下,我使用sim_data修改函数repeat以进行如下检查,以忽略不满足上述要求的情况

 sim_check <- function(my_data,prob){
  
  repeat{
    # simulate data
    dt = sim_data(my_data,prob)
    
    # check requirement
    check <- dt %>%
      select(data) %>%
      unnest(cols = c(data)) %>%
      group_by(group) %>%
      distinct(outcome) %>%
      mutate(id = 1:n()) %>%
      summarise(n = n()) %>%
      distinct(n) %>%
      pull(n)
    
    if(all(check > 2)) break
  }
  return(dt)
}

data5 <- sim_check(data3,prob)

但是,由于我看到具有2个唯一分数的观察结果,因此不进行检查。

我可以通过下面的for循环实现我的目标,但是我想避免for循环。有人可以指出我做错了什么地方

out <- list()

for(i in 1:10){
  data6 <- sim_check(data2,prob)
  out[[i]]  <- data6 %>%
    pull(data) 
}

@Ronak感谢您的观察。我刚刚更正了

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)