modificar lm o función loess a utilizarlo dentro de geom_smooth ggplot2
Pregunta
tengo que modificar el lm
(o eventualmente loess
) la función para que pueda utilizarlo en geom_smooth
de ggplot2 (o stat_smooth
).
Por ejemplo, esto es cómo se utiliza normalmente stat_smooth
:
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`
Me gustaría definir una función lm2
personalizada para utilizar como valor para el parámetro method
en stat_smooth
, para que pueda personalizar su comportamiento.
> lm2 <- function(formula, data, ...)
{
print(head(data))
return(lm(formula, data, ...))
}
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')
Tenga en cuenta que he utilizado como parámetro en method='lm2'
stat_smooth
.
Cuando ejecuto el código de un sale el error:
Error en eval (expr, envir, enclos): '' nthcdr necesita una lista de CDR abajo
Lo que no entiendo muy bien. El método lm2
funciona muy bien cuando se ejecuta fuera del stat_smooth
. He jugado con esto un poco y tengo diferentes tipos de error, pero ya que no estoy cómodo con herramientas de depuración de R es difícil para mí a depurarlos. Sinceramente, no entiendo lo que debería poner dentro de la llamada return()
.
Solución
Hay una cierta rareza en el uso ... como un argumento en una llamada a una función que no entiendo totalmente (que tiene algo que ver con ... siendo un objeto de tipo lista).
Aquí está una versión que funciona mediante la adopción de la llamada de función como un objeto, el establecimiento de la función de ser llamado a lm y luego evaluar la llamada en el contexto de nuestra propia persona que llama. El resultado de esta evaluación es nuestro valor de retorno (en I el valor de la última expresión de una función es el valor devuelto, por lo que no necesitamos un return
explícita).
foo <- function(formula,data,...){
print(head(data))
x<-match.call()
x[[1]]<-quote(lm)
eval.parent(x)
}
Si desea agregar argumentos para la llamada LM, puede hacerlo de esta manera:
x$na.action <- 'na.exclude'
Si desea colocar argumentos a foo antes de llamar lm, puede hacerlo de esta manera
x$useless <- NULL
Por cierto, geom_smooth
y stat_smooth
pasar argumentos adicionales a la función de suavizado, por lo que no es necesario crear una función de su propia si sólo se necesita establecer algunos argumentos adicionales
qplot(data=diamonds, carat, price, facets=~clarity) +
stat_smooth(method="loess",span=0.5)