Генерация распределения на основе среднего и SD несколько раз для разных групп - PullRequest
0 голосов
/ 06 мая 2019

У меня есть фрейм данных, состоящий из группирующей переменной, mean и sd.Я хотел бы сгенерировать количество средств (например, 10) для каждой группы на основе их среднего значения и SD.Я могу сделать это, используя rnorm в сочетании с функцией dplyr "mutate", но у меня возникают проблемы, когда я делаю это несколько раз и собираю списки в фрейм данных с помеченными репликами.

Group = c("A","B","C","D","E") 
Mean = c(1.25,5.5,3.25,1,5) 
SD = c(2.5,3,2.25,2,5.35) 
df = data.frame(Group,Mean,SD)

df

#works for one rep
df%>%
  group_by(Group)%>%
  mutate(est_mean=rnorm(1,mean=Mean,sd=SD))

#replicated 10 times but in list form
replicate(10, df%>%
        group_by(Group)%>%
        mutate(est_mean=rnorm(1,mean=Mean,sd=SD)))

Blockquote

В конечном итоге я хотел бы получить кадр данных с группой, Mean, SD, предполагаемым средним значением и идентификационным номером на основеповторяющийся номер (в этом примере это будет от 1 до 10).Ниже приведен пример того, что хотели бы первые 5 строк.

Group  Mean    SD      est_mean  ID
 A     1.25   2.50     3.07      1
 B     5.50   3.00     7.64      1
 C     3.25   2.25     2.90      1
 D     1.00   2.00     0.11      1
 E     5.00   5.35     1.03      1

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Если я правильно понимаю ваш вопрос, вы хотите, чтобы один и тот же df генерировался 10 раз с разными средствами для каждой группы, 10 раз? Если это так, вот немного хакерский способ сделать что-то вроде этого:

library(tidyverse)

set.seed(123)

Group = c("A","B","C","D","E") 
Mean = c(1.25,5.5,3.25,1,5) 
SD = c(2.5,3,2.25,2,5.35) 
df = data.frame(Group,Mean,SD)

df
#>   Group Mean   SD
#> 1     A 1.25 2.50
#> 2     B 5.50 3.00
#> 3     C 3.25 2.25
#> 4     D 1.00 2.00
#> 5     E 5.00 5.35

map_df(1:10, ~df) %>% 
    mutate(ID = rep(1:10, each=5),
           est_mean = map2(Mean, SD, ~rnorm(1, .x, .y)))
#>    Group Mean   SD ID   est_mean
#> 1      A 1.25 2.50  1 -0.1511891
#> 2      B 5.50 3.00  1   4.809468
#> 3      C 3.25 2.25  1   6.757094
#> 4      D 1.00 2.00  1   1.141017
#> 5      E 5.00 5.35  1   5.691689
#> 6      A 1.25 2.50  2   5.537662
#> 7      B 5.50 3.00  2   6.882749
#> 8      C 3.25 2.25  2  0.4036122
#> 9      D 1.00 2.00  2 -0.3737057
#> 10     E 5.00 5.35  2   2.615708
#> 11     A 1.25 2.50  3   4.310204
#> 12     B 5.50 3.00  3   6.579441
#> 13     C 3.25 2.25  3   4.151736
#> 14     D 1.00 2.00  3   1.221365
#> 15     E 5.00 5.35  3    2.02625
#> 16     A 1.25 2.50  4   5.717283
#> 17     B 5.50 3.00  4   6.993551
#> 18     C 3.25 2.25  4  -1.174889
#> 19     D 1.00 2.00  4   2.402712
#> 20     E 5.00 5.35  4   2.470566
#> 21     A 1.25 2.50  5  -1.419559
#> 22     B 5.50 3.00  5   4.846075
#> 23     C 3.25 2.25  5    0.94149
#> 24     D 1.00 2.00  5 -0.4577825
#> 25     E 5.00 5.35  5    1.65604
#> 26     A 1.25 2.50  6  -2.966733
#> 27     B 5.50 3.00  6   8.013361
#> 28     C 3.25 2.25  6    3.59509
#> 29     D 1.00 2.00  6  -1.276274
#> 30     E 5.00 5.35  6   11.70791
#> 31     A 1.25 2.50  7   2.316161
#> 32     B 5.50 3.00  7   4.614786
#> 33     C 3.25 2.25  7   5.264033
#> 34     D 1.00 2.00  7   2.756267
#> 35     E 5.00 5.35  7   9.395459
#> 36     A 1.25 2.50  8   2.971601
#> 37     B 5.50 3.00  8   7.161753
#> 38     C 3.25 2.25  8   3.110699
#> 39     D 1.00 2.00  8  0.3880747
#> 40     E 5.00 5.35  8    2.96448
#> 41     A 1.25 2.50  9 -0.4867674
#> 42     B 5.50 3.00  9   4.876248
#> 43     C 3.25 2.25  9  0.4028582
#> 44     D 1.00 2.00  9   5.337912
#> 45     E 5.00 5.35  9    11.4626
#> 46     A 1.25 2.50 10  -1.557771
#> 47     B 5.50 3.00 10   4.291345
#> 48     C 3.25 2.25 10   2.200025
#> 49     D 1.00 2.00 10    2.55993
#> 50     E 5.00 5.35 10   4.553975

Создано в 2019-05-06 пакетом представ. (v0.2.1)

0 голосов
/ 06 мая 2019

Я предлагаю другой ответ без dplyr, но я обязан иметь дело с типом данных.Однако я могу смоделировать 10 случайных величин без 10-кратного вызова функции rnorm.Я не знаю, лучше ли звонить 10 раз для одной симуляции или один раз для 10 симуляций.

Данные о проблеме:

Group = c("A","B","C","D","E") 
Mean = c(1.25,5.5,3.25,1,5) 
SD = c(2.5,3,2.25,2,5.35) 
df = data.frame(Group, Mean, SD)

Мой код следующий:

m <- length(Mean)
p <- 10
res <- data.frame(factor("A", level=Group), matrix(0, nrow=m*p, ncol=4))
res[,1] <- rep(Group, each = p)
res[,2] <- rep(Mean, each = p)
res[,3] <- rep(SD, each = p)
res[,4] <- matrix(apply(df, 1, function(row, p){
  rnorm(p, mean=as.numeric(row[2]), sd=as.numeric(row[3]))}, p = p), nrow=p*m, ncol=1)
res[,5] <- rep(seq(1, p), m)

colnames(res) = c("Group", "Mean", "SD", "Est_Mean", "Indices")
res = res[order(res$Indices), ]
...