r - 是否有一种简单的方法可以探索在 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) 会如何变化.
换句话说,我想看看如果出现以下情况会发生什么:
- 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)),但这没有用。我很感激在这个可重现的示例中只需手动更改内容并单独写出它们不会花费太长时间,但在我的实际代码中,这将是一个真正的麻烦。
解决方案
我想我明白你在做什么。一种方法是使用包中crossing
的一些技巧tidyr
来制作您的设计矩阵。然后你可以使用nest
andmap
来得到你的结果。这将如下所示:
# 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
推荐阅读
- apache-spark - 调用 o67.load 时出错:java.lang.NoClassDefFoundError: org/apache/hadoop/fs/staging/StagingDirectoryCapable
- android - 使用 Jetpack 导航架构组件从一个动态功能模块导航到另一个
- laravel - 在 Laravel 中创建一个使用 WEB 和 API 路由的网站?
- nginx - 无法通过 nginx-gunicorn 在烧瓶应用程序中获取标头
- python - BeautifulSoup/Selenium:在正文中找不到 div 或任何内容
- reactjs - 从单击获取索引并将类设置为反应组件中另一个容器中的相同索引
- c - 如何更改数组的大小并插入另一个元素?
- python - python - 如何根据python中的图像平铺名称在新的emty图像对象中绘制多个图像平铺?
- c# - 系统托盘应用程序 C# 中的后台工作人员和计时器
- php - 如何组合两个循环以形成单个查询 wordpress