问题描述
下面是我的数据,其中列组,分数和概率表示治疗组,分数结局和分数结局发生的可能性
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 (将#修改为@)