bootstrap 的分层排列

Stratified permutation with bootstrap

我在尝试对排列进行分层时遇到问题。

我的数据是这样的:

     gender party        value
1      F    Democrat      762
2      M    Democrat      484
3      F    Independent   327
4      M    Independent   239
5      F    Republican    468
6      M    Republican    477

我只是想做的是通过 party

分层随机排列
library(dplyr)
md %>% 
  group_by(party) %>% 
  mutate(perm = sample(gender))

这给了我一个正确的随机排列

     gender party        value   perm
1      F    Democrat      762      M
2      M    Democrat      484      F
3      F    Independent   327      M
4      M    Independent   239      F
5      F    Republican    468      F
6      M    Republican    477      M

我想要的是多次重复这个操作。按照提出的解决方案(非分层排列)

library(broom) 
md %>% 
 bootstrap(100) %>% 
 do(data.frame(., treat = sample(.$gender, 6, replace=TRUE)))

但是,我没有引入 group_by 论点。

md %>% 
  bootstrap(10) %>% 
  group_by(party) %>% 
  do(data.frame(., treat = sample(.$gender, 6, replace=TRUE)))

有什么想法吗?

此外,bootstrap功能实际上很慢。知道为什么吗?有什么解决方案可以让它更快吗?我们能以某种方式将它并行化吗?

library(reshape2)
M <- as.table(rbind(c(762, 327, 468), c(484, 239, 477)))
dimnames(M) <- list(gender = c("F", "M"),
                party = c("Democrat","Independent", "Republican"))
md = melt(M) 

这是一个使用 data.table 的解决方案(如果您正在寻找性能,您应该真正尝试一下)包和 replicate

setDT(dx)
rbindlist(replicate(10,dx[,perm := sample(gender),party],simplify=FALSE))

我不是 dplyr 的用户,也不是 piper ,但是如果你是 "pipe-fanatic" 你可以转换上面的代码并通过管道传递它:

PERM <- function(dx)
  dx[,perm := sample(gender),party]

REPLICATE <- function(dx,n)
  rbindlist(replicate(n,dx[,perm := sample(gender),party],simplify=FALSE))

dx %>%
  PERM() %>%
  REPLICATE(10)