首页 > 解决方案 > 绘制多个时间序列对象的平均值并说明该图中的误差

问题描述

考虑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 IDs) 的时间序列数据,它们属于 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)

在此处输入图像描述

我们如何做同样的事情,但在“平均”图后面添加每个人的原始图以说明与每个“平均”相关的误差?请注意,我创建“平均图”的方式是使用ID每个组中时间序列最短的会比其他人长)

标签: rggplot2dplyrtime-seriesfacet

解决方案


也许您正在寻找这样的组合情节:

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, values, colour = group))+ 
  geom_line()+
  facet_wrap(.~group)+
  ylab('Real Values')
#Compose plots
G3 <- G2/G1+plot_layout(guides = "collect")

输出:

在此处输入图像描述


推荐阅读