Привязать кадры данных по строкам к l oop в R - PullRequest
0 голосов
/ 13 июля 2020

Я хочу выполнить моделирование Монте-Карло со средним значением (i), изменяющимся от 5 до 60 с интервалом 5, и j, изменяющимся от 0 до 1 с шагом 0,125. В качестве вывода следующего кода я хочу, чтобы кадр данных, полученный для каждого j, привязывался к строке. Например, если я хочу выполнить 10 000 симуляций для данного j, результирующий кадр данных (т.е. DF1) будет иметь 12 столбцов и 10000 строк, где 12 представляет длину i (т.е. 60/50. Затем DF1 для каждого j следует связывать по строкам. Таким образом, для 8 значений j в окончательном фрейме данных DF2 будет иметь 80000 строк и 12 столбцов. Однако при запуске этого кода я получаю следующее сообщение об ошибке: «Ошибка в списке данных [[j]] <- DF1 : попытка выбрать менее одного элемента в integerOneIndex "</p>

Код:

datalist = list()
for (j in seq(0, 1, 0.125)){
  DF1 <- do.call(cbind, lapply(seq(5,60,5), function(i) setNames(data.frame(rlnorm(n=10000, log(i^2 / sqrt((i*j)^2 + i^2)), sqrt(log(1 + ((i*j)^2 / i^2))))), i)))
  datalist[[j]] <- DF1
}
DF2 = do.call(rbind, datalist)

1 Ответ

1 голос
/ 14 июля 2020

Есть гораздо менее сложный способ сделать это. Во-первых, вы, вероятно, действительно не хотите j=0, так как это делает стандартное отклонение равным нулю, а все значения постоянны, но я буду придерживаться установленных вами параметров:

ivals <- seq(5, 60, 5)
jvals <- seq(0, 1, 0.125)
n <- 10                      # Just 10 values for testing
ijval <- expand.grid(ival=ivals, jval=jvals)  # 108 combinations of i and j
draw <- function(i, j, n) {rlnorm(n, log(i^2 / sqrt((i*j)^2 + i^2)), sqrt(log(1 + ((i*j)^2 / i^2))))}
DF <- t(mapply(draw, i=ijval$ival, j=ijval$jval, n=n))   # 108 rows by n columns

Обратите внимание, что вы можете DF2 <- cbind(ijval, DF), если вы хотите, чтобы столбцы указывали значения i и j для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...