Синтаксические ошибки при попытке смоделировать набор данных с помощью функции rnorm

Я занимаюсь исследовательским проектом, в рамках которого изучаю прибавку в весе 50 различных групп лабораторных крыс. Каждую неделю я записываю средний вес, а также стандартное отклонение веса для каждой группы крыс. В настоящее время у меня есть данные за 15 недель для 4 групп крыс, однако мне нужны данные за 15 недель для всех 50 групп крыс. (Я получаю 4 новые группы крыс каждые 15 недель).

Для моего исследования я записал свои еженедельные данные в два разных фрейма данных. Кадр данных 1 представляет собой Mean_Weight df для каждой группы крыс и выглядит примерно так:

Mean_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
    Group_3 = runif(15), Group_4 = runif(15) )

Кадр данных 2 представляет собой STD_Weight df для каждой группы крыс и выглядит примерно так:

STD_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
    Group_3 = runif(15), Group_4 = runif(15) )

У меня приближается нехватка времени, и я не могу позволить себе ждать получения полного набора данных, поэтому я пытаюсь использовать функцию rnorm, чтобы обойти это неудобство. Чтобы удовлетворить мои потребности, синтаксис использования функции rnorm будет выглядеть примерно так, как показано ниже:

rnorm(50, mean= *, sd=*]) 

Моя проблема в том, что я не знаю, как правильно закодировать значения параметров mean и sd в функции rnomrm. В идеале я просто хочу использовать значения из каждой ячейки в моих Mean_Data и STD_Data dfs. По завершении это будет выглядеть примерно так:

rnorm(50, mean= Mean_Data[1,1], sd=STD_Data[1,1]) 
rnorm(50, mean= Mean_Data[1,2], sd=STD_Data[1,2]) 
rnorm(50, mean= Mean_Data[1,3], sd=STD_Data[1,3]) 
rnorm(50, mean= Mean_Data[1,4], sd=STD_Data[1,4]) 
.
.
.
 rnorm(50, mean= Mean_Data[15,4], sd=STD_Data[15,4])

Может ли кто-нибудь помочь мне написать какую-то циклическую или прикладную функцию, чтобы мне не приходилось вручную вводить средние значения и значения sd в значения параметров mean и sd каждой функции rnorm?


person Eazie    schedule 01.06.2021    source источник
comment
Итак, вы хотите сгенерировать 15 векторов на Group_*?   -  person Rui Barradas    schedule 01.06.2021


Ответы (2)


Вы можете сделать это с

rnormList <- lapply(names(Mean_Data), function(groupdId) {
  lapply(1:NROW(Mean_Data), function(k) {
    rnorm(n = 50, mean = Mean_Data[[groupdId]][k], sd = STD_Data[[groupdId]][k])
  })
})

Чтобы знать, что есть что, вы также можете добавить имена, такие как

rnormList <- setNames(lapply(names(Mean_Data), function(groupdId) {
  setNames(lapply(1:NROW(Mean_Data), function(k) {
    rnorm(n = 50, mean = Mean_Data[[groupdId]][k], sd = STD_Data[[groupdId]][k])
  }), paste0("mean=",Mean_Data[[groupdId]],",sd=",STD_Data[[groupdId]]))
}),names(Mean_Data))
person Jonas    schedule 01.06.2021

Вот двойной Map однострочник.

rand_list <- Map(function(M, S) {do.call(cbind, Map(function(m, s) rnorm(50, m, s), M, S))}, Mean_Data, STD_Data)

str(rand_list)
#List of 4
# $ Group_1: num [1:50, 1:15] 0.452 0.447 0.461 0.433 0.457 ...
# $ Group_2: num [1:50, 1:15] -0.3543 0.6925 -0.0813 -0.3047 0.6171 ...
# $ Group_3: num [1:50, 1:15] -0.2151 -0.18883 0.00794 0.04713 0.05671 ...
# $ Group_4: num [1:50, 1:15] 0.911 0.573 0.927 0.626 0.892 ...

Члены списка могут быть доступны любому из

rand_list$Group_1
rand_list[["Group_1"]]
rand_list[[1]]

Код создания данных

Следующее устанавливает начальное число ГСЧ перед созданием наборов данных среднего и стандартного отклонения.

set.seed(2021)    # Make the results reproducible
Mean_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
                         Group_3 = runif(15), Group_4 = runif(15) )
STD_Data <- data.frame( Group_1 = runif(15), Group_2 = runif(15), 
                        Group_3 = runif(15), Group_4 = runif(15) )
person Rui Barradas    schedule 01.06.2021