измените функцию lm или loess, чтобы использовать ее в geom_smooth ggplot2.

Мне нужно изменить функцию lm (или, в конечном итоге, loess), чтобы я мог использовать ее в geom_smooth (или stat_smooth) ggplot2.

Например, вот как обычно используется stat_smooth:

> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm')`

Я хотел бы определить пользовательскую функцию lm2 для использования в качестве значения параметра method в stat_smooth, чтобы я мог настроить ее поведение.

> lm2 <- function(formula, data, ...)
  {
      print(head(data))
      return(lm(formula, data, ...))
  }
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')

Обратите внимание, что я использовал method='lm2' в качестве параметра в stat_smooth. Когда я выполняю этот код, получаю ошибку:

Ошибка в eval(expr, envir, enclos): 'nthcdr' нужен список для CDR вниз

Что я не очень хорошо понимаю. Метод lm2 очень хорошо работает вне stat_smooth. Я немного поиграл с этим, и у меня были разные типы ошибок, но, поскольку мне не нравятся инструменты отладки R, мне трудно их отлаживать. Честно говоря, я не понимаю, что я должен вставить в вызов return().


person dalloliogm    schedule 03.03.2010    source источник


Ответы (1)


Есть некоторая странность в использовании ... в качестве аргумента в вызове функции, которую я не совсем понимаю (это как-то связано с тем, что ... является объектом типа списка).

Вот версия, которая работает, принимая вызов функции как объект, устанавливая вызываемую функцию в lm и затем оценивая вызов в контексте нашего собственного вызывающего объекта. Результатом этой оценки является наше возвращаемое значение (в R возвращаемым значением является значение последнего выражения в функции, поэтому нам не нужен явный return).

foo <- function(formula,data,...){
   print(head(data))
   x<-match.call()
   x[[1]]<-quote(lm)
   eval.parent(x)
}

Если вы хотите добавить аргументы к вызову lm, вы можете сделать это следующим образом:

x$na.action <- 'na.exclude'

Если вы хотите передать аргументы foo до вызова lm, вы можете сделать это так:

x$useless <- NULL

Кстати, geom_smooth и stat_smooth передают любые дополнительные аргументы функции сглаживания, поэтому вам не нужно создавать собственную функцию, если вам нужно только установить дополнительные аргументы.

qplot(data=diamonds, carat, price, facets=~clarity) + 
  stat_smooth(method="loess",span=0.5)
person Jyotirmoy Bhattacharya    schedule 04.03.2010
comment
Спасибо!! хороший ответ, моя проблема заключалась в том, что я не знал, что должен вызвать match.call и как его использовать. Что я действительно хотел сделать, так это пропустить оценку lm для наборов данных со слишком небольшим количеством точек (это может произойти, когда вы делаете фасеты, см. groups.google.com/group/ggplot2/browse_thread/thread/ ), но я хотел увидеть общий случай. - person dalloliogm; 04.03.2010
comment
В конце концов, я решил свою проблему, сообщив об этом автору ggplot2 и подождав, пока он ее исправит. - person dalloliogm; 23.03.2010