【问题标题】:Writing a function for initializing parameters in R/Splus在 R/Splus 中编写用于初始化参数的函数
【发布时间】:2011-08-07 00:45:56
【问题描述】:

我想编写一个函数,该函数将创建并返回一组要在我创建的函数mySimulation 中使用的参数。到目前为止,我基本上一直在做,例如mySimulation(parm1 = 3, parm2 = 4)。现在这是次优的,因为 (1) 在实际版本中,参数的数量变得难以处理,并且 (2) 我想跟踪产生我正在使用的不同模型的参数的不同组合。所以,我写了createParms(下面显示的一个最低限度的版本)来解决这个问题。不过,我的整个方法似乎很笨拙。由于所有统计学家都使用 R,我确信有一种更标准的方式来处理我的问题……对吗?

createParms <- function(model = "default", ...) {
  # Returns a list `parms` of parameters which will then be used in  
  # mySimultation(parms)
  #
  # Args:
  #   model: ["default" | "mymodel"] character string representation of a model 
  #          with known parameters
  #   ...: parameters of the existing `model` to overwrite.
  #        if nothing is supplied then the model parameters will be left as is. 
  #        passed variables must be named.
  #        e.g., `parm1 = 10, parm2 = 20` is good. `10, 20` is bad. 
  #
  # Returns:
  #   parms: a list of parameters to be used in mySimulation(parms)
  #          
  parms.names <- c("parm1", "parm2")
  parms <- vector(mode = "list", length = length(parms.names))
  names(parms) <- parms.names
  overwrite <- list(...)
  overwrite.names <- names(overwrite)
  if (model == "default") {
    parms$parm1 <- 0
    parms$parm2 <- 0
  } else if (model == "mymodel") {
      parms$parm1 <- 1
      parms$parm2 <- 2
  } 
  if (length(overwrite) != 0) {
    parms[overwrite.names] <- overwrite
  }
  return(parms)
}

【问题讨论】:

    标签: r s-plus


    【解决方案1】:

    我想如果你知道每个模型要使用的参数组合,那么最好创建一个模型名称和参数的数据框,如下所示

    # create a data frame with model names and parameters
    # NOTE: i am assuming all models have equal number of parameters
    # if they are unequal, then store as list of models
    
    model = c('default', 'mymodel');
    parm1 = c(0.5, 0.75);
    parm2 = c(1, 2);
    
    models.df = data.frame(model, parm1, parm2)
    

    您现在可以通过将任何模型作为参数传递给您的 mySimulation 函数来模拟任何模型。我使用了一个虚拟模拟示例,您可以将其替换为您的代码。

    # function to run simulation based on model name
    
    mySimulation = function(model = 'default'){
    
      # find row corresponding to model of interest
      mod.row = match(model, models.df$model)
    
      # extract parameters corresponding to model
      parms   = models.df[mod.row, -1]
    
      # run dummy simulation of drawing normal random variables
      sim.df  = rnorm(100, mean = parms[,1], sd = parms[,2])
      return(sim.df)
    
    }
    

    如果您现在想一步运行所有模拟,您可以使用出色的 plyr 包并调用

    library(plyr)
    sim.all = ldply(models.df$model, mySimulation)
    

    如果您的每个模拟都返回不相等数量的值,那么您可以使用函数llply 而不是ldply

    如果您提供有关模拟的返回值及其作用的详细信息的更多信息,则可以轻松调整此代码以获得您想要的。

    让我知道这是否有效

    【讨论】:

    • 这是一个非常好的解决方案。也更快。来自我的更多信息:(1)mySimulation() 从具有噪声和动量的跳跃扩散模型返回路径,(2)我使用 Splus 是因为 FinMetrics 包中的一些好东西,所以不幸的是,我将无法使用plyr
    【解决方案2】:

    如果模拟函数总是采用相同的参数集,那么 Ramnath 将它们存储在数据框中的方法是最好的。对于mySimulation 的变量输入的更一般情况,您应该将每组输入存储在一个列表中——可能使用一个列表列表来运行多个模拟。

    createParms 函数背后的想法看起来很合理;你可以稍微简化一下代码。

    createParms <- function(model = "default", ...) 
    {
      #default case
      parms <- list(
        parm1 = 0,
        parm2 = 0
      )
    
      #other special cases
      if(model == "mymodel")
      {
        parms <- within(parms,     
        {
          parm1 <- 1
          parm2 <- 2
        })  
      }
    
      #overwrite from ...
      dots <- list(...)
      parms[names(dots)] <- dots
    
      parms
    }
    

    用例如,测试这个,

    createParms()
    createParms("mymodel")  
    createParms("mymodel", parm2 = 3)
    

    do.call 在运行模拟时可能会派上用场,例如

    do.call(mySimulation, createParms())
    

    编辑:do.call 为您做什么

    如果你有parms &lt;- createParms(),那么

    do.call(mySimulation, parms)
    

    相同
    with(parms, mySimulation(parm1, parm2))
    

    主要优点是您无需拼出要传递给mySimulation 的每个参数(或修改该函数以接受列表形式的参数)。

    【讨论】:

    • 非常有帮助!已经编辑了我的函数以反映您的更正。一个后续问题:我从来不理解do.call 的用法。在这种情况下,我想为什么不直接做mySimulation(createParms())。但是do.call 在这种情况下的优点是我不需要编辑mySimulation 来处理参数列表parms。它仍然可以按原样工作......我理解对了吗?
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2011-09-04
    • 2012-01-15
    • 2021-03-13
    • 2019-01-26
    相关资源
    最近更新 更多