这个问题看起来很简单,但我无法弄清楚如何去做.我试图通过纵向数据集拟合平滑线,如下面的代码所示
library(nlme)
xyplot(conc ~ Time, data = Theoph, groups = Subject, type = c("l", "smooth"))
Run Code Online (Sandbox Code Playgroud)
输出不是我所追求的,并且有多个警告.我想顺利完成整个数据.作为奖励,如果有人也可以使用ggplot显示如何做到这一点,那将是很棒的.
您可以使用该latticeExtra包为您的第一个网格对象添加平滑器
library(nlme)
library(ggplot2)
library(lattice)
library(latticeExtra)
xyplot(conc ~ Time, data = Theoph, groups = Subject, type = "l") +
layer(panel.smoother(..., col = "steelblue"))
Run Code Online (Sandbox Code Playgroud)
这是ggplot2同一张图的版本
ggplot(data = Theoph, aes(Time, conc)) +
geom_line(aes(colour = Subject)) +
geom_smooth(col = "steelblue")
Run Code Online (Sandbox Code Playgroud)
将单个主题绘制为单独的线和点,但绘制整体平滑使用的两个格子方法或最后的经典图形和动物园方法.另请注意,我们需要订购时间点以产生整体平滑,并且不使用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()
Run Code Online (Sandbox Code Playgroud)
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)
})
Run Code Online (Sandbox Code Playgroud)
这些中的任何一个都给出以下输出.请注意,整体光滑是粗红线.
(继图表后)
3)zoo/classic graphics 这是一个使用zoo包和经典图形的解决方案.
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")
Run Code Online (Sandbox Code Playgroud)