我試着編寫一個包裝函數來分批做可能性比率測試。我試圖包含update()來更新初始模型。但是,似乎不是在函數內查找對象,而是在全局環境中搜索對象。update()函數裏面只搜索全局環境?
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}
,它給下面的錯誤消息:
Error in eval(expr, envir, enclos) : object 'factor1' not found
反正是有使函數內的update()搜索?謝謝!
編輯:
我犯了一個錯誤。我想通過「臨時」給lmer,而不是「假」。
EDIT2: 建議的一個方便的解決方案是簡單地指定數據對象。雖然更新()現在有這個沒有問題,方差分析()似乎認爲,我想比較模型是基於不同的數據對象
foo <- function(){
temp <- fake
model1 <- lmer(data~factor1*factor2 + (1 |subj), data=temp)
model1a <- update(model1, ~.-factor1:factor2, data=temp)
anova(model1, model1a)
}
foo()
我得到一個錯誤信息:
Error in anova(model1, model1b) :
all models must be fit to the same data object
我想這個錯誤超越了update()。但我想知道有沒有人知道如何解決這個問題。需要注意的是,如果我寫的功能,而無需使用update()方法,而是拼出來的模型(見下文),上述錯誤就會消失:
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
編輯3: 看來這個問題是與方差分析() 。我也@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()
我得到一個錯誤消息試過的建議,如下圖所示:
Error in as.data.frame.default(data) :
cannot coerce class 'structure("mer", package = "lme4")' into a data.frame
適合我,在R 2.15中沒有錯誤。1,除了需要加載lme4包 – MattBagg
您是否想將'temp'傳遞給'lmer'而不是'fake'? – BenBarnes
對不起,是的,我想把溫度傳給lmer,而不是假的 – Alex