取每行随机抽样10000次重复的平均值

时间:2017-10-12 17:02:34

标签: r

我进行了10000次复制,我从ID列表中随机抽取样本,然后将它们与另一个ID列表配对。之后我添加了一个colomn,它给出了彼此相关的关联。然后我采用了每组随机抽样的相关性。所以我最终得到10000个值,这些值表示每组随机抽样的相关性的平均值。但是,我想取代所有10000组随机抽样的第一行相关性的均值。

我想要的一个例子:

假设我有10000套3个随机配对。

Set 1
     female_ID male_ID relatedness
  0  12-34     23-65   0.034
  1  44-62     56-24   0.56
  2  76-11     34-22   0.044

Set 2
     female_ID male_ID relatedness
  0  98-54     53-12   0.022
  1  22-43     13-99   0.065
  2  09-22     65-22   0.12

etc...

我想要每组相关性的行的平均值,所以我想要一个3个值的列表:0.028(平均值0.034和0.022),0.3125(平均值0.56和0.065),0.082(平均值0.044和0.12) ),除了它将是10000套的平均值,而不仅仅是2.

到目前为止,这是我的代码:

    mean_rel <- replicate(10000, {
       random_mal <- sample(list_of_males, 78, replace=TRUE)
       random_pair <- cbind(list_of_females, random_mal)
       random_pair <- data.frame(random_pair)
       random_pair$pair <- with(random_pair, paste(list_of_females, random_mal, sep = " "))
       typeA <- genome$rel[match(random_pair$pair, genome_year$pair1)]
       typeB <- genome$rel[match(random_pair$pair, genome_year$pair2)]
       random_pair$relatedness <- ifelse(is.na(typeA), typeB, typeA)
       random_pair <- na.omit(random_pair)
       mean_random_pair_relatedness <- mean(random_pair$relatedness)
       mean_random_pair_relatedness
    })

1 个答案:

答案 0 :(得分:0)

如果您在结束simplify = FALSEreplicate之间向}添加),那么mean_rel将作为列表输出。

   mean_rel <- replicate(10000, {
     random_mal <- sample(list_of_males, 78, replace=TRUE)
     random_pair <- cbind(list_of_females, random_mal)
     random_pair <- data.frame(random_pair)
     random_pair$pair <- with(random_pair, paste(list_of_females, random_mal, sep = " "))
     typeA <- genome$rel[match(random_pair$pair, genome_year$pair1)]
     typeB <- genome$rel[match(random_pair$pair, genome_year$pair2)]
     random_pair$relatedness <- ifelse(is.na(typeA), typeB, typeA)
     random_pair <- na.omit(random_pair)
     mean_random_pair_relatedness <- mean(random_pair$relatedness)
     mean_random_pair_relatedness
  }, simplify = FALSE)

从那里,您可以使用purrr添加两个分类列,然后可以使用dplyr。我是这样做的:

library(tidyverse)
mean_rel <- purrr::map2(.x = mean_rel, .y = seq_along(mean_rel), 
                        function(x, y){
                          x %>%
                            mutate(set = paste0("set_", y)) %>%
                            # do this so the same row of each set can be 
                            # compared
                            rownames_to_column(var = "row_number")
})

mean_rel_comb <- mean_rel %>%
  do.call(rbind, .) %>%
  as.tibble() %>%
  mutate(relatedness = as.numeric(as.character(relatedness))) %>%
  group_by(row_number) %>%
  summarize(mean = mean(relatedness))

将两个数据集合并为一个列表给了我:

# A tibble: 3 x 2
  row_number   mean
       <chr>  <dbl>
1          1 0.0280
2          2 0.3125
3          3 0.0820