有没有一种简单的方法来探索在R中调整参数后函数的输出如何变化?

时间:2019-05-22 14:22:15

标签: r

我正在将一种方法应用于数据集,并试图确定其对每个参数的敏感性。该方法使用了“通用”值,但是我很好奇如果每个值都更大或更小,输出将如何不同。使用一个简单的示例进行描述可能会更容易:

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。我很好奇如果将每个变量分别乘以0.5,输出(var)会如何变化, 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沿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 个答案:

答案 0 :(得分:1)

我想我知道你在做什么。一种方法是使用crossing包中tidyr的一些技巧来制作设计矩阵。然后,您可以使用nestmap来获得结果。如下所示:

# 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