R语言 在ggplot中绘制多变量时间序列沿着均值和置信区间

kmpatx3s  于 2023-09-27  发布在  其他
关注(0)|答案(1)|浏览(113)

我有一个(非常)多变量的时间序列,比如在不同时间点的25个观察结果,至少有15个不同的变量。我想绘制关于时间的所有观察结果,并绘制每个时间点的均值线和置信区间(其中均值和标准差是每个时间点不同变量的均值和标准差)。
我发现我可以分别完成这些任务:

nr <- 25
nc <- 15

dat <- data.frame(matrix(data=rnorm(nr*nc), nrow=nr, ncol = nc))
year <- seq(2000, 2000+3*(nr-1), by = 3)
dat$year <- year
dat_long <- melt(data=dat, id.vars = "year")

ggplot(dat_long, aes(x=year, y = value, col = variable))

sd <- sqrt(unname(apply(dat, 1, var)))
mean <- unname(apply(dat, 1, mean))
upper <- mean + 2*sd
lower <- mean - 2*sd

eb <- aes(ymin=lower, ymax=upper)
ggplot(dat, aes(x=year, y=mean)) + geom_line() + geom_ribbon(eb, alpha=0.5)

但是如果我加上col=variable来尝试得到每个变量的单独行,我就不再得到置信区间了。我可以尝试什么呢?

mwyxok5s

mwyxok5s1#

用年份和计算的统计数据创建另一个data.frame,并在data参数中将其传递给geom_ribbon
请注意,您还计算了year的标准误差和平均值,但在下面的代码中没有。而apply/meanrowMeans取代。

library(ggplot2)

set.seed(2023)
nr <- 25
nc <- 15

dat <- data.frame(matrix(data=rnorm(nr*nc), nrow=nr, ncol = nc))
year <- seq(2000, 2000+3*(nr-1), by = 3)
dat$year <- year
dat_long <- reshape2::melt(data=dat, id.vars = "year")

sd <- apply(dat[-(nc + 1)], 1, sd)
mean <- rowMeans(dat[-(nc + 1)])
upper <- mean + 2*sd
lower <- mean - 2*sd
dat_stats <- data.frame(year, mean, lower, upper)

ggplot(dat_long, aes(x=year, y = value, color = variable)) +
  geom_line() + 
  geom_ribbon(
    data = dat_stats,
    aes(x = year, ymin = lower, ymax = upper),
    alpha = 0.25,
    inherit.aes = FALSE
  ) +
  theme_bw()

创建于2023-09-14带有reprex v2.0.2

相关问题