2016-09-30 63 views
3

我在嘗試對排列進行分層時遇到問題。使用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 

我想多次重複此操作。繼提出的解決方案here(非分層排列)

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) 
+0

是否'MD%>%GROUP_BY(方)%>%的自舉(10,by_group = TRUE)%>%的人( data.frame(。,treat = sample(。$ gender,6,replace = TRUE)))'work? – Axeman

+0

您寫過,*我想多次重複此操作*但預期輸出是多少?使用'replicate'怎麼樣? – agstudy

+0

@agstudy複製是一種可能性,我在提到的問題中使用它。它只是使代碼繁瑣。 – giacomo

回答

3

這裏使用data.table(如果你正在尋找的表現,你真的應該給它一個去)封裝,replicate一個解決方案:

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

我不是dplyr既不是吹笛的用戶,但如果你的一個 「管癡」 你可以將上面的代碼和管道它:

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) 
+0

非常感謝 – giacomo