这个问题看似简单,但我无法弄清楚如何去做。我试图通过纵向数据集拟合平滑线,如下面的代码所示
library(nlme)
xyplot(conc ~ Time, data = Theoph, groups = Subject, type = c("l", "smooth"))
输出不是我想要的,并且有多个警告。我想顺利完成整个数据。作为奖励,如果有人也可以使用ggplot显示如何做到这一点,那将是很棒的。
答案 0 :(得分:5)
将单个主题绘制为单独的线条和点,但绘制总体平滑使用的两种格子方法或最后的经典图形和动物园方法。另请注意,我们需要订购时间点以产生整体平滑,并且不使用nlme包。另请注意,问题中的代码没有给出任何错误 - 仅警告。
1)trellis.focus / trellis.unfocus 我们可以使用trellis.focus / trellis.unfocus来增加整体流畅度:
library(lattice)
xyplot(conc ~ Time, groups = Subject, data = Theoph, type = "o")
trellis.focus("panel", 1, 1)
o <- order(Theoph$Time)
panel.xyplot(Theoph[o, "Time"], Theoph[o, "conc"], type = "smooth", col = "red", lwd = 3)
trellis.unfocus()
2)面板功能第二种方法是定义合适的面板功能:
library(lattice)
o <- order(Theoph$Time)
xyplot(conc ~ Time, groups = Subject, data = Theoph[o, ], panel =
function(x, y, ..., subscripts, groups) {
for (lev in levels(groups)) {
ok <- groups == lev
panel.xyplot(x[ok], y[ok], type = "o", col = lev)
}
panel.xyplot(x, y, type = "smooth", col = "red", lwd = 3)
})
其中任何一个都给出以下输出。请注意,整体光滑是粗红线。
(图表后继续)
3)动物园/经典图形以下是使用动物园包和经典图形的解决方案。
library(zoo)
Theoph.z <- read.zoo(Theoph[c("Subject", "Time", "conc")],
index = "Time", split = "Subject")
plot(na.approx(Theoph.z), screen = 1, col = 1:nlevels(Theoph$Subject))
o <- order(Theoph$Time)
lo <- loess(conc ~ Time, Theoph[o, ])
lines(fitted(lo) ~ Time, Theoph[o,], lwd = 3, col = "red")
答案 1 :(得分:4)
您可以使用latticeExtra
包为第一个treillis对象添加更平滑的
library(nlme)
library(ggplot2)
library(lattice)
library(latticeExtra)
xyplot(conc ~ Time, data = Theoph, groups = Subject, type = "l") +
layer(panel.smoother(..., col = "steelblue"))
以下是同一图表的ggplot2
版本
ggplot(data = Theoph, aes(Time, conc)) +
geom_line(aes(colour = Subject)) +
geom_smooth(col = "steelblue")