ggduo:多元统计分析的可视化展示

浏览: 2320

数缺形时少直观。GGally包中的ggduo函数可以让你在多元统计分析中对分组数据进行可视化展示。这在典型相关分析和回归分析中进行图形展示十分有用。

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")

image.png

学习能力变量组的组内相关性如下:

ggpairs(psychademic, academic_variables, title = "Within Academic Variables")

image.png

然后再使用 ggduo()函数得到两组变量之间的相关性:

ggduo(
 psychademic, psych_variables, academic_variables,
 types = list(continuous = "smooth_lm"),
 title = "Between Academic and Psychological Variable Correlation",
 xlab = "Psychological",
 ylab = "Academic"
)

image.png

回归分析

对于 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)
)

image.png

绘制效果如图所示,图形上半部分为回归拟合图,下半部分为回归诊断的残差图。 也可以在 ggduo()中对图形参数进行自定义修改:

ggduo(
 swiss,
 2:6, c(1,7),
 types = list(
   continuous = wrap(lm_or_resid,
     alpha = 0.7,
     line_color = "blue",
     line_size = 3
   )
 )
)

image.png

除了在典型相关分析和多元回归分析中使用 ggduo()进行分面的可视化展示之外,ggduo()在其他方面也有用武之地。具体可参考:

https://ggobi.github.io/ggally/#multiple_time_series_analysis


参考资料:

https://ggobi.github.io/ggally/#ggally



往期精彩:

R语言爬虫系列6|动态数据抓取范例

R语言爬虫系列5|正则表达式与字符串处理函数

R语言爬虫系列4|AJAX与动态网页介绍

R语言爬虫系列3|HTTP协议

R语言爬虫系列2|XML&XPath表达式与R爬虫应用

R语言爬虫系列1|HTML基础与R语言解析

如何写出整洁规范的R代码?是时候讨论一下代码规范性了

R语言向量化运算:apply函数族用法心得

Python面向对象编程:数据封装、继承和多态

[译]为什么R语言是当今最值得学习的数据科学语言

image.png

推荐 0
本文由 鲁伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册