#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)