将自定义 LOESS 面板添加到 R 中的格子图
Adding a custom LOESS panel to lattice plot in R
我正在尝试为我的绘图创建自定义 LOESS 面板函数。基本上它应该做的与简单的 panel.loess
或 type = "smooth"
相同。原因是稍后我想让它变得更复杂一些,上面无法轻易实现的事情。然而,它失败了。
这是一个 MWE(其中一些松散地基于 Sarkar 的 Lattice 书第 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)
结果是这样的:
显然,这是行不通的。我收到以下错误消息:Error using packet n numeric 'envir' arg not of length one
。我尝试调试它(例如使用 print(yy)
)也没有效果,所以我不知道从哪里开始寻找解决方案。
对造成这种情况的原因有什么想法吗?
经过一些(小的)修改,我使用了这个脚本
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)
})
我已经更改了点数,因为有一些警告信息。它有效吗?这就是您所期待的吗?
我正在尝试为我的绘图创建自定义 LOESS 面板函数。基本上它应该做的与简单的 panel.loess
或 type = "smooth"
相同。原因是稍后我想让它变得更复杂一些,上面无法轻易实现的事情。然而,它失败了。
这是一个 MWE(其中一些松散地基于 Sarkar 的 Lattice 书第 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)
结果是这样的:
显然,这是行不通的。我收到以下错误消息:Error using packet n numeric 'envir' arg not of length one
。我尝试调试它(例如使用 print(yy)
)也没有效果,所以我不知道从哪里开始寻找解决方案。
对造成这种情况的原因有什么想法吗?
经过一些(小的)修改,我使用了这个脚本
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)
})
我已经更改了点数,因为有一些警告信息。它有效吗?这就是您所期待的吗?