【问题标题】:generate a dataframe of parameter values生成参数值的数据框
【发布时间】:2019-04-30 14:30:15
【问题描述】:

我正在尝试为灵敏度分析生成参数值的数据框,其中每一行都是参数空间。我希望能够自动生成数据帧,以便每个参数变化 -10% 和 +10%,而所有其他值保持不变(参见下面的所需 df 示例)。有谁知道我该怎么做?我觉得答案很明显,但真的看不出它是什么!

所需df示例:

a <- c(10,9,11,10,10,10,10,10,10)
b <- c(20,20,20,18,22,20,20,20,20)
c <- c(30,30,30,30,30,27,33,30,30)
d <- c(40,40,40,40,40,40,40,36,44)

parms <- data.frame(a,b,c,d)

【问题讨论】:

    标签: r parameters dplyr tidyverse


    【解决方案1】:

    我认为函数 expand.grid 是您正在寻找的。​​p>

    a <- c(9,10,11)
    b <- c(18,20,22)
    c <- c(27,30,33)
    d <- c(36,40,44)
    test <- expand.grid(a,b,c,d)
    

    要自动化第一部分(围绕中心值变化 10%),您可以使用以下方法:

    library(magrittr)
    vary_around_center <- function(center){
      c(center*0.9, center, center*1.1)
    }
    
    c(10,20,30,40) %>% 
      lapply(vary_around_center) %>% 
      expand.grid
    

    【讨论】:

    • 我喜欢这种方法,但它并不能完全满足我的需要,因为它只是提供了所有变量的每种组合。相反,我希望所有变量都设置为其正常值,然后每个变量都更改 -/+10%,而所有其他变量保持不变。如果您查看示例数据集,我已经给出了这组参数所需的确切结果。
    【解决方案2】:

    我认为这将为您提供示例中显示的“一次更改一个参数”模式。

    params <- c(a = 10, b = 20, c = 30, d = 40)
    
    builder_func <- function(params) {
      opts <- map_df(params, ~c(., .*.9, .*1.1))
      stocks <- map_df(params, ~rep(., 3))
    
      map_df(names(opts),
          ~ bind_cols(
            opts[.],
            stocks[. != names(stocks)]
          )) %>%  
            unique()
    }
    
    builder_func(params)
    
    # A tibble: 9 x 4
    a     b     c     d
    <dbl> <dbl> <dbl> <dbl>
    1    10    20    30    40
    2     9    20    30    40
    3    11    20    30    40
    4    10    18    30    40
    5    10    22    30    40
    6    10    20    27    40
    7    10    20    33    40
    8    10    20    30    36
    9    10    20    30    44
    

    抱歉,我第一次阅读您的问题时错过了细微差别。如果有什么不对劲的地方请告诉我...

    【讨论】:

    • 作为上述答案,这确实与我想要的类似,但不完全是。这些示例参数的预期结果正是我在示例数据中输入的结果。
    • 有你想要的模式吗?如果您需要特定的值,您可能已经有了最好的解决方案
    • 模式并不重要,重要的是每个参数一个一个地改变 -10% 和 +10%,而所有其他参数保持不变(如示例)。
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 2021-06-14
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    • 1970-01-01
    相关资源
    最近更新 更多