Ich möchte durch einen langen Vektor von möglichen erklärenden Variablen, eine Regressionsvariable auf jeder der Reihe nach durchlaufen. Anstatt die Modellformel zusammenzufügen, denke ich an reformulate()
, as demonstrated here.Irgendwelche Fallstricke bei der Verwendung von programmatisch konstruierten Formeln?
Die unten angegebene Funktion fun()
scheint die Aufgabe zu erfüllen und passt das gewünschte Modell an. Beachten Sie jedoch, dass in seinem Aufrufelement die Name der konstruierten Formel Objekt eher als Wert notiert.
## (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
Meine Frage: Besteht die Gefahr, in diesem? Kann dies ein Problem werden, wenn ich zum Beispiel später eine andere Funktion auf das Modellanpassungsobjekt anwenden möchte (möglicherweise aus einer anderen Umgebung)? update
oder predict
oder ?
Eine etwas peinlichere Alternative, die jedoch die aufgezeichnete Call-Recht erhalten, ist eval(substitute())
zu verwenden. Ist das in irgendeiner Weise ein allgemein sichereres Konstrukt?
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)
Ich denke, das Problem wird vorsichtig mit 'update' siehe [http://stackoverflow.com/questions/13690184/update-inside-a-function-only-searches-the-global-environment]. Sie können diese Fallstricke normalerweise herausfinden, indem Sie versuchen, 'data.table' zu verwenden - siehe [http://stackoverflow.com/questions/15096811/why-is-using-update-on-a-lm-inside-a- grouped-data-table-loss-it-model-data/15376891 # 15376891] – mnel
Das funktioniert: 'do.call (" lm ", Liste (ff, Zitat (mtcars)))' –
@ G.Grothiedieck - Danke . Das sieht gut aus und scheint auf der Straße keine Probleme zu bereiten. (Danke auch mnel für die interessanten Links.) –