Включить объект в функцию, только если он существует - PullRequest
0 голосов
/ 15 марта 2019

У меня есть цикл, который должен быть выполнен;внутри которого 6 моделей.Затем объекты, в которых хранятся эти модели, должны быть переданы в функцию, которая выполняет анализ AIC.Однако иногда одна из моделей не работает, что приводит к нарушению кода для функции AIC, поскольку она не распознает какую-либо модель, в которой произошел сбой, поскольку она не была сохранена как объект.

Итак, мне нужен способ получить те модели, которые работали в функции AIC.

Вот пример, но имейте в виду, важно, чтобы все это можно было выполнить в цикле,Вот три гипотетические модели:

hn.1 <- ds(data) 
hn.1.obs <- ds(data,formula = ~OBSCODE) 
hn.1.obs.mas <- ds(dataformula = ~OBSCODE+MAS)

И это будет моя функция AIC, которая сравнивает модели:

summarize_ds_models(hn.1, hn.1.obs, hn.1.obs.mas)    

Но я получаю ошибку, если, скажем, hn.1.obsНе удалось .mas модель.

Я попытался использовать "get" и "ls", и я успешно извлекаю модели, которые существуют, когда я звоню:

get(ls(pattern='hn.15*'))

Но это просто возвращает символьный вектор, поэтому, когда я звоню:

summarize_ds_models(get(ls(pattern='hn.15*')))

, он проводит анализ AIC только для первой модели в приведенном выше символьном векторе.

Я на правильном пути или есть лучший способ сделать это?

ОБНОВЛЕНИЕ с воспроизводимым примером.

Вот упрощенныйверсия моей проблемы:

создайте и заполните два фрейма данных, которые будут помещены в список:

data.frame <- data.frame(x = integer(4),
                         y = integer(4),
                         z = integer(4),
                         i = integer(4))
data.frame$x <- c(1,2,3,4)
data.frame$y <- c(1,4,9,16)
data.frame$z <- c(1,3,8,10)
data.frame$i <- c(1,5,10,15)

data.frame.2 <- data.frame[1:4,1:3]

my.list <- list(data.frame,data.frame.2)

создайте df для заполнения лучшими моделями из анализа AIC

bestmodels <- data.frame(modelname = character(2)) 

Вот функция, которая будет запускать цикл:

myfun <- function(list) {

for (i in 1:length(my.list)){

mod.1 = lm(y ~ x, data = my.list[[i]])
mod.2 = lm(y ~ x + z, data = my.list[[i]])
mod.3 = lm(y ~ i, data = my.list[[i]])  

bestmodels[i,1] <- rownames(AIC(mod.1,mod.2,mod.3))[1]#bestmodel is 1st row  
}
  print(bestmodels)
}

Однако на второй итерации цикла функция AIC завершится сбоем, поскольку произойдет сбой mod.3.Итак, есть ли общий способ сделать так, чтобы функция AIC выполнялась только для тех моделей, которые работали?Результат, который я хотел бы получить здесь:

> bestmodels
  modelname
1     mod.1
2     mod.1

, поскольку для обоих анализов AIC будет выбран мод.1.

1 Ответ

0 голосов
/ 20 марта 2019

Комментарий Грегора:

Используйте список вместо отдельных именованных объектов.Затем выполните do.call (sumrize_ds_models, my_list_of_models).Если это еще не сделано, вы можете сначала отфильтровать список, чтобы убедиться, что в списке присутствуют только рабочие модели.

решил мою проблему.Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...