2016-03-04 3 views
0

Может ли функция assign в R использоваться для назначения имен объектов для моделей (например, моделей gls)? Я предполагаю, что не б/с я получаю предупреждение:R: может ли `assign` использоваться для моделей?

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

В результате объекты не создаются

Есть ли способ сделать это?

Вот мой fucntion код, если это поможет:

#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 
    } 
    } 

Update:

Я попытался использовать подход списка, но я получаю сообщение об ошибке:

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] 
+1

Используйте 'list'. Также ошибка отличается от предупреждения. – Gregor

+0

Бит неопределенный. не могли бы вы немного рассказать? – theforestecologist

+1

Вместо того, чтобы пытаться назначать имена для моделей, вы должны поместить модели в список. Именование списка очень просто. Делать вещи для каждого элемента списка легко. Это намного лучше. [См. Мой ответ здесь для примера фрейма данных] (http://stackoverflow.com/a/24376207/903061). – Gregor

ответ

1

EDIT: что на самом деле разрывает ваше имя переменной, это строка 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 
} 
} 

надеюсь, что это то, что вы пытаетесь достичь.

+0

Можете ли вы показать свой результат с помощью нескольких элементов? Я запускал это снова и снова вне моей функции, и это работает отлично. Когда я запускаю строку в функции, она дает мне предупреждение. – theforestecologist

+0

Я вызываю вашу функцию следующим образом: 'corARMA.chooser (arima (lh))', поскольку мои ts не соответствуют функциональности 'update (mod,. ~., Corre = = arma)' Я вызываю обновление следующим образом: 'update (мод) '. Вывод 'paste0 (deparse (substitute (mod)), '_', i, j)' представляет собой вектор, содержащий большие символы. Поскольку вы используете этот вывод как имя переменной в назначении функции, он использует только первый элемент этого вектора в моем случае ** «структура (список (coef = structure (2.40000000000009,.Имена = \ "перехват \"), _01 "**, если вы используете вместо своего вызова' paste0 (deparse (substitute (mod)), '_', i, j) [1] 'funciton все еще работает идентично –

+0

it может помочь, если вы попытаетесь воспроизвести мой вызов функции и отладить при вызове assign (...). Как я уже сказал, первый аргумент - это только имя переменной, а 'paste0 (deparse (substitute (mod))' возвращает вектор поэтому (по крайней мере, в моем случае) предупреждение бросается –

0

Все еще не уверен, почему код работает в одиночку, но не в функции, но ясно, что deparse (substitute (mod)) по какой-то причине вытягивает mod отдельно ко всем его частям сначала в функции, vs. просто создавая имя самого объекта.

Вот мой новый код, который работает:

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 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^