将自定义LOESS面板添加到R中的晶格图

时间:2015-03-12 11:01:04

标签: r panel lattice loess

我正在尝试为我的情节创建自定义LOESS面板功能。基本上它应该做的与简单的panel.loesstype = "smooth"相同。原因是后来我想用上面的东西不能轻易实现的东西变得复杂一些。然而,它失败了。

这是一个MWE(其中一些松散地基于Sarkar的莱迪思书籍第235页的例子:

library(lattice)

set.seed(9)
foo <- rexp(100)
bar <- rexp(100)
thing <- factor(rep(c("this", "that"), times = 50))
d.f <- data.frame(foo = foo, bar = bar, thing = thing)

loess.c <- function(x) { 
  mod <- loess(foo ~ bar, data = x)
  return(mod)
}

panel.cloess <- function(x, n = 50, ...){ 
  panel.xyplot(x, ...)
  lfit  <- loess.c(x)
  xx <- do.breaks(range(x$x), n)
  yy <- predict(lfit, newdata = data.frame(bar = xx),
                se = TRUE)
  print(yy) # doesn't do anything
  panel.lines(x = xx, y = yy$fit, ...)
}

xyplot(foo ~ bar | thing, data = d.f,
       panel = panel.cloess)

结果如下:

R output

显然,这不起作用。我收到以下错误消息:Error using packet n numeric 'envir' arg not of length one。我尝试调试它(例如使用print(yy))也没有用,所以我不知道从哪里开始寻找解决方案。

关于导致这种情况的任何想法?

1 个答案:

答案 0 :(得分:1)

经过一些(小)修改后,我使用了这个脚本

xyplot(foo ~ bar | thing, data = d.f, panel =  function(x,y){
    xx <- do.breaks(range(x), 49)
    mod <- loess(y~x)
    yy <- predict(mod, newdata = data.frame(foo=xx))
    panel.xyplot(x,y)
    panel.lines(x=xx, y= yy)
})

我已经更改了点数,因为有一些警告信息。它是否有效并且是您期望的那样?