我正在将一种方法应用于数据集,并试图确定其对每个参数的敏感性。该方法使用了“通用”值,但是我很好奇如果每个值都更大或更小,输出将如何不同。使用一个简单的示例进行描述可能会更容易:
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。
换句话说,我想看看如果发生以下情况会发生什么情况:
长期目标是生成一个点范围图,其平均'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)),但这没有用。我知道在这个可重现的示例中,只需手动更改并分别将其写出就可以用很长时间,但是在我的实际代码中,这样做确实很麻烦。
答案 0 :(得分:1)
我想我知道你在做什么。一种方法是使用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