使用ggplot绘制带置信区间的时间序列图

8
如果我有一个数据表,其中每个时间戳都有多个观察值的时间序列,是否有直接的方法来绘制该数据集的平均值和区间范围?
例如,创建以下数据集:
dt <- lapply(seq(1,10),function(x) {
  dt <- data.table(Time = seq(1,100),
                   Value = seq(1,100)* 3 + rnorm(100,5,20))
})

dt <- rbindlist(dt,idcol = 'Run') 

ggplot(dt,aes(Time,Value,group = Run)) +
  geom_line(size = 0.1,alpha = 0.5)

每个时间戳都有多个观测值。我想要的图表应该类似于这样:
ggplot(dt[,list(Value = mean(Value),
                MaxValue = quantile(Value, 0.9),
                MinValue = quantile(Value, 0.1)),
          list(Time)])+
  aes(x = Time, y = Value,ymin = MinValue,ymax = MaxValue)+
  geom_line()+
  geom_ribbon(alpha = 0.3)

这个方法是可行的,但看起来似乎对于应该更简单的事情而言,有点复杂。例如,如果我要生成盒须图,只需使用更简单的ggplot调用即可:

ggplot(dt)+
  aes(x = factor(Time), y = Value)+
  geom_boxplot()

感谢您的帮助!
1个回答

13

我们可以使用 stat_summary 如下方式。

ggplot(dt,aes(Time, Value)) +
  stat_summary(geom = "line", fun.y = mean) +
  stat_summary(geom = "ribbon", fun.data = mean_cl_normal, alpha = 0.3)

输入图像描述

如果您仍然想要以90和10百分位数为界的平均值,则需要设计一个函数返回您的数值数据的yyminymax

mean_cl_quantile <- function(x, q = c(0.1, 0.9), na.rm = TRUE){
  dat <- data.frame(y = mean(x, na.rm = na.rm),
                    ymin = quantile(x, probs = q[1], na.rm = na.rm),
                    ymax = quantile(x, probs = q[2], na.rm = na.rm))
  return(dat)
}

ggplot(dt,aes(Time, Value)) +
  stat_summary(geom = "line", fun.y = mean) +
  stat_summary(geom = "ribbon", fun.data = mean_cl_quantile, alpha = 0.3)

输入图像描述

或者如alistaire的评论所述:

ggplot(dt, aes(Time, Value)) + 
  geom_smooth(stat = 'summary', fun.data = mean_cl_quantile)

在此输入图片描述


如果您使用 geom = "smooth",则可以在一次调用中完成。 - alistaire
@alistaire 谢谢。但是 geom_smooth 的方法是 lmglmloess,带有标准误差。这可能不是 OP 想要的。 - www
4
不要使用geom_smooth,而是结合stat_summary使用,例如 ggplot(dt, aes(Time, Value)) + geom_smooth(stat = 'summary', fun.data = function(y) data.frame(ymin = quantile(y, .1), y = mean(y), ymax = quantile(y, .9)))geom_smooth仅仅是条带和线条的组合;stat_smooth才是调用模型的函数。 - alistaire
@alistaire 谢谢分享。很高兴知道 geom_smooth 的这种用法。我已根据您的评论更新了我的答案。 - www

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接