2012-08-02 10 views
8

Ho un problema con il NLME pacchetto utilizzando il seguente codice:Utilizzando prevedere in una chiamata di funzione con oggetti NLME e una formula

library(nlme) 
x <- rnorm(100) 
z <- rep(c("a","b"),each=50) 
y <- rnorm(100) 
test.data <- data.frame(x,y,z) 
test.fun <- function(test.dat) 
{ 
    form <- as.formula("y~x") 
    ran.form <- as.formula("~1|z") 
    modell <- lme(fixed = form, random=ran.form, data=test.dat) 
    pseudo.newdata <- test.dat[1,] 
    predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR! 
} 

test.fun(test.data) 

Il prevedere cause un errore e ho già trovato fondamentalmente provoca.

L'oggetto modell salva il modo in cui è stato chiamato e prevedi sembra utilizzarlo per fare previsioni ma non è in grado di trovare la forma degli oggetti formula e ran.form perché non li cerca nello spazio dei nomi corretto. In realtà, posso evitare il problema in questo modo:

attach(environment(form), warn.conflicts = FALSE) 
predict(modell, newdata= pseudo.newdata) 
detach() 

Il mio obiettivo a lungo termine, tuttavia, è di salvare il Modell su disco e usarle in seguito. Suppongo che potrei provare a salvare anche gli oggetti formula, ma questo mi sembra un modo molto fastidioso e ingombrante per affrontare il problema.

Io lavoro con gli oggetti formula generate automaticamente, invece di scriverle in modo esplicito perché creo molti modelli con definizioni diverse in una sorta di processo batch in modo non riesco a evitarli. Quindi la mia soluzione ideale sarebbe un modo per creare l'oggetto lme in modo da poter dimenticare in seguito l'oggetto formula e prevedere "funziona solo". Grazie per qualsiasi aiuto.

risposta

5

provare a sostituire lme(arg1, arg2, arg3) con do.call(lme, list(arg1, arg2, arg3)).

library(nlme) 
x <- rnorm(100) 
z <- rep(c("a","b"),each=50) 
y <- rnorm(100) 
test.data <- data.frame(x,y,z) 
test.fun <- function(test.dat) 
{ 
    form <- as.formula("y~x") 
    ran.form <- as.formula("~1|z") 
    ## JUST NEED TO CHANGE THE FOLLOWING LINE 
    ## modell <- lme(fixed = form, random=ran.form, data=test.dat) 
    modell <- do.call(lme, list(fixed=form, random=ran.form, data=test.data)) 
    pseudo.newdata <- test.dat[1,] 
    predict(modell, newdata= pseudo.newdata) ###THIS CAUSES THE ERROR! 
} 

test.fun(test.data) 
#   a 
# 0.07547742 
# attr(,"label") 
# [1] "Predicted values" 

Questo funziona perché do.call() valuta i suoi lista degli argomenti nella cornice di chiamata, prima di valutare la chiamata a lme() che costruisce. Per capire perché è supportato da, digitare debug(predict), quindi eseguire il codice e il mio, confrontando i messaggi di debug stampati quando si esegue il pop-up nel browser.

+1

+1 Nizza uso di 'do.call' – Andrie

+0

Brian Ripley mi ha insegnato un trucco simile nel 2003, utilizzando eval. Dal momento che l'ho usato così spesso, lo abbiamo chiamato "gioco di Ripley". http://finzi.psych.upenn.edu/R/Rhelp02a/archive/16599.html –

+1

+1 questo è molto meglio di quanto avessi iniziato a hackerare, il che era qualcosa come 'modell <- lapply (modell $ call , eval.parent) '(ugh). Peccato che questa roba sia necessaria, anche se ... alcuni dei progetti della struttura di modellazione sono (inutilmente ??) fragili ... –

Problemi correlati