首页 > 解决方案 > 是否有一种简单的方法可以探索在 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、1 和 1.5,输出 (var) 会如何变化.

换句话说,我想看看如果出现以下情况会发生什么:

长期目标是生成一个点距图,其中平均 '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)),但这没有用。我很感激在这个可重现的示例中只需手动更改内容并单独写出它们不会花费太长时间,但在我的实际代码中,这将是一个真正的麻烦。

标签: r

解决方案


我想我明白你在做什么。一种方法是使用包中crossing的一些技巧tidyr来制作您的设计矩阵。然后你可以使用nestandmap来得到你的结果。这将如下所示:

# 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

推荐阅读