2012-05-13 15 views
6

Ich verwende die "Caret" -Bibliothek, um eine Kreuzvalidierung für einige Bäume durchzuführen. Die Bibliothek stellt eine Funktion mit der Bezeichnung train zur Verfügung, die ein benanntes Argument "method" verwendet. Über seine Ellipse soll es andere Argumente zu einer anderen Funktion durchschlagen lassen, die es aufruft. Diese andere Funktion (rpart) nimmt ein Argument mit dem gleichen Namen, "Methode".benannte Parameter mit dem gleichen Namen

Daher möchte ich zwei Argumente mit dem gleichen Namen übergeben ... und es ist eindeutig fehlgeschlagen. Ich habe versucht, die Dinge wie unten gezeigt, aber ich bekomme den Fehler:

"Fehler in train.default (x = myx, y = myy, Methode =" rpart2 ", preProcess = NULL,: formale Argument" Methode „matched durch mehrere tatsächliche Argumente“

jede Hilfe dankbar ist viel! dank!

train.wrapper = function(myx, myy, mytrControl, mytuneLenght, ...){ 
    result = train(
         x=myx, 
         y=myy, 
         method="rpart2", 
         preProcess=NULL, 
         ..., 
         weights=NULL, 
         metric="Accuracy", 
         trControl=mytrControl, 
         tuneLength=mytuneLenght 

        ) 
    return (result) 
} 
dtree.train.cv = train.wrapper(training.matrix[,2:1777], 
           training.matrix[,1], 
           2, method="class") 
+0

Was macht 'train' mit dem Argument 'method', außer dass es an rpart übergeben wird? –

+0

train verwendet "sein" Methodenargument, um auszuwählen, welche Funktion intern aufgerufen werden soll ... so oben würde train intern die Funktion "rpart" aufrufen, die ein eigenes "method" Argument hat und an das ich versuche zu kommen über die Ellipse des Zuges fahren. – Diego

Antwort

7

Hier ist ein Modell Ihres Problems mit einer tr (Zug) Funktion, die ruft eine rp (rpart) -Funktion auf und übergibt sie ...:

rp <- function(method, ...) method 
tr <- function(method, ...) rp(...) 

# we want to pass 2 to rp: 
tr(method=1, method=2) # Error 
tr(1, method=2)  # 1, (wrong value!) 
tr(method=1, metho=2) # 2 (Yay!) 

Welche Magie ist das? Und warum funktioniert der letzte Fall tatsächlich ?! Nun, wir müssen verstehen, wie Argumentabgleich in R funktioniert. Eine Funktion f <- function(foo, bar) soll formale Parameter "foo" und "bar" haben, und der Anruf f(foo=3, ba=13) soll (tatsächlich) Argumente "foo" und haben "Ba".

R stimmt zuerst mit allen Argumenten überein, die genau den gleichen Namen wie einen formalen Parameter haben. Aus diesem Grund wird das erste Argument "method" an train übergeben. Zwei identische Argumentnamen verursachen einen Fehler.

Dann stimmt R mit allen Argumentnamen überein, die teilweise mit einem (noch nicht übereinstimmenden) formalen Parameter übereinstimmen. Wenn jedoch zwei Argumentnamen teilweise mit dem gleichen formalen Parameter übereinstimmen, führt dies ebenfalls zu einem Fehler. Es passt auch nur formale Parameter vor.... Formalparameter nach... müssen mit ihren vollständigen Namen angegeben werden.

Dann werden die unbenannte Argumente werden in Positions, um die übrigen formalen Argumente abgestimmt. Wenn die formalen Argumente ... sind, werden die verbleibenden Argumente in die ... eingegeben.

PHEW! Also in diesem Fall entspricht der Anruf tr vollständig method, und dann den Rest in ... übergeben. Wenn tr dann rp aufruft, stimmt das metho Argument teilweise mit seinem formalen Parameter method überein, und alles ist gut!

... Immer noch, ich würde versuchen, den Autor von train zu kontaktieren und auf dieses Problem hinweisen, damit er es richtig beheben kann! Da "rpart" und "rpart2" unterstützt werden sollen, muss er diesen Anwendungsfall verpasst haben!

Ich denke, er sollte seinen method Parameter zu method. oder ähnlichem umbenennen (alles länger als "Methode"). Dies ist immer noch abwärtskompatibel, erlaubt aber, dass ein anderer method Parameter korrekt an rpart übergeben wird.

+0

Dank @Tommy, das ist toll. Von dem Moment an, als ich realisierte, was passierte, wusste ich, dass ich über den Argumentvergleich in R lernen musste ... Ich konnte es herausfinden, indem ich meine Antwortvariable als einen Faktor festlegte, der wiederum rpart als Standard verursachte die Methode, die ich versuchte zu setzen. ABER die Dokumentation für rpart selbst sagt "Es ist am klügsten, die Methode direkt zu spezifizieren, zumal mehr Kriterien der Funktion in der Zukunft hinzugefügt werden können." Also ich denke immer noch, es gibt Raum für die Verbesserung der Caret. Ich mailte den Autor, der mit dieser Seite verbunden ist. Es ist die erste Frage, die ich posten und von der Hilfe beeindruckt bin! – Diego

+0

Teuflisch schlau. –

1

allgemeinen Wrapper werden ihre Parameter in einer benannten Liste übergeben. im Falle von train vorgesehen für die Steuerung in den vergangen ist trControl Argument Vielleicht sollten Sie versuchen:

dtree.train.cv = train.wrapper(training.matrix[,2:1777], 
          training.matrix[,1], 
       2, # will be positionally matched, probably to 'myTuneLenght' 
          myTrControl=list(method="class")) 

Nach Ihrem Kommentar habe ich erneut die Hilfeseiten train und rpart überprüft. Sie könnten richtigerweise denken, dass trControl einen anderen Zweck hat. Ich bin verdächtig, dass Sie Ihren Anruf möglicherweise mit einer Formel erstellen müssen, da rpart nur eine Formelmethode hat. Wenn das Argument y ein Faktor als Methode = "Klasse wird von rpart angenommen werden, und ... läuft modelLookup.

modelLookup("rpart2") 
    model parameter   label seq forReg forClass probModel 
154 rpart2 maxdepth Max Tree Depth TRUE TRUE  TRUE  TRUE 

... mir lassen vermuten, dass eine‚Klasse‘Methode standardmäßig angenommen werden würde als Nun, Sie müssen auch Ihre Frage bearbeiten, um ein Datenbeispiel (vielleicht von der rpart Hilfe-Seite?) wenn Sie weitere Beratung benötigen.

+0

Ich gebe ein trainControl-Objekt weiter und ich glaube nicht, dass es das tut, was Sie vorschlagen. Mit Blick auf? Train die Dokumentation beschreibt die Ellipsen: "... \t Argumente an die Klassifikations-oder Regressionsroutine übergeben", während die Dokumentation für? TrainControl Pass-Through Argumente überhaupt nicht erwähnt ... – Diego

Verwandte Themen