数缺形时少直观。GGally包中的ggduo函数可以让你在多元统计分析中对分组数据进行可视化展示。这在典型相关分析和回归分析中进行图形展示十分有用。
ggduo()
函数来自于 ggplot2
的扩展版本包 GGally
,对于多元统计分析下的两组数据变量绘制统计图矩阵有着独特的效果。 ggduo()
的基本用法如下:
ggduo(data, mapping = NULL, columnsX = 1:ncol(data),
columnsY = 1:ncol(data), title = NULL, types = list(continuous =
"smooth_loess", comboVertical = "box_no_facet", comboHorizontal = "facethist",
discrete = "ratio"), axisLabels = c("show", "none"),
columnLabelsX = colnames(data[columnsX]),
columnLabelsY = colnames(data[columnsY]), labeller = "label_value",
switch = NULL, xlab = NULL, ylab = NULL, showStrips = NULL,
legend = NULL, cardinality_threshold = 15, legends = stop("deprecated"))
先看 ggduo()
在典型相关分析中的应用。本文使用的数据例子来自于R中内置的 psychademic
数据集,该数据集包括600名大一新生的心理测试和学科能力等8个变量的数据。
data(psychademic)
str(psychademic)
数据细节如下:
'data.frame': 600 obs. of 8 variables:
$ locus_of_control: num -0.84 -0.38 0.89 0.71 -0.64 1.11 0.06 -0.91 0.45 0 ...
$ self_concept : num -0.24 -0.47 0.59 0.28 0.03 0.9 0.03 -0.59 0.03 0.03 ...
$ motivation : chr "4" "3" "3" "3" ...
$ read : num 54.8 62.7 60.6 62.7 41.6 62.7 41.6 44.2 62.7 62.7 ...
$ write : num 64.5 43.7 56.7 56.7 46.3 64.5 39.1 39.1 51.5 64.5 ...
$ math : num 44.5 44.7 70.5 54.7 38.4 61.4 56.3 46.3 54.4 38.3 ...
$ science : num 52.6 52.6 58 58 36.3 58 45 36.3 49.8 55.8 ...
$ sex : chr "female" "female" "male" "male" ...
- attr(*, "academic")= chr "read" "write" "math" "science" ...
- attr(*, "psychology")= chr "locus_of_control" "self_concept" "motivation"
数据默认的变量分组为心理变量和学习能力变量:
(psych_variables <- attr(psychademic, "psychology"))
(academic_variables <- attr(psychademic, "academic"))
[1] "locus_of_control" "self_concept" "motivation"
[1] "read" "write" "math" "science" "sex"
先使用 ggpair()
函数查看两组数据的组内相关性。 心理变量组的组内相关性如下:
ggpairs(psychademic, psych_variables, title = "Within Psychological Variables")
学习能力变量组的组内相关性如下:
ggpairs(psychademic, academic_variables, title = "Within Academic Variables")
然后再使用 ggduo()
函数得到两组变量之间的相关性:
ggduo(
psychademic, psych_variables, academic_variables,
types = list(continuous = "smooth_lm"),
title = "Between Academic and Psychological Variable Correlation",
xlab = "Psychological",
ylab = "Academic"
)
对于 ggduo()
在回归分析中的使用,我们可以自定义一个包含 ggduo()
的函数,通过分面图形展示各自变量对于因变量回归的拟合的分面图形,并且给出相应的残差诊断图。使用示例数据集为 swiss
数据集,代码如下:
swiss <- datasets::swiss
# 添加残差列
swiss$Residual <- seq_len(nrow(swiss))
# 计算残差值
residuals <- lapply(swiss[2:6], function(x) {
summary(lm(Fertility ~ x, data = swiss))$residuals
})
# 计算残差值对应的因变量范围
y_range <- range(unlist(residuals))
# 自定义函数
lm_or_resid <- function(data, mapping, ..., line_color = "red", line_size = 1) {
if (as.character(mapping$y) != "Residual") {
return(ggally_smooth_lm(data, mapping, ...))
}
# 显示残差值数据
resid_data <- data.frame(
x = data[[as.character(mapping$x)]],
y = residuals[[as.character(mapping$x)]]
)
ggplot(data = data, mapping = mapping) +
geom_hline(yintercept = 0, color = line_color, size = line_size) +
ylim(y_range) +
geom_point(data = resid_data, mapping = aes(x = x, y = y), ...)
}
# 利用ggduo进行绘图
ggduo(
swiss,
2:6, c(1,7),
types = list(continuous = lm_or_resid)
)
绘制效果如图所示,图形上半部分为回归拟合图,下半部分为回归诊断的残差图。 也可以在 ggduo()
中对图形参数进行自定义修改:
ggduo(
swiss,
2:6, c(1,7),
types = list(
continuous = wrap(lm_or_resid,
alpha = 0.7,
line_color = "blue",
line_size = 3
)
)
)
除了在典型相关分析和多元回归分析中使用 ggduo()
进行分面的可视化展示之外,ggduo()在其他方面也有用武之地。具体可参考:
https://ggobi.github.io/ggally/#multiple_time_series_analysis
参考资料:
https://ggobi.github.io/ggally/#ggally
欢迎大家关注微信公众号:数萃大数据
Python机器学习培训班【武汉站】
时间:2017年11月11日-12日
地点:武汉市湖北经济学院
更多详情,请扫描下面二维码