Sto cercando di scorrere un lungo vettore di potenziali variabili esplicative, regredendo una variabile di risposta su ciascuna a turno. Invece di incollare insieme la formula del modello , sto pensando di utilizzare reformulate()
, as demonstrated here.Eventuali insidie nell'utilizzo di formule progettate in modo programmatico?
La funzione fun()
sembra eseguire il lavoro, adattando il modello desiderato. Si noti, tuttavia, che registra nel proprio elemento di chiamata il nome dell'oggetto formula costruito anziché il valore .
## (1) Function using programatically contructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = mpg ~ cyl + disp, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
La mia domanda: C'è qualche pericolo in questo? Questo può diventare un problema se, ad esempio, voglio applicare in seguito update
o predict
o qualche altra funzione all'oggetto di adattamento del modello, (probabilmente da qualche altro ambiente)?
Un'alternativa leggermente più scomoda che fa, tuttavia, ottenere il diritto di chiamata registrato è utilizzare eval(substitute())
. Questo è in qualche modo un costrutto generalmente più sicuro?
fun2 <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
eval(substitute(lm(FF, data=mtcars), list(FF=ff)))
}
fun2(XX=c("cyl", "disp"))$call
## lm(formula = mpg ~ cyl + disp, data = mtcars)
Penso che il problema sarà accurato usando 'update' vedere [http://stackoverflow.com/questions/13690184/update-inside-a-function-only-searches-the-global-environment]. Di solito puoi scoprire queste trappole provando ad usare 'data.table' - vedi [http://stackoverflow.com/questions/15096811/why-is-using-update-on-a-lm-inside-a- grouped-data-table-lose-its-model-data/15376891 # 15376891] – mnel
Funziona: 'do.call (" lm ", lista (ff, quote (mtcars)))' –
@ G.Grothendieck - Grazie . Sembra buono, e sembra che non dovrebbe creare problemi lungo la strada. (Inoltre, grazie mnel per i collegamenti interessanti.) –