генерировать кадр данных значений параметров - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь сгенерировать массив данных значений параметров для анализа чувствительности, где каждая строка представляет собой пространство параметров. Я хотел бы иметь возможность автоматизировать генерацию кадра данных таким образом, чтобы каждый параметр варьировался на -10% и + 10%, в то время как все остальные значения остаются неизменными (см. Ниже пример желаемого df). Кто-нибудь знает, как я могу это сделать? Я чувствую, что ответ очевиден, но на самом деле не вижу, что это!

Пример желаемого df:

a <- c(10,9,11,10,10,10,10,10,10)
b <- c(20,20,20,18,22,20,20,20,20)
c <- c(30,30,30,30,30,27,33,30,30)
d <- c(40,40,40,40,40,40,40,36,44)

parms <- data.frame(a,b,c,d)

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Я думаю, что функция expand.grid - это то, что вы ищете.

a <- c(9,10,11)
b <- c(18,20,22)
c <- c(27,30,33)
d <- c(36,40,44)
test <- expand.grid(a,b,c,d)

Чтобы автоматизировать первую часть (отклонение на 10% от значения центра), вы можете использовать этот подход:

library(magrittr)
vary_around_center <- function(center){
  c(center*0.9, center, center*1.1)
}

c(10,20,30,40) %>% 
  lapply(vary_around_center) %>% 
  expand.grid
1 голос
/ 30 апреля 2019

Я думаю, что это даст вам шаблон "один параметр меняется за раз", который вы показали в своем примере.

params <- c(a = 10, b = 20, c = 30, d = 40)

builder_func <- function(params) {
  opts <- map_df(params, ~c(., .*.9, .*1.1))
  stocks <- map_df(params, ~rep(., 3))

  map_df(names(opts),
      ~ bind_cols(
        opts[.],
        stocks[. != names(stocks)]
      )) %>%  
        unique()
}

builder_func(params)

# A tibble: 9 x 4
a     b     c     d
<dbl> <dbl> <dbl> <dbl>
1    10    20    30    40
2     9    20    30    40
3    11    20    30    40
4    10    18    30    40
5    10    22    30    40
6    10    20    27    40
7    10    20    33    40
8    10    20    30    36
9    10    20    30    44

Извините, я пропустил этот нюанс, когда впервые прочитал ваш вопрос. Дайте мне знать, если что-то не так ...

...