2016-04-13 24 views
0

I gözlemleri olan bir veri çerçevem ​​var ve her bir gözlem g kategorilerinden birine ait. rasgele gözlemleri gruplara göre (bloklar)

set.seed(9782) 
I <- 500 
g <- 10 
library(dplyr) 

anon_id <- function(n = 1, lenght = 12) { 
    randomString <- c(1:n) 
    for (i in 1:n) 
    { 
    randomString[i] <- paste(sample(c(0:9, letters, LETTERS), 
            lenght, replace = TRUE), 
          collapse = "") 
    } 
    return(randomString) 
} 

df <- data.frame(id = anon_id(n = I, lenght = 16), 
       group = sample(1:g, I, T)) 

Ben rastgele olasılık p bazı vektör verilen J "urne" birine her gözlem atamak istiyoruz. Bu, J = 1'in p'ye [1] atanması olasılığıdır. Eklenen karmaşıklık, bu bloğu blokla yapmak istiyorum.

Ben blokları görmezden gelirsek, ben kolayca yapabilirsiniz:

J <- 3 
p <- c(0.25, 0.5, 0.25) 
df1 <- df %>% mutate(urn = sample(x = c(1:J), size = I, replace = T, prob = p)) 

ben "blok" bunu yapmak için bu yöntem hakkında düşüncelerini

# Block randomization 
randomize_block <- function(g) { 
    df1 <- df %>% filter(group==g) 
    size <- nrow(df1) 
    df1 <- df1 %>% mutate(urn = sample(x = c(1:J), 
            size = size, 
            replace = T, 
            prob = p)) 
    return(df1) 

} 

df2 <- lapply(1:g, randomize_block) 
df2 <- data.table::rbindlist(df2) 

daha iyi bir yolu var mı?

+2

Eğer grup tarafından sadece grup mutasyona Can önce? – bramtayl

+0

@bramtayl Bunun hakkında düşündüm, ancak bu durumda 'size' örnek işlevine nasıl geçeceğimi bilmiyorum. Her grup farklı sayıda gözlemlere sahip olabilir. – Ignacio

+1

Kullan n() – bramtayl

cevap

2

bu daha iyi, ama burada uzunluğunun vektörü p J.

atama olasılıkları "grubu," grubu, adı yanı sıra kap atamaları 1:J sahip data.frame df bir temel R tekniği olup olmadığından emin
# get urn assignment 
urnAssignment <- lapply(unique(df$group), 
        function(i) sample(1:J, nrow(df[group==i,]), replace =T, prob=p)) 

# get a list that collects position of observations 
obsOrder <- lapply(unique(df$group), 
        function(i) which(df$group == i)) 

df$urnAssignment <- unlist(urnAssignment)[unlist(obsOrder)] 
0

Bu dplyr kullanarak hile yapar:

randomize <- function(data, groups=2, block_id = NULL, p=NULL, seed=9782) { 
    if(is.null(p)) p <- rep(1/groups, groups) 
    if(is.null(block_id)){ 
    df1 <- data %>% 
     mutate(Treatment = sample(x = c(1:groups), 
           size = n(), 
           replace = T, 
           prob = p)) 
    return(df1) 
    }else{ 
    df1 <- data %>% group_by_(block_id) %>% 
     mutate(Treatment = sample(x = c(1:groups), 
           size = n(), 
           replace = T, 
           prob = p)) 
    } 
}  

df1 <- randomize(data = df, groups = J, block_id = "group", p = p, seed = 9782) 
İlgili konular