绘制多个时间序列对象的平均值并说明该图中的误差

问题描述

请考虑在此处创建dat

set.seed(123)
ID = factor(letters[seq(6)])
time = c(100,102,120,105,109,130)
dat <- data.frame(ID = rep(ID,time),Time = sequence(time))
dat$group <- rep(c("GroupA","GroupB"),c(322,344))
dat$values <- sample(100,nrow(dat),TRUE)

dat包含6个个体(6个ID)的时间序列数据,这些数据属于2个组(GroupAGroupB)。假设我们期望每个组中的时间序列具有相似的属性。另请注意,每个人的时间序列长度不同。我们本质上是想为每个组创建一个“平均”时间序列图,我已经这样做了:

library(dplyr)
library(ggplot2)
dat %>% 
  group_by(ID) %>%
  mutate(maxtime = max(Time)) %>%
  group_by(group) %>%
  mutate(maxtime = min(maxtime)) %>%
  group_by(group,Time) %>%
  summarize(values = mean(values)) %>%
  ggplot(aes(Time,values,colour = group))+ 
  geom_line()+
  facet_wrap(.~group)

enter image description here

我们如何做同样的事情,但是在“平均”图后面添加每个人的原始图,以说明与每个“平均”相关的误差?请注意,我创建“平均图”的方式是使用ID的长度,每个组的时间序列最短,但是添加原始图像时,我希望从原始图像中看到整个图如果可能的话(所以有些会比其他更长)

解决方法

也许您正在寻找这样的合成图:

library(dplyr)
library(ggplot2)
library(patchwork)
G1 <- dat %>% 
  group_by(ID) %>%
  mutate(maxtime = max(Time)) %>%
  group_by(group) %>%
  mutate(maxtime = min(maxtime)) %>%
  group_by(group,Time) %>%
  summarize(values = mean(values)) %>%
  ggplot(aes(Time,values,colour = group))+ 
  geom_line()+
  facet_wrap(.~group)+
  ylab('Mean')
G2 <- dat %>% 
  group_by(ID) %>%
  mutate(maxtime = max(Time)) %>%
  group_by(group) %>%
  mutate(maxtime = min(maxtime)) %>%
  ggplot(aes(Time,colour = group))+ 
  geom_line()+
  facet_wrap(.~group)+
  ylab('Real Values')
#Compose plots
G3 <- G2/G1+plot_layout(guides = "collect")

输出:

enter image description here

,

使用第二个geom_line,您可以在背景中绘制“原始”数据,例如灰线。

set.seed(123)
ID = factor(letters[seq(6)])
time = c(100,102,120,105,109,130)
dat <- data.frame(ID = rep(ID,time),Time = sequence(time))
dat$group <- rep(c("GroupA","GroupB"),c(322,344))
dat$values <- sample(100,nrow(dat),TRUE)

library(dplyr)
library(ggplot2)
d <- dat %>% 
  group_by(ID) %>%
  mutate(maxtime = max(Time)) %>%
  group_by(group) %>%
  mutate(maxtime = min(maxtime)) %>%
  group_by(group,Time) %>%
  summarize(values = mean(values))
#> `summarise()` regrouping output by 'group' (override with `.groups` argument)

ggplot()+ 
  geom_line(data = dat,aes(Time,group = ID),color = "grey80",alpha = .7) +
  geom_line(data = d,colour = group)) +
  facet_wrap(.~group)