R:可以`assign`用于模型吗?

时间:2016-03-04 06:08:39

标签: r function model assign

可以使用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]

2 个答案:

答案 0 :(得分:1)

编辑:实际上你的变量名称撕裂的是这一行mod <- 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   
 } 
}

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

答案 1 :(得分:0)

仍然不确定为什么代码单独工作但不在函数中,但很明显,deparse(替换(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
  }