r语言 - 如何连续应用相同的变化到一个函数的每个参数?



我正试图弄清楚如何对我开发的模型执行弹性分析。为此,我打算在模型的每个参数上应用10%,并测量输出的变化。我写了一个简单的函数,包括所有的形参作为参数。

我的挑战是,我不知道如何通过apply函数或循环将这个过程自动化到所有参数。

让我们以一个虚拟函数为例:

model <- function(a=1, b=1, c=1){
result <- a+(10*b)+(100*c)
return(result)
}

我想对每个参数应用相同的更改(+其值的10%),并为每个迭代生成一次运行。例如,如果我必须手动操作,它会像这样:

output_a <- model(a=1.1)
> 111.1
output_b <- model(b=1.1)
> 111
output_c <- model(c=1.1)
> 121

理想情况下,所有的输出都应该在同一个数据帧中,以便将来处理它们。对此有什么想法吗?也许是我找不到的现有职位?

创建一个所需值的网格,将其子集到所需的值,然后在其上Mapmapply或在(3)中直接生成它。

v <- c(1, 1.1)
# either of these would be ok
g <- expand.grid(a = v, b = v,  c = v)
# g <- do.call("expand.grid", Map(function(x) v, c("a", "b", "c")))
g <- g[rowSums(g != 1) == 1, ]
# either of these would be ok
transform(g, result = mapply("model", g$a, g$b, g$c))
# transform(g, result = do.call("mapply", c("model", g)))

给:

a   b   c result
2 1.1 1.0 1.0  111.1
3 1.0 1.1 1.0  112.0
5 1.0 1.0 1.1  121.0

2)还可以使用许多列表解析包(comprehension、eList、listcompr):

library(listcompr)
gen.data.frame(data.frame(a, b, c, result = model(a, b, c)), 
a = v, b = v, c = v, (a != 1) + (b != 1) + (c != 1) == 1)

给:

a   b   c result
1 1.1 1.0 1.0  111.1
2 1.0 1.1 1.0  112.0
3 1.0 1.0 1.1  121.0

3)诊断接头我们可以使用diag直接创建g矩阵:

g <- diag(.1, 3) + 1
colnames(g) <- c("a", "b", "c")
cbind(g, result = apply(g, 1, function(x) model(x[1], x[2], x[3])))

给出这个矩阵:

a   b   c result
[1,] 1.1 1.0 1.0  111.1
[2,] 1.0 1.1 1.0  112.0
[3,] 1.0 1.0 1.1  121.0

更改参数名称有点混乱,但是您可以使用do.call()语法来构建命名列表。您还可以使用formalArgs()来获取函数

参数的名称。你可以这样写

lapply(formalArgs(model), function(arg) {
do.call("model", setNames(list(1.1), arg))
})

您还可以使用更整齐的方法来处理rlangpurrr

library(rlang)
library(purrr)
formalArgs(model) %>% 
map(~exec(model, !!.x := 1.1))

相关内容

  • 没有找到相关文章

最新更新