《ggplot2:数据分析与图形艺术》

第5章 工具箱

5.8 揭示不确定性

数据中存在不确定性的信息,有四类几何对象可揭示数据中不确定性的信息。
具体使用哪个取决于x的值是离散型还是连续型的,以及我们是否要展示区间内的中间值,或是仅仅展示区间,见下表。

变量X类型 仅展示区间 同时展示区间和中间值
连续型 geom_ribbon geom_smooth(stat=“identity”)
离散型 geom_errorbar geom_crossbar
geom_linerange geom_pointrange

关于标准误的计算方法很多,所以下例拟合了一个双因素含交互效应回归模型,并且展示了如何提取边际效应(marginal effects)和条件效应(conditional effects),以及如何将其可视化。
> library(ggplot2)
> d <- subset(diamonds, carat < 2.5 & rbinom(nrow(diamonds), 1, 0.2) == 1)#满足carat < 2.5随机数==1
#rbinom(n, size, prob)#表示你的size是试验次数,n是所需满足该分布的随机数的个数,比如你要生成100个服从B(10,0.5)分布的随机数,命令就应该是 rbinom(100,10,0.5)
> d$lcarat <- log10(d$carat)
> d$lprice <- log10(d$price)
#在d这个数据框中添加两列数据分别是carat列和price列的log10的数值
> #剔除整体的线性趋势
> detrend <- lm(lprice ~ lcarat, data=d)
> detrend
Call:
lm(formula = lprice ~ lcarat, data = d)
Coefficients:
(Intercept) lcarat
3.671 1.683
> d$lprice2 <- resid(detrend)#resid计算回归方程残差
> mod <- lm(lprice2 ~ lcarat * color, data=d)
> install.packages('effects')
> install.packages('carData')
> library(effects)
> effectdf <- function(...) { suppressWarnings(as.data.frame(effect(...)))}
> color <- effectdf("color", mod)
> both1 <- effectdf("lcarat:color", mod)
> carat <- effectdf("lcarat", mod, default.levels = 50)
> both2 <- effectdf("lcarat:color", mod, default.levels = 3)
> qplot(lcarat, lprice, data=d, colour=color)
R:ggplot2(11),第5章 工具箱(3)
> qplot(lcarat, lprice2, data=d, colour=color)
R:ggplot2(11),第5章 工具箱(3)
#上两张图表示进行数据变换以移除显而易见的效应。第一张图中x轴和y轴的数据均取以10为底的对数以剔除非线性性。第二张图剔除了主要的线性趋势。

> fplot <- ggplot(mapping = aes(y=fit, ymin=lower, ymax=upper)) + ylim(range(both2$lower, both2$upper))

> fplot %+% color + aes(x=color) + geom_point() + geom_errorbar()
R:ggplot2(11),第5章 工具箱(3)
> fplot %+% both2 + aes(x=color, colour=lcarat, group=interaction(color, lcarat)) + geom_errorbar() + geom_line(aes(group=lcarat)) + scale_colour_gradient()
R:ggplot2(11),第5章 工具箱(3)
#上两张图展示模型估计结果中变量color的不确定性。第一张图为color的边际效应。第二张图则是针对变量carat的不同水平(level),变量color的条件效应。误差棒显示了95%的逐点置信区间。

> fplot %+% carat + aes(x=lcarat) + geom_smooth(stat="identity")
R:ggplot2(11),第5章 工具箱(3)
> ends <- subset(both1, lcarat==max(lcarat))

> fplot %+% both1 + aes(x=lcarat, colour=color) + geom_smooth(stat="identity") + scale_colour_hue() + theme(legend.position="none") + geom_text(aes(label=color, x=lcarat+0.02), ends)
R:ggplot2(11),第5章 工具箱(3)
#展示模型估计结果中变量carat的不确定行。第一张图为carat的边际效应。第二张图则是针对变量color的不同水平,变量carat的条件效应。误差带显示了95%的逐点置信区间。

5.9 统计摘要

使用stat_summary()计算统计摘要,该函数既可以为每一个参数单独地指定摘要计算函数,也可以用一个统一地函数对它们进行组合。

5.9.1 单独的摘要计算函数

参数fun.y,fun.ymin,fun.ymax能够接受简单的数值型摘要计算函数,即该函数能够传入一个数值向量并返回一个数值型结果,如:mean(),median(),min(),max()。
> d <- ggplot(mtcars, aes(cyl, mpg)) + geom_point()
> d + stat_summary(fun.y = "median", colour = "red", size = 2, geom = "point")#红点表示计算每组y轴的中位数,其他点用黑色表示,中位数用红点表示。如果想绘制均值则可用fun.y = "mean"
R:ggplot2(11),第5章 工具箱(3)
> ggplot(mtcars, aes(cyl, mpg)) + geom_point() + aes(colour = factor(vs)) + stat_summary(fun.y = mean, geom="line")#通过factor(vs)对mtcars中对数据的vs列进行分组,并计算各族的均值,然后用geom="line"线进行连接。
R:ggplot2(11),第5章 工具箱(3)
ggplot(mtcars, aes(cyl, mpg)) + geom_point() + stat_summary(fun.y = mean, fun.ymin = min, fun.ymax = max, colour = "red")#fun.ymin = min和fun.ymax = max表示在进行绘图时将y轴的最大值和最小值进行连线。
R:ggplot2(11),第5章 工具箱(3)
如果只写fun.ymin = min则会报错
> ggplot(mtcars, aes(cyl, mpg)) + geom_point() + stat_summary(fun.y = "mean", fun.ymin = min, colour = "red")
Warning message:
Removed 3 rows containing missing values
(geom_pointrange).

同样stat_sumamry()函数也可以改变数据集
d <- ggplot(diamonds, aes(cut))
d + geom_bar()
绘制的是diamonds数据集中的cut列的条形图
d + stat_summary_bin(aes(y = price), fun.y = "mean", geom = "bar")#这样会改变数据集,只绘制price数据的mean值的条形图。
R:ggplot2(11),第5章 工具箱(3)
依照同样的原理,我们也可以只绘制平均值的结果
> ggplot(mtcars, aes(cyl, mpg)) + stat_summary(fun.y = "mean", geom = "point")

5.9.2 统一的摘要计算函数

fun.data可以支持更复杂的摘要计算函数,在下表中罗列了来自Hmisc包中的函数。当然我们也可以使用自己编写的摘要计算函数;此函数应返回一个各元素有名称的向量作为输出,参考:https://ggplot2.tidyverse.org/reference/stat_summary.html
表5.3 来自Hmisc包中的摘要计算函数,这些函数拥有专门的封装,以使它们能够与stat_sumamry()更轻松地共同使用。

函数名 Hmisc包中原名 中间值类型 所计算区间
mean_cl_normal() smean.cl.boot() 均值 正态渐进所得标准误
mean_cl_boot() smean.cl.boot() 均值 Bootstrap所得标准误
mean_sdl() smean.scl() 均值 标准差的倍数
median_hilow() smean.hilow() 中位数 尾部面积相同的外分位点对

相关文章: