我确定以前有人问过这个问题,但我找不到有效的解决方案:
我有一个数据框,包含两组,每组 5 个样本,其中每个样本有十个观察值,在时间上等距分布。我想将此数据集绘制为一个时间序列,其中两条线连接每个时间点每个组的平均值。在每个时间点,我都希望有一些可变性度量(例如 95% 置信区间)。
例如数据集是:
group_a <- data.frame(runif(50, min=80, max=100), 1:10, rep("a", 10), c(rep("i", 10), rep("ii", 10), rep("iii", 10), rep("iv", 10), rep("v", 10)))
names(group_a) <- c("yvar", "xvar", "group", "sample")
group_b <- data.frame(runif(50, min=60, max=80), 1:10, rep("b", 10), c(rep("vi", 10), rep("vii", 10), rep("viii", 10), rep("ix", 10), rep("x", 10)))
names(group_b) <- c("yvar", "xvar", "group", "sample")
sample_data <- rbind(group_a, group_b)
所以每个时间点(xvar)有10个案例(sample)的观察值(yvar),平均分成两组(group)。最接近我正在寻找的答案的是以下内容:
require(ggplot2)
p <- ggplot(sample_data, aes(x = xvar, y = yvar)) + geom_line(aes(color = group, linetype = group))
print(p)
产生类似的东西:
所以这条线是按组划分的,但在每个时间点它都垂直跟随每个个案,而不是平均。
我正在寻找的东西更像是另一个答案中建议的东西:Plot time series with ggplot with confidence interval ,但图表上有多条线,不一定是连续的带状图。
有人有什么建议吗?我知道这应该非常简单,但我对 R 和 ggplot 比较陌生,显然找不到正确的搜索词(或者遗漏了一些非常明显的东西)。非常感谢任何帮助!
最佳答案
这里有两种变体。我建议预先计算您的摘要统计数据并将其输入 ggplot。
sample_sum <- sample_data %>%
group_by(xvar, group) %>%
summarize(mean = mean(yvar),
sd = sd(yvar),
mean_p2sd = mean + 2 * sd,
mean_m2sd = mean - 2 * sd) %>%
ungroup()
第一种方法将平均值、平均值负 2 标准差和平均值加 2 标准差收集到同一列中,“stat”标记它是哪个统计数据,yvar 存储该值。 (我选择它们是因为 +/- 2 SD 捕获了约 95% 的正态分布。)然后我们可以在对 geom_line 的一次调用中将它们绘制在一起。
p <- ggplot(sample_sum %>%
gather(stat, yvar, mean, mean_p2sd:mean_m2sd),
aes(x = xvar, y = yvar)) +
geom_line(aes(color = group, linetype = stat))
p
或者,我们可以将它们分开并使用 geom_ribbon 绘制 +/- 2 SD 区域。
p <- ggplot(sample_sum, aes(x = xvar, color = group, fill = group)) +
geom_ribbon(aes(ymin = mean_m2sd, ymax = mean_p2sd), alpha = 0.1) +
geom_line(aes(y= mean))
p
关于r - 在 ggplot2 中跨时间绘制多个组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53180486/