Есть ли простой способ изучить, как выходные данные функции изменяются при настройке параметров в R? - PullRequest
1 голос
/ 22 мая 2019

Я применяю метод к набору данных и пытаюсь определить его чувствительность к каждому параметру. Существуют «общие» значения, используемые методом, но мне любопытно, как выходные данные будут отличаться, если они будут больше или меньше. Это может быть проще описать с помощью простого примера:

library(tidyverse)
library(magrittr)

data <- data.frame(let = c("Alpha","Beta","Gamma","Delta"), num = c(1,2,3,4))

data$var = NA

ftn <- function(df, A, B, C){
  df %<>% mutate(var = num * (A*3 + B*(2/3) - C))
}

data <- ftn(data, A = 4, B = 2, C = 6)

Функция ftn, приведенная выше, принимает A, B, C, которые я дал в качестве общих значений 4, 2 и 6. Мне любопытно, как изменился бы выход (var), если бы каждый из них умножался отдельно на 0,5, 1 и 1,5.

Другими словами, я бы хотел посмотреть, что произойдет, если:

  • A = 2 , B = 2, C = 6
  • A = 4 , B = 2, C = 6
  • A = 6 , B = 2, C = 6
  • A = 4, B = 1 , C = 6
  • A = 4, B = 2 , C = 6
  • A = 4, B = 3 , C = 6
  • A = 4, B = 2, C = 3
  • A = 4, B = 2, C = 6
  • A = 4, B = 2, C = 9

Долгосрочная цель состоит в том, чтобы создать точечный график со средним значением 'var', равным y, и измененной переменной вдоль x, так что, возможно, конечный результат будет выглядеть следующим образом:

+-------------------+------+-----+------+
| Changed Parameter | x1.5 | x1  | x0.5 |
+-------------------+------+-----+------+
| A                 |   20 |  10 |   5  |
| B                 |   15 |  10 |   3  |
| C                 |   12 |  10 |   1  |
+-------------------+------+-----+------+

# NB: Numbers aren't right here, just for example #

Так что это будет случай построения графика зависимости x1 от измененного параметра с ymin = x0.5 и ymax = x1.5.

Я немного растерялся относительно того, как этого добиться, просто не меняя числа вручную. Я попытался просто ввести вектор (например, A = c (2,4,6)), но это не сработало. Я ценю, что в этом воспроизводимом примере не займет слишком много времени, чтобы просто изменить вещи вручную и записать их отдельно, но в моем реальном коде это было бы настоящим недостатком.

1 Ответ

1 голос
/ 22 мая 2019

Мне кажется, я понимаю, что ты делаешь.Один из способов сделать это - использовать некоторые трюки из crossing из пакета tidyr для создания матрицы дизайна.Затем вы можете использовать nest и map, чтобы получить свои результаты.Это будет выглядеть следующим образом:

# Cross makes the model grid
crossing(A = c(2,4,6), B = c(1,2,3), C = c(3,6,9), num = c(1,2,3,4)) %>% 
  mutate(scenario_id = row_number()) %>%  # ID for grouping
  group_by(scenario_id) %>%  # Group for nesting
  nest() %>%  # Nesting
  mutate(result = map(data, ftn)) %>%  # Now apply your function for each scenario
  unnest() # Return the result

Что даст вам что-то вроде этого:

# A tibble: 108 x 10
   scenario_id     A     B     C   num    A1    B1    C1  num1     var
         <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>   <dbl>
 1           1     2     1     3     1     2     1     3     1   3.67 
 2           2     2     1     3     2     2     1     3     2   7.33 
 3           3     2     1     3     3     2     1     3     3  11    
 4           4     2     1     3     4     2     1     3     4  14.7  
 5           5     2     1     6     1     2     1     6     1   0.667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...