修改lm或loess函数以在ggplot2的geom_smooth中使用

11

我需要修改lm(或最终是loess)函数,以便我可以在ggplot2的geom_smooth(或stat_smooth)中使用它。

例如,这是正常使用stat_smooth的方式:

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

我希望定义一个自定义的lm2函数,用作stat_smooth中的method参数的值,以便我可以自定义它的行为。

> lm2 <- function(formula, data, ...)
  {
      print(head(data))
      return(lm(formula, data, ...))
  }
> qplot(data=diamonds, carat, price, facets=~clarity) + stat_smooth(method='lm2')
请注意,我在stat_smooth中使用了参数method='lm2'。当我执行此代码时,会出现以下错误信息:

Error in eval(expr, envir, enclos) : 'nthcdr' needs a list to CDR down

我不是很理解这个错误信息。在stat_smooth之外运行lm2方法效果非常好。我尝试了一些修改但得到了不同类型的错误,但由于我不熟悉R的调试工具,所以很难进行调试。老实说,我不知道应该在return()中放什么内容。
1个回答

6

在函数调用中使用...作为参数会有一些奇怪的问题,我并不完全理解(这似乎与...是列表类型对象有关)。

以下是一个可行的版本,它将函数调用作为对象,将要调用的函数设置为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'

如果您想在调用 lm 之前删除 foo 的参数,可以像这样操作。
x$useless <- NULL

顺便提一下,geom_smoothstat_smooth会将任何额外的参数传递给平滑函数,因此如果您只需要设置一些额外的参数,就不需要创建自己的函数。

qplot(data=diamonds, carat, price, facets=~clarity) + 
  stat_smooth(method="loess",span=0.5)

谢谢!回答得很好,我的问题是我不知道我需要调用match.call以及如何使用它。我真正想做的是跳过对数据点太少的数据集进行lm评估(当您进行面板时可能会发生这种情况,请参见http://groups.google.com/group/ggplot2/browse_thread/thread/df6da9d72f0a1dbf#),但我想看到一个一般情况。 - dalloliogm
最终,我通过向ggplot2的作者报告问题并等待他修复它来解决了我的问题。 - dalloliogm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接