多面体平滑,格子中的分组因子

时间:2013-04-17 17:53:18

标签: r lattice smoothing

我想使用lattice来创建多面板散点图,并使用分组因子在每个面板中添加平滑线,这里是一个虚拟数据帧

x <-  rep(1:10, 4)
a <-  as.factor(rep(1:4, 10))
b <-  as.factor(sort(rep(1:2, 20)))
y <- rep(NA, 80)
df <- data.frame(x, y, a, b)
df$y[df$b=="1"] <- df$x[df$b=="1"]+df$x[df$b=="1"]^0.5
df$y[df$b=="2"] <- df$x[df$b=="2"]+df$x[df$b=="2"]^1
df$y[df$b=="3"] <- df$x[df$b=="3"]+df$x[df$b=="3"]^2
for(i in 1:80) df$y[i] <- df$y[i]+rnorm(1, 0, 10) 

我试过这个:

library(lattice)    
xyplot(y ~ x|a, data = df, groups = b, type = "b", 
                      panel = function(x, y,...){ 
                      panel.smooth(x, y, ...)
                      panel.xyplot(x, y, ...)
                       })

但似乎没有用,我看不出原因,肯定是我缺少的东西。 但是,我还有另外一个问题,就是我需要更改一些平滑参数(span和degree)。我找到了一种方法,通过Chi in Cross Validated在线进行(引用其他用户以这种方式工作是否正确?),即:

my.panel.loess <- function(x, y, span = 2/3, degree = 0.5, ...) {
  loess.fit <- loess.smooth(x, y, span = span, dgree = degree )
  panel.lines(loess.fit$x, loess.fit$y, ...)
  panel.xyplot(x, y, ...)}

xyplot(y ~ x|a, data = df, groups = b, type = "b", 
                  panel=function(...) 
                    panel.superpose(panel.groups=my.panel.loess, ...))

但是我不能让它为黄土平滑器绘制一条线并指向原始数据点。我试图在自定义函数中添加参数类型,但格不喜欢多参数。有什么建议吗?

2 个答案:

答案 0 :(得分:5)

或者没有latticeExtra,只需:

xyplot(y~ x|a, data = df, groups = b, type = c("p", "smooth"))

答案 1 :(得分:3)

我经常在像你这样的设置中找到 latticeExtra (及其layer()as.layer()和重载+运算符)的大帮助:

library(latticeExtra)
my.panel.loess <- function(x, y, span = 2/3, degree = 0.5, ...) {
    loess.fit <- loess.smooth(x, y, span = span, dgree = degree )
    panel.lines(loess.fit$x, loess.fit$y, ...)
}

## A plot with the smoothing lines
a <- xyplot(y ~ x|a, data = df, groups = b, type="l",
            panel=function(...) panel.superpose(panel.groups=my.panel.loess,...))
## A plot with the points
b <- xyplot(y ~ x|a, data=df, groups=b)

## Both together
plot(a+b)

enter image description here