update () wewnątrz funkcji przeszukuje tylko środowisko globalne?
Próbowałem napisać funkcję opakowującą, aby wykonać testy współczynnika wiarygodności w partiach. Próbowałem dołączyć aktualizację (), aby zaktualizować model początkowy. Wydaje się jednak, że zamiast szukać obiektów wewnątrz funkcji, wyszukuje obiekty w środowisku globalnym.
fake <- data.frame(subj= rep(1:5, 4),
factor1 = rep(LETTERS[c(1,2,1,2)], each=5),
factor2 = rep(letters[1:2], each=10),
data=sort(rlnorm(20)))
foo <- function(){
temp <- fake
model1 <- lmer(data~factor1*factor2 + (1 |subj), temp)
model1a <- update(model1, ~.-factor1:factor2)
model1a}
I daje poniżej komunikat o błędzie:
Error in eval(expr, envir, enclos) : object 'factor1' not found
Czy mimo to należy wykonać aktualizację () w obrębie funkcji? Dziękuję Ci!
EDYTOWAĆ:
Popełniłem błąd. Chciałem przekazać „temp” lmerowi, a nie „fałszywemu”.
EDIT2: Jednym z wygodnych rozwiązań sugerowanych jest po prostu określenie obiektu danych. Chociaż update () teraz nie ma z tym problemu, anova () wydaje się myśleć, że modele, które próbuję porównać, są oparte na różnych obiektach danych
foo <- function(){
temp <- fake
model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp)
model1a <- update(model1, ~.-factor1:factor2, data=temp)
anova(model1, model1a)
}
foo()
Otrzymuję komunikat o błędzie:
Error in anova(model1, model1b) :
all models must be fit to the same data object
Przypuszczam, że ten błąd wykracza poza aktualizację (). Ale zastanawiam się, czy ktoś wie, jak można to rozwiązać. Zauważ, że jeśli piszę funkcję bez użycia update () i zamiast tego przeliteruję modele (patrz poniżej), powyższy błąd zniknie:
foo <- function(){
temp <- fake
model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp)
model1a <- lmer(data~factor1 + factor2 + (1 |subj), data=temp)
anova(model1, model1a)
}
foo()
Data: temp
Models:
model1a: data ~ factor1 + factor2 + (1 | subj)
model1: data ~ factor1 * factor2 + (1 | subj)
Df AIC BIC logLik Chisq Chi Df Pr(>Chisq)
model1a 5 -4.6909 3.7535 7.3454
model1 6 -8.8005 1.3327 10.4003 6.1097 1 0.01344 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
EDYCJA 3: Wydaje się, że problem dotyczy anova (). Spróbowałem również sugestii @hadley
foo2 <- function(){
my_update <- function(mod, formula = NULL, data = NULL) {
call <- getCall(mod)
if (is.null(call)) {
stop("Model object does not support updating (no call)", call. = FALSE)
}
term <- terms(mod)
if (is.null(term)) {
stop("Model object does not support updating (no terms)", call. = FALSE)
}
if (!is.null(data)) call$data <- data
if (!is.null(formula)) call$formula <- update.formula(call$formula, formula)
env <- attr(term, ".Environment")
eval(call, env, parent.frame())}
model1 <- lmer(data~factor1*factor2 + (1 |subj), temp)
model1a <- my_update(model1, ~.-factor1:factor2)
anova(model1, model1a)
}
foo2()
Dostałem komunikat o błędzie, jak pokazano poniżej:
Error in as.data.frame.default(data) :
cannot coerce class 'structure("mer", package = "lme4")' into a data.frame