2015-04-25 6 views
1

Я изо всех сил пытаюсь написать сценарий, который позволяет использовать более гибкий подход для сравнения различных моделей линейных смешанных эффектов с использованием пакета lme4 или nlme. Поскольку я не хочу настраивать сценарий для каждой модели, которую я добавляю или капля, я ищу динамический подход . Для этого мне нужно было бы только отрегулировать одну переменную, которая содержит символьные строки модельных формул.Как динамически передать аргумент «объект» функции anova()

Это прекрасно работает, если anova() не приходит в anova() не принимает список элементов, содержащих соответствующие классы:.

###### Here is my problem 
# comparing models by means of ANOVA 
anova(lme.lst)         #### --> does not work 
anova(lme.lst[[1]], lme.lst[[2]], lme.lst[[3]]) #### would work but kills the dynamic approach 
###### 

Я не фигурирующие аккуратный способ разложить список и передать несколько аргументов в функция anova(). Я пробовал unlist() без каких-либо успехов.

Вот минимальный пример (адаптировано из lme4 manual, p. 8):

require(lme4) 
require(AICcmodavg) 

# Variable containing of strings in order to describe the fixed effect terms 
# (wihout response/dependen variable)           ### should be orderd from 
callModel <- c("angle ~ recipe + temp  + (1|recipe:replicate)", # model1 ### small 
       "angle ~ recipe + temperature + (1|recipe:replicate)", # model2 ### too     
       "angle ~ recipe * temperature + (1|recipe:replicate)") # model3 ### BIG 

# convert string array 'callFeVar' into a list of formulas 
callModel <- sapply(callModel, as.formula) 

# create an empty list for safing the results of fitted model 
lme.lst <- list() 
# do model fitting in a loop and change list names 
for (i in 1 : length(callModel)) { 
    lmeTmp <- lmer(callModel[[i]], cake, REML= FALSE) 
    lme.lst[i] <- list(lmeTmp) 
    names(lme.lst)[i] <- deparse(callModel[[i]]) 
} 
# remove temporary variable 
rm(lmeTmp) 

# summary of models 
lapply(lme.lst, summary) 

###### Here is my problem 
# comparing models by means of ANOVA 
anova(lme.lst)         #### --> does not work 
anova(lme.lst[[1]], lme.lst[[2]], lme.lst[[3]]) #### would work but kills the dynamic approach 
###### 

# comparing models by means of AICc 
aictab(lme.lst)         #### accepts list 

ответ

5

do.call вызывает функцию с аргументами, поставляемых в виде списка.

do.call(anova, lme.lst) 
+0

Не работает таким образом с минимальным примером. Я получаю: 'Ошибка в anova.merMod (' 'angle ~ recipe + temp + (1 | recipe: replicate)' '= <Объект класса S4 класса« lmerMod »>: Отсутствует аргумент« объект », без default' – ToJo

+0

Я просто искал немного больше, понимая следующее: при использовании 'do.call'' anova' не любит аргументы имени списка. Поэтому, обертывание списка в 'noname' делает трюк:' do.call (anova, unname (lme.lst)). Теперь было бы здорово передать аргумент 'model.names', задав его именам (me.lst)'. Любые идеи? Однако последнее было бы «приятная вещь». – ToJo