Список фреймов данных с экспоненциальной функцией рисуется на основе строк в другом фрейме данных

#r

Вопрос:

Я довольно новичок в R и пытаюсь провести некоторое моделирование. У меня есть фрейм данных когорт с различными настройками

 n = 10000
ir.1 = c(0.01, 0.02, 0.05)
ir.2 = c(0.1, 0.2, 0.3, 0.4)
setting.1 = c(0.5, 0.9)
setting.2 = c(0.4, 0.6)

cohorts = expand.grid(n = n, ir.1 = ir.1, ir.2 = ir.2, setting.1 = setting.1, setting.2 = setting.2)
 

Основываясь на этом, я хотел бы провести моделирование с использованием каждой когорты (каждой строки в структуре данных когорт).
Я пытался использовать replicate

 sim_list = replicate(n = nrow(cohorts),
            expr = {data.frame(
                            time.1 = rexp(n, ir.1),
                            time.2 = rexp(n, ir.2)
                            )}, simplify = F            
            )

str(sim_list)                                                                                    
List of 48
 $ :'data.frame':       10000 obs. of  2 variables:
  ..$ time.1: num [1:10000] 156.75 68.2 4.81 105.74 29.82 ...
  ..$ time.2: num [1:10000] 5.66 13.08 3.88 3.32 23.99 ...
 $ :'data.frame':       10000 obs. of  2 variables:
  ..$ time.1: num [1:10000] 134.7 48.1 30.9 46 104.2 ...
  ..$ time.2: num [1:10000] 20.57 2.38 1.64 2.49 1.53 ...
................
 

Из этого я получаю список из 48 кадров данных по 10000 строк в каждом, но экспоненциальная функция, похоже, каждый раз строится на одной и той же настройке.

Я хочу, чтобы розыгрыши sim_list[[1]] основывались на настройке в первой строке когорт (когорт[1,]), розыгрыши sim_list[[2]] основывались на когортах[2,] и так далее…

Это приведет к тому, что среднее значение времени каждого кадра данных.1 будет варьироваться от прибл. 20-100 (на основе значений ir.1), но они варьируются примерно от 55 до 58 (эквивалентно рисованию rexp с использованием среднего из 3 значений в ir.1???) :

 range(lapply(sim_list, function(x) { mean(x[['time.1']])}))
[1] 55.49693 58.35876
 

Проблема, вероятно replicate , в том, что для этого используется функция, но я не могу понять, как это сделать иначе. Создайте один большой фрейм данных и сгруппируйте их по номеру когорты? Используя какую-то функцию apply? Что-нибудь еще?

Я надеюсь, что в этом есть смысл!

Ответ №1:

Если я правильно понимаю, вы хотите смоделировать некоторые данные для каждой комбинации параметров. Две проблемы с вашим кодом: 1) репликация не делает того, что вы могли бы подумать, 2) причина, по которой результаты одинаковы, заключается в том, что она использует ту же переменную, которую вы определили в начале, а не значения в вашем фрейме данных.

Вот альтернатива

 sim_list = function(cohorts) {
  data.frame(
    time.1 = rexp(cohorts["n"], cohorts["ir.1"]),
    time.2 = rexp(cohorts["n"], cohorts["ir.2"])
  )
}

res=apply(cohorts,1,sim_list)
 

Для проверки диапазонов времени.1

 lapply(lapply(res,"[[",1),range)