【问题标题】:R: can `assign` be used for models?R: `assign` 可以用于模型吗?
【发布时间】:2016-03-04 06:08:38
【问题描述】:

R 中的assign 函数能否用于将对象名称分配给模型(例如 gls 模型)?我猜不是 b/c 我一直收到警告:

 > Warning messages:
 In assign(paste0(deparse(substitute(mod)), "_", i, j), update(mod,  :
  only the first element is used as variable name

因此没有创建对象

有没有办法做到这一点?

如果有帮助,这是我的功能代码:

#Choose best corARMA structure for model of choice:
  corARMA.chooser <- function(mod,min = 0,max = 3 ) {
    #This function creates 1. object for each combo of ARMA {0:3} 2. AIC table comparing all of these models 
    mod <- get('mod')
    aic.arma <- AIC(mod)
    ps <- 0
    qs <- 0
    for(i in min:max) {
      js <- if(i == 0) c(1:max) else c(min:max)
      for(j in js) {
        arma <-  corARMA(p = i, q = j)
        assign(paste0(deparse(substitute(mod)),'_',i,j), update(mod, .~., correlation = arma), envir = .GlobalEnv)
        aic.arma <- c(aic.arma, AIC(get(paste0(deparse(substitute(mod)),'_',i,j))))
        ps <- c(ps, i)
        qs <- c(qs, i)
      }
      aic.arma.out <- data.frame(ps, qs, aic.arma)
      aic.arma.out
    }
  }

更新:

我尝试使用列表方法,但出现错误:

Error in names(mod.list) <- c(names(mod.list), paste0(deparse(substitute(mod)),  : 
'names' attribute [1275] must be the same length as the vector [1]

【问题讨论】:

  • 使用list。错误也不同于警告。
  • 有点模糊。你能详细说明一下吗?
  • 与其尝试为模型分配名称,不如将模型放在一个列表中。命名列表很容易。对列表的每个元素进行处理很容易。总的来说要好得多。 See my answer here for a data frame example.
  • 至于另一部分,警告说 Warning,表示您的代码确实执行了,但是您应该验证潜在的问题。它们提请您注意可能存在的问题,但不一定表示存在问题。错误说 Error 并且意味着代码根本没有执行,它们绝对是一个问题。当你说你“猜测某事没有工作”时,说有一个错误,但显示警告文本,我们想知道它是否真的按预期工作而你没有意识到它或者它是否做了什么否则结果与您的预期有何不同。
  • 如果您需要更多详细信息,您应该分享一些示例输入 - 希望是一个非常简单的案例。您想要的输出看起来相当清楚,但是由于您没有有错误,因此明确说明与您想要的输出相比,您的示例输入的输出是如何缺失的。

标签: r function model assign


【解决方案1】:

编辑:真正撕裂你的变量名的是这一行mod &lt;- get('mod'),在那里你覆盖了mod的命名实例,你为什么要这样做?如果将您的功能更改为此它的行为就像我期望的那样:

corARMA.chooser <- function(modIn,min = 0,max = 3 ) {   
#This function creates 1. object for each combo of ARMA {0:3} 2. AIC table comparing all of these models    mod <- get('modIn')   aic.arma <- AIC(modIn)   ps <- 0   qs <- 0   for(i in min:max) {
js <- if(i == 0) c(1:max) else c(min:max)
 for(j in js) {
  arma <-  corARMA(p = i, q = j)
  browser()
  assign(paste0(deparse(substitute(modIn)),'_',i,j), update(mod, .~., correlation = arma), envir = .GlobalEnv)
  aic.arma <- c(aic.arma, AIC(get(paste0(deparse(substitute(mod)),'_',i,j))))
  ps <- c(ps, i)
  qs <- c(qs, i)
  }
 aic.arma.out <- data.frame(ps, qs, aic.arma)
 aic.arma.out   
 } 
}

希望这是您想要实现的目标。

【讨论】:

  • 你能用多个元素展示你的输出吗?我在我的函数之外一遍又一遍地运行它,它工作得很好。当我在函数中运行该行时,它会给我警告。
  • 我这样称呼你的函数:corARMA.chooser(arima(lh)),因为我的 ts 与我这样称呼更新的update(mod, .~., correlation = arma) 功能不匹配:update(mod)paste0(deparse(substitute(mod)),'_',i,j) 的输出是一个包含大字符的向量。当您将此输出用作函数分配中的变量名称时,它仅在我的情况下使用该向量的第一个元素 "structure(list(coef = structure(2.40000000000009, .Names = \"intercept\"), _01" 如果您使用 paste0(deparse(substitute(mod)),'_',i,j)[1] 而不是调用,则该功能仍然可以正常工作
  • 如果您尝试重现我的函数调用并在 assign(...) 调用中进行调试,这可能会有所帮助。正如我所说,第一个参数只是一个变量名,而 paste0(deparse(substitute(mod)) 返回一个向量,这就是为什么(至少在我的情况下)警告被抛出
  • 我想我终于找到了你的问题
【解决方案2】:

仍然不确定为什么代码单独工作而不是在函数中工作,但很明显 deparse(substitute(mod)) 出于某种原因首先在函数中将 mod 拉到它的所有部分,而不是简单地创建对象本身的名称。

这是我的新代码:

  corARMA.chooser <- function(mod,p = 1,q = 0 ) {
    #This function creates 1. object for each combo of ARMA {0:3} 2. AIC table comparing all of these models 
    mod.list <- NULL
    nms <- NULL
    aic.arma <- AIC(mod)
    ps <- 0
    qs <- 0
    for(i in c(p)) {
      js <- if(i == 0) c(q[q>0]) else c(q)
      for(j in c(js)) {
        arma <-  corARMA(p = i, q = j)
        mod.list <- c(mod.list, list(update(mod, .~., correlation = arma)))
        names(mod.list) <- c(names(mod.list), paste0(deparse(substitute(mod)),'_',i,j))
        aic.arma <- c(aic.arma, AIC(eval(parse(text=(paste0('mod.list$',deparse(substitute(mod)),'_',i,j))))))
        ps <- c(ps, i)
        qs <- c(qs, j)
      }
    } 
      assign(paste0(deparse(substitute(mod)),'_','ARMA'),mod.list, envir = .GlobalEnv)      
      aic.arma.out <- data.frame(p = ps, q = qs, AIC = aic.arma)
      aic.arma.out
  }

【讨论】:

    猜你喜欢
    • 2022-09-09
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 2023-04-04
    • 2014-11-07
    • 2011-08-11
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多