R 中的相关性:Pearson 和 Spearman 相关矩阵
R 中的双变量相关性
双变量关系描述了 R 中两个变量之间的关系或相关性。在本教程中,我们将讨论相关性的概念,并展示如何使用它来衡量 R 中任意两个变量之间的关系。
R 编程中的相关性
在 R 编程中,有两种主要方法可以计算两个变量之间的相关性:
- 皮尔逊:参数相关性
- 斯皮尔曼:非参数相关性
R 中的皮尔逊相关矩阵
皮尔逊相关法通常被用作两个变量之间关系的初步检验。
波长 XNUMXμm 的 相关系数,,是衡量强度的 线性 两个变量和之间的关系。其计算方法如下:
-
,即标准差
,即标准差
相关性范围在 -1 到 1 之间。
- 接近或等于 0 的值表示和 之间几乎没有或根本没有线性关系。
- 相反,越接近1或-1,线性关系越强。
我们可以按如下方式计算 t 检验,并检查自由度等于的分布表:
R 中的 Spearman 等级相关性
等级相关按等级对观测值进行排序,并计算等级之间的相似度。等级相关的优点是能够抵御异常值,并且与数据分布无关。请注意,等级相关适用于序数变量。
Spearman 等级相关性始终介于 -1 和 1 之间,值越接近极端值,表示关系越密切。其计算方法如下:
其中表示等级和之间的协方差。分母计算标准差。
在 R 中,我们可以使用 cor() 函数。它接受三个参数,以及方法。
cor(x, y, method)
参数:
- x:第一个向量
- y:第二向量
- 方法:用于计算相关性的公式。三个字符串值:
- “皮尔逊”
- “肯德尔”
- “矛兵”
如果向量包含缺失值,可以添加可选参数:use =“complete.obs”
我们将使用 BudgetUK 数据集。该数据集报告了 1980 年至 1982 年英国家庭的预算分配情况。共有 1519 个观测值,包含 XNUMX 个特征,其中包括:
- 食物: 分享食物 分享花费
- 燃料:分享燃料支出
- 布:服装支出的预算份额
- 沃尔克:分享酒水消费
- 韋斯特: 分享交通支出
- 沃瑟:其他商品支出份额
- 托特克斯:家庭总支出(以英镑计)
- 收入:家庭净收入总额
- 年龄: 家庭年龄
- 孩子: 儿童人数
例如:
library(dplyr) PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/british_household.csv" data <-read.csv(PATH) filter(income < 500) mutate(log_income = log(income), log_totexp = log(totexp), children_fac = factor(children, order = TRUE, labels = c("No", "Yes"))) select(-c(X,X.1, children, totexp, income)) glimpse(data)
代码说明
- 我们首先导入数据并使用 dplyr 库中的 glimpse() 函数进行查看。
- 有三个点超过 500K,因此我们决定将其排除。
- 将货币变量转换为对数是一种常见做法。它有助于减少异常值的影响并降低数据集中的偏斜度。
输出:
## Observations: 1,516## Variables: 10 ## $ wfood <dbl> 0.4272, 0.3739, 0.1941, 0.4438, 0.3331, 0.3752, 0... ## $ wfuel <dbl> 0.1342, 0.1686, 0.4056, 0.1258, 0.0824, 0.0481, 0... ## $ wcloth <dbl> 0.0000, 0.0091, 0.0012, 0.0539, 0.0399, 0.1170, 0... ## $ walc <dbl> 0.0106, 0.0825, 0.0513, 0.0397, 0.1571, 0.0210, 0... ## $ wtrans <dbl> 0.1458, 0.1215, 0.2063, 0.0652, 0.2403, 0.0955, 0... ## $ wother <dbl> 0.2822, 0.2444, 0.1415, 0.2716, 0.1473, 0.3431, 0... ## $ age <int> 25, 39, 47, 33, 31, 24, 46, 25, 30, 41, 48, 24, 2... ## $ log_income <dbl> 4.867534, 5.010635, 5.438079, 4.605170, 4.605170,... ## $ log_totexp <dbl> 3.912023, 4.499810, 5.192957, 4.382027, 4.499810,... ## $ children_fac <ord> Yes, Yes, Yes, Yes, No, No, No, No, No, No, Yes, ...
我们可以用“pearson”和“spearman”方法计算收入和wfood变量之间的相关系数。
cor(data$log_income, data$wfood, method = "pearson")
输出:
## [1] -0.2466986
cor(data$log_income, data$wfood, method = "spearman")
输出:
## [1] -0.2501252
R 中的相关矩阵
双变量相关性是一个好的开始,但我们可以通过多变量分析获得更广泛的信息。许多变量的相关性在图中表示为 相关矩阵. 相关矩阵是表示所有变量之间的成对相关性的矩阵。
cor() 函数返回一个相关矩阵。它与双变量相关的唯一区别是我们不需要指定哪些变量。默认情况下,R 会计算所有变量之间的相关性。
请注意,无法计算因子变量的相关性。我们需要确保在传递 cor() 内的数据框之前删除分类特征。
相关矩阵是对称的,这意味着对角线上方的值与对角线下方的值相同。显示矩阵的一半更直观。
我们排除 children_fac,因为它是一个因子级变量。cor 不对分类变量执行相关性计算。
# the last column of data is a factor level. We don't include it in the code mat_1 <-as.dist(round(cor(data[,1:9]),2)) mat_1
代码说明
- cor(数据):显示相关矩阵
- 圆形(数据,2):将相关矩阵四舍五入为保留两位小数
- as.dist():仅显示下半部分
输出:
## wfood wfuel wcloth walc wtrans wother age log_income ## wfuel 0.11 ## wcloth -0.33 -0.25 ## walc -0.12 -0.13 -0.09 ## wtrans -0.34 -0.16 -0.19 -0.22 ## wother -0.35 -0.14 -0.22 -0.12 -0.29 ## age 0.02 -0.05 0.04 -0.14 0.03 0.02 ## log_income -0.25 -0.12 0.10 0.04 0.06 0.13 0.23 ## log_totexp -0.50 -0.36 0.34 0.12 0.15 0.15 0.21 0.49
显着性水平
当我们使用 pearson 或 spearman 方法时,显著性水平在某些情况下很有用。Hmisc 库中的 rcorr() 函数为我们计算 p 值。我们可以从以下网址下载该库 康达 并复制代码并粘贴到终端中:
conda install -c r r-hmisc
rcorr() 要求将数据框存储为矩阵。我们可以先将数据转换为矩阵,然后再使用 p 值计算相关矩阵。
library("Hmisc") data_rcorr <-as.matrix(data[, 1: 9]) mat_2 <-rcorr(data_rcorr) # mat_2 <-rcorr(as.matrix(data)) returns the same output
列表对象 mat_2 包含三个元素:
- r:相关矩阵的输出
- n:观察次数
- P:p 值
我们感兴趣的是第三个元素,即 p 值。通常用 p 值而不是相关系数来显示相关矩阵。
p_value <-round(mat_2[["P"]], 3) p_value
代码说明
- mat_2[[“P”]]:p 值存储在名为 P 的元素中
- 圆形(mat_2[[“P”]],3):用三位数对元素进行舍入
输出:
wfood wfuel wcloth walc wtrans wother age log_income log_totexp wfood NA 0.000 0.000 0.000 0.000 0.000 0.365 0.000 0 wfuel 0.000 NA 0.000 0.000 0.000 0.000 0.076 0.000 0 wcloth 0.000 0.000 NA 0.001 0.000 0.000 0.160 0.000 0 walc 0.000 0.000 0.001 NA 0.000 0.000 0.000 0.105 0 wtrans 0.000 0.000 0.000 0.000 NA 0.000 0.259 0.020 0 wother 0.000 0.000 0.000 0.000 0.000 NA 0.355 0.000 0 age 0.365 0.076 0.160 0.000 0.259 0.355 NA 0.000 0 log_income 0.000 0.000 0.000 0.105 0.020 0.000 0.000 NA 0 log_totexp 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000 NA
在 R 中可视化相关矩阵
热图是显示相关矩阵的另一种方式。GGally 库是 ggplot2 的扩展。目前,它在 conda 库中不可用。我们可以直接在控制台中安装。
install.packages("GGally")
该库包含不同的函数来显示汇总统计数据,例如所有变量的相关性和分布 矩阵.
ggcorr() 函数有很多参数。我们将仅介绍本教程中将使用的参数:
ggcorr 函数
ggcorr(df, method = c("pairwise", "pearson"), nbreaks = NULL, digits = 2, low = "#3B9AB2", mid = "#EEEEEE", high = "#F21A00", geom = "tile", label = FALSE, label_alpha = FALSE)
参数:
- df:使用的数据集
- 方法:计算相关性的公式。默认情况下,计算成对和皮尔逊
- 打破:返回系数着色的分类范围。默认情况下,无中断,颜色渐变是连续的
- 数字:对相关系数进行四舍五入。默认设置为 2
- 低:控制较低层次的色彩
- στα μέσα:控制色彩的中间层次
- 高:控制高水平的色彩
- 几何:控制几何参数的形状。默认情况下,“tile”
- 标签:布尔值,是否显示标签,默认设置为`FALSE`
基本热图
该包最基本的图表是热图。图例显示从 -1 到 1 的渐变颜色,暖色表示强正相关,冷色表示负相关。
library(GGally) ggcorr(data)
代码说明
- ggcorr(数据):只需要一个参数,即数据框名称。图中不包含因子级变量。
输出:
向热图添加控制
我们可以向图表添加更多控件:
ggcorr(data, nbreaks = 6, low = "steelblue", mid = "white", high = "darkred", geom = "circle")
代码说明
- nbreaks=6:以6级打破传奇。
- 低 = “钢蓝色”:负相关时使用较浅的颜色
- 中 = “白色”:使用白色表示中等范围的相关性
- 高 = “深红色”:使用深色表示正相关
- geom =“圆圈”:使用圆形作为热图中窗口的形状,圆形的大小与相关性的绝对值成正比。
输出:
向热图添加标签
GGally 允许我们在窗口内添加标签:
ggcorr(data, nbreaks = 6, label = TRUE, label_size = 3, color = "grey50")
代码说明
- 标签 = TRUE:添加热图内的相关系数值。
- 颜色=“灰色50”:选择颜色,例如灰色
- 标签大小 = 3:设置标签大小为 3
输出:
ggpairs 函数
最后,我们介绍 GGaly 库中的另一个函数。Ggpair。它以矩阵格式生成图形。我们可以在一个图形中显示三种计算。矩阵是一个维度,等于观察次数。上/下部分显示窗口和对角线。我们可以控制矩阵每个部分要显示的信息。ggpair 的公式是:
ggpair(df, columns = 1: ncol(df), title = NULL, upper = list(continuous = "cor"), lower = list(continuous = "smooth"), mapping = NULL)
参数:
- df:使用的数据集
- 列:选择要绘制图表的列
- 标题:包含标题
- 上:控制图对角线上方的框。需要提供要返回的计算或图形的类型。如果 Continuous = “cor”,则要求 R 计算相关性。请注意,参数必须是列表。可以使用其他参数,有关更多信息,请参阅 [vignette](“http://ggobi.github.io/ggally/#custom_functions”)。
- 降低:控制对角线下方的箱子。
- 地图绘制:表示图形的美观度。例如,我们可以计算不同组的图形。
使用 ggpair 进行分组双变量分析
下图描绘了三个信息:
- log_totexp、log_income、age 和 wtrans 变量之间的相关矩阵按家庭是否有孩子分组。
- 按组绘制每个变量的分布
- 按组显示趋势散点图
library(ggplot2) ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor", size = 3)), lower = list(continuous = wrap("smooth", alpha = 0.3, size = 0.1)), mapping = aes(color = children_fac))
代码说明
- 列 = c(“log_totexp”, “log_income”, “age”, “wtrans”):选择要在图表中显示的变量
- title =“英国家庭收入支出的双变量分析”:添加标题
- 上部=列表():控制图形的上部。即对角线上方
- 连续 = 包裹(“cor”,大小 = 3)):计算相关系数。我们将参数连续包装在wrap()函数中,以控制图形的美观度(即size = 3)-lower = list():控制图形的下半部分。即对角线下方。
- 连续 = 包裹(“平滑”,alpha = 0.3,size=0.1):添加具有线性趋势的散点图。我们将参数连续包装在wrap()函数中,以控制图形的美观度(即size=0.1,alpha=0.3)
- 映射 = aes(颜色 = children_fac):我们希望图表的每个部分都由变量 children_fac 堆叠,这是一个分类变量,如果家庭没有孩子,则取值为 1,否则取值为 2
输出:
使用部分分组的 ggpair 进行双变量分析
下面的图有些不同。我们改变了上部参数中映射的位置。
ggpairs(data, columns = c("log_totexp", "log_income", "age", "wtrans"), title = "Bivariate analysis of revenue expenditure by the British household", upper = list(continuous = wrap("cor", size = 3), mapping = aes(color = children_fac)), lower = list( continuous = wrap("smooth", alpha = 0.3, size = 0.1)) )
代码说明
- 代码与前面的示例完全相同,除了:
- 映射 = aes(color = children_fac): 移动 upper = list() 中的列表。我们只希望按组堆叠计算在图的上部。
输出:
总结
- 双变量关系描述 R 中两个变量之间的关系或相关性。
- 计算两个变量之间的相关性有两种主要方法 R编程:皮尔逊和斯皮尔曼。
- 皮尔逊相关法通常被用作两个变量之间关系的初步检验。
- 等级相关按等级对观测值进行排序,并计算等级之间的相似度。
- Spearman 等级相关性始终介于 -1 和 1 之间,值越接近极端值,则表示关系越强。
- 相关矩阵是表示所有变量之间的对相关关系的矩阵。
- 当我们使用皮尔逊或斯皮尔曼方法时,重要性水平在某些情况下很有用。
我们可以在下表中总结 R 中的所有相关函数:
自学资料库 | 目的 | 付款方式 | 代码 |
---|---|---|---|
基值 | 双变量相关 | 皮尔逊 |
cor(dfx2, method = "pearson") |
基值 | 双变量相关 | 斯皮尔曼 |
cor(dfx2, method = "spearman") |
基值 | 多元相关性 | 皮尔逊 |
cor(df, method = "pearson") |
基值 | 多元相关性 | 斯皮尔曼 |
cor(df, method = "spearman") |
杂项 | P值 |
rcorr(as.matrix(data[,1:9]))[["P"]] |
|
盖利 | 热图 |
ggcorr(df) |
|
多变量图 |
cf code below |