2014-12-17 34 views
5

Se uno ha i seguenti datiSintesi del modello di lme4 nella funzione (lmerTest)

d = data.frame(out=rnorm(10), explain=rnorm(10), age=rnorm(10), sex=sample(c("M", "F"), size=10, replace=T), group=rep(c(1:5), 2)) 
f = as.formula("out ~ explain + age + sex + (1|group)") 

e vuole montare un modello lineare con lme4 si può fare

require(lme4) 
require(lmerTest) 
m = lmer(f, d) 
s = summary(m) 

che funziona, bene .. .. Ma se il modello è montato all'interno di un'altra funzione come

gglm = function(form, data){ 
    lm = lmer(form, data=data) 
    return(lm) 
} 
m2 = gglm(f, d) 
s2 = summary(m2) 

Ho un errore.

summary from lme4 is returned 
some computational error has occurred in lmerTest 

Apparentemente, questo è perché il montaggio del modello è stato fatto con un oggetto chiamato data, che non è visibile nell'ambito esterno. Quindi se faccio data = d ottengo lo stesso risultato di prima. Tuttavia, se lo faccio

data = data.frame(out=rnorm(10), explain=rnorm(10), age=rnorm(10), sex=sample(c("M", "F"), size=10, replace=T), group=rep(c(1:5), 2)) 

invece di ottenere dati diversi, il risultato del riepilogo è sbagliato.

Questo sembra non essere il modo migliore per farlo e penso che sia facile sbagliare. Il normale lm e la relativa funzione summary non hanno questo problema. Non c'è un modo per rendere il riepilogo lmerTest meno soggetto a errori?

+0

Sembra un problema di scoping. Dovresti inviare una segnalazione di bug. – Roland

+0

Probabilmente è un bug, ma controlla se http://stackoverflow.com/questions/11778773/using-predict-in-a-function-call-with-nlme-objects-and-a-formula aiuta. –

risposta

2

Il trucco do.call funziona (ma è una soluzione, di sicuro).

gglm = function(form, data){ 
    lm = do.call(lmer, list(formula=form, data=data)) 
    return(lm) 
} 
m2 = gglm(f, d) 
s2 = summary(m2)