在 R 中用误差线绘制 bin 平均值 编辑:显示分箱数据的回归

问题描述

我有一个包含“DateTime”、“T_ET”和“LAI”三列的数据框。我想将 T_ET(在 y 轴上)与 LAI(在 x 轴上)以及 T_ET 的 0.1-bin LAI 平均值绘制在同一个图上,如下所示(Wei 等人,2017 年):

enter image description here

在上图中,y 轴为 T_ET 或 T/(E+T),x 轴为 LAI,带误差条的红色空心菱形为黑点和标准偏差的 0.1-bin LAI 平均值,实线为 单个数据点的回归(从 bin 平均值估计),n 是可用数据点。虚线是 95% 的置信区间。

我怎样才能得到与上图相似的图?请使用以下链接查找示例数据:file

或使用以下示例数据:

df <- structure(list(DateTime = structure(c(1478088000,1478347200,1478692800,1478779200,1478865600,1478952000,1479124800,1479211200,1479297600,1479470400),class = c("POSIXct","POSIXt"),tzone = "GMT"),T_ET = c(0.996408350852751,0.904748351479432,0.28771236118773,0.364402232484906,0.452348409759872,0.415408041501318,0.629291202120187,0.812083112145703,0.992414777441755,0.818032913071265),LAI = c(1.3434,1.4669,1.6316,1.6727,1.8476,2.0225,2.3723,2.5472,2.7221,3.0719)),row.names = c(NA,10L),class = "data.frame")

解决方法

您可以在通过 stat_summary_bin() 绘图时直接执行此操作。默认情况下,与此关联的 geom 将是 pointrange geom 并使用 mean_se()bins= 控制 bin 的数量,但您也可以提供 binwidth=。请注意,使用 pointrange geom,fatten 控制中心点的大小:

ggplot(df,aes(LAI,T_ET)) + geom_point() + theme_classic() +
  stat_summary_bin(bins=3,color='red',shape=5,fatten=5)

enter image description here

您的示例数据有点少,所以这里是通过 diamonds 数据集的另一个示例。在这里,我通过组合 errorbar 和 poing geom 构建与您展示的示例图相同的外观。请注意apparently setting the width of the errorbar doesn't work correctly with stat_summary_bin()

ggplot(diamonds,aes(carat,price)) + geom_point(size=0.3) +
  stat_summary_bin(geom='errorbar',bins=12,width=0.001) +
  stat_summary_bin(geom='point',size=3,bins=12) +
  theme_classic()

enter image description here

编辑:显示分箱数据的回归

如评论中所述,根据分箱数据而不是原始数据绘制回归线是可能的,但不能通过 stat_summary_bin() 函数,除非您可以使用 { {1}}。如果您正在寻找线性回归,则需要将 loess 之外的数据分箱,然后在分箱数据上绘制回归图。

这可能是有意为之。绘制基于汇总数据的回归线(汇总数据的一种方式)本质上不是一个好主意。无论如何,这是通过 ggplot 数据集执行此操作的一种方法。我们可以使用 diamonds 函数切割成单独的 bin,然后汇总这些 bin 值的数据。由于 cut() 函数标记输出的方式,我们必须创建自己的标签。由于我们在此示例中切成 12 个相等的部分,因此我在 x 轴上创建了 12 个均匀间隔的位置,以便我们的数据值位于其中 - 这在您的情况下可能有所不同,请注意根据什么标记数据代表什么,什么最具有统计意义。

cut()

enter image description here

请注意,上面的回归线对所有分箱值进行平均加权。这通常不是一个好主意,除非您的数据在数据集中均匀分布。 如果您要绘制回归线,我仍然建议您将其与原始数据相关联,这更能代表您数据中的真实情况。看起来像这样:

df <- diamonds

# setting interval labeling
bin_width <- diff(range(df$carat)/12)
bin_labels <- c((range(df$carat)[1] + (bin_width/2))+(0:11*bin_width))

# cutting the data
df$bins <- cut(df$carat,breaks=12,labels=bin_labels)
df$bins <- as.numeric(levels(df$bins)[df$bins])    # convert factor to numeric

ggplot(diamonds,bins=12) +
  geom_smooth(data=df,aes(x=bins),method='lm',color='blue') +
  theme_classic()

enter image description here

归根结底,为分箱数据绘制回归线是汇总汇总数据,而不是汇总原始数据。这是统计数据,所以使用风险自负。但如果你只是出于某种奇怪的原因必须……我不能阻止你。 ;)