2012-05-13 36 views
6

Estoy usando la biblioteca 'caret' para hacer algunas validaciones cruzadas en algunos árboles.parámetros con el mismo nombre

La biblioteca proporciona una función llamada train, que toma un argumento con nombre "método". A través de sus puntos suspensivos se supone que permite que otros argumentos caigan en otra función que llama. Esta otra función (rpart) toma un argumento del mismo nombre, "método".

Por lo tanto, quiero pasar dos argumentos con el mismo nombre ... y claramente está fallando. Traté de evitar las cosas como se muestra a continuación, pero me sale el error:

"Error en train.default (x = myx, y = myy, method =" rpart2 ", preProcess = NULL,: argumento formal" método "acompañado de varios argumentos reales"

cualquier ayuda es muy apreciada! gracias!

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

¿Qué hace 'entrenar' con el argumento 'método', que no sea pasarlo a rpart? –

+0

tren usa el argumento "its" method para elegir a qué función llamar internamente ... así que arriba, train llamaría internamente a la función "rpart" que tiene un argumento de "método" y al cual estoy tratando de acceder pasando por las elipsis del tren. – Diego

Respuesta

7

Aquí hay una maqueta de su problema con una función tr (tren) que llama a una función rp (rpart), pasándola ...:

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!) 

¿Qué magia es esta? ¿Y por qué el último caso realmente funciona? Bueno, tenemos que entender cómo funciona la coincidencia de argumentos en R. Se dice que una función f <- function(foo, bar) tiene parámetros formales "foo" y "barra", y se dice que la llamada f(foo=3, ba=13) tiene argumentos "foo" y "licenciado en Letras".

R primero coincide con todos los argumentos que tienen exactamente con el mismo nombre que un parámetro formal. Esta es la razón por la cual el primer argumento de "método" pasa a train. Dos nombres de argumento idénticos causan un error.

Luego, R coincide con cualquier nombre de argumento que coincida parcialmente con un parámetro formal (pero no coincidente). Pero si dos nombres de argumento coinciden parcialmente con el mismo parámetro formal, eso también causa un error. Además, solo coincide con los parámetros formales antes de.... Por lo tanto, los parámetros formales después de... se deben especificar con sus nombres completos.

A continuación, los argumentos sin nombre coinciden en orden posicional con los restantes argumentos formales. Por último, si los argumentos formales incluyen ..., los argumentos restantes se ponen en el ....

PHEW! Entonces, en este caso, la llamada a tr coincide completamente con method, y luego pasa el resto a .... Cuando tr llama a rp, el argumento metho coincide parcialmente con su parámetro formal method, ¡y todo está bien!

... Todavía, trataría de contactar al autor de train y señalar este problema para que pueda arreglarlo correctamente! Como se supone que "rpart" y "rpart2" son compatibles, ¡debe haberse perdido este caso de uso!

Creo que debería cambiar el nombre de su parámetro method a method. o similar (cualquier cosa más larga que "método"). Esto seguirá siendo compatible con versiones anteriores, pero permite que otro parámetro method se pase correctamente al rpart.

+0

Gracias @Tommy, esto es genial. Desde el momento en que me di cuenta de lo que estaba sucediendo, supe que tendría que aprender sobre la coincidencia de argumentos en R ... Pude resolverlo especificando mi variable de respuesta como un factor, que a su vez provocó que rpart cambiara a el método que estaba tratando de establecer. PERO la documentación para la parte misma dice: "Es más acertado especificar el método directamente, especialmente a medida que se agreguen más criterios a la función en el futuro". Así que todavía creo que hay espacio para mejorar el caret. He enviado un correo electrónico al autor, vinculado a esta página. ¡Es la primera pregunta que publico y estoy impresionado por la ayuda! – Diego

+0

Diabólicamente inteligente. –

1

general envoltorios pasarán sus parámetros en una lista llamada. en el caso de train, la provisión para el control se pasa en el argumento trControl. Tal vez deberías probar:

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

Después de tu comentario, volví a revisar las páginas de ayuda train y rpart. Bien podría estar en lo cierto al pensar que trControl tiene un propósito diferente. Sospecho que puede necesitar construir su llamada con una fórmula ya que rpart solo tiene un método de fórmula. Si el argumento y es un factor de method = "clase será asumido por rpart Y ... corriendo modelLookup:.

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

... me sugiere que un 'método de la clase' sería asumido por defecto como También puede necesitar editar su pregunta para incluir un ejemplo de datos (tal vez de la página de ayuda rpart) si desea más información

+0

Estoy pasando un objeto trainControl, y no creo que haga lo que sugieres. En cuanto a "entrenar" la documentación, describe las elipsis: "... \t argumentos pasados ​​a la rutina de clasificación o regresión" mientras que la documentación de? TrainControl no menciona los argumentos de paso ... – Diego

Cuestiones relacionadas