R语言中的Pearson和Spearman相关矩阵示例

⚡ 智能摘要

R 语言中的 Pearson 和 Spearman 相关性用于衡量两个变量之间的相关性强弱,单个变量对使用 `cor()` 函数,多个变量对则使用相关矩阵。本教程将介绍如何使用 Hmisc 进行显著性检验,并使用 GGally 热图可视化结果。

  • 📐 系数范围: 所有相关性都介于 -1 和 1 之间,其中 0 表示没有线性关系,而 1 或 2 表示完全线性关系。
  • 📈 皮尔逊方法: 参数化方法,衡量线性关联,并假设连续变量大致服从正态分布。
  • 🔢 斯皮尔曼方法: 非参数方法,基于秩,对异常值和偏斜或有序数据具有鲁棒性。
  • 🧮 矩阵视图: cor(df) 返回每个成对系数,而 as.dist() 只打印下三角。
  • 🔬 意义: 使用 cor.test() 测试单个配对,或者使用 Hmisc 中的 rcorr() 测试完整的 p 值矩阵。
  • ???? 可视化: ggcorr() 绘制热图,ggpairs() 构建完整的分布矩阵和散点图。

R 中的相关矩阵

R 中的双变量相关性

双变量关系描述了 R 中两个变量之间的关系或相关性。在本教程中,我们将讨论相关性的概念,并展示如何使用它来衡量 R 中任意两个变量之间的关系。

R 编程中的相关性

在 R 编程中,有两种主要方法可以计算两个变量之间的相关性:

  • 皮尔逊:参数相关性
  • 斯皮尔曼:非参数相关性

R 中的皮尔逊相关矩阵

皮尔逊相关法通常被用作两个变量之间关系的初步检验。

相关系数r,用于衡量强度 线性 两个变量 x 和 y 之间的关系。其计算方法如下:

R 中的皮尔逊相关矩阵

-

  • R 中的皮尔逊相关矩阵 x 的标准差是多少?
  • R 中的皮尔逊相关矩阵 是 y 的标准差。

相关性范围在 -1 到 1 之间。

  • r 值接近或等于 0 表示 x 和 y 之间几乎没有或完全没有线性关系。
  • r 值越接近 1 或 -1,线性关系就越强。

您可以使用下面的 t 统计量来检验 r 是否与零不同,将其与自由度为 n – 2 的学生分布进行比较:

R 中的皮尔逊相关矩阵

R 中的 Spearman 等级相关性

秩相关分析按秩对观测值进行排序,并计算秩之间的相似度。秩相关分析的优势在于其对异常值具有鲁棒性,且与数据分布无关。此外,秩相关分析也是有序变量的理想选择。

斯皮尔曼等级相关系数(记为 rho)的取值范围也介于 -1 到 1 之间,接近任一极端值都表示存在很强的单调相关性。其计算方法如下:

R 中的 Spearman 等级相关性

分子是 x 和 y 的秩之间的协方差,分母是它们的标准差的乘积。

在 R 语言中,两者都使用 cor() 函数计算,该函数接受三个参数:x、y 和 method。

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)

Code 说明

  • 我们首先导入数据并使用 dplyr 库中的 glimpse() 函数进行查看。
  • 有三户家庭报告收入为 500 或以上,因此 filter(收入 < 500) 将它们删除,行数从 1,519 减少到 1,516。
  • 将货币变量转换为对数是一种常见做法。它有​​助于减少异常值的影响并降低数据集中的偏斜度。

输出:

## 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 的绝对值 关系强度
0.00到0.19 非常弱或无
0.20到0.39
0.40到0.59
0.60到0.79
0.80到1.00 很强

因此,先前计算出的 log_income 和 wfood 之间的值为 -0.2467,这是一个较弱的负相关关系:较富裕的家庭在食品上的支出占其预算的比例略小。

每个系数都有三点需要注意。

  • 相关不是因果关系。 较高的相关系数表明两个变量同步变化,但并不意味着其中一个变量导致另一个变量。通常情况下,第三个未被测量的变量会影响这两个变量。
  • 皮尔逊眼中只有直线。 完美的U型关系对应的r值接近于零。在相信数值之前,务必先绘制数据图。
  • 规模比意义更重要。 对于 1,516 个观测值,系数为 0.06 可能具有统计学意义,但实际上却毫无意义。

如何使用 cor.test() 检验相关性显著性

cor() 函数仅返回系数,不返回其他任何信息。对于单个数据对,cor.test() 函数会在一次调用中同时返回 p 值和置信区间。

cor.test(data$log_income, data$wfood, method = "pearson")

输出结果分为四个值得阅读的部分。

  1. t 和 df:检验统计量及其自由度,n – 2。
  2. p-值:如果真实相关性为零,则出现如此大系数的概率。
  3. 95% 置信区间:真实相关性的合理范围。如果该范围不包含零,则该关系在该显著性水平上具有统计学意义。
  4. 样本估计:系数本身,与 cor() 返回的值相同。

同一个函数只需更改一个参数即可运行基于排名的测试:

# Spearman rank correlation with a p-value
cor.test(data$log_income, data$wfood, method = "spearman")

# One-sided test: is the correlation greater than zero?
cor.test(data$log_income, data$wfood, alternative = "greater")

何时使用哪个? 当您只检查一个特定的数据对时,请使用 `cor.test()`,因为它会给出 `rcorr()` 所省略的置信区间。当您需要一次性计算整个矩阵的 p 值时,请使用上面所示的 Hmisc 库中的 `rcorr()` 函数。请注意,测试大量数据对会增加假阳性率,因此在从大型矩阵中得出结论之前,请使用 `p.adjust(p_value, method = “BH”)` 调整 p 值。

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

Code 说明

  • cor(data[, 1:9])计算九个数值列的相关矩阵。
  • round(…, 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

显着性水平

系数本身并不能说明这种关系是否具有统计学意义。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

Code 说明

  • 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 的功能,并且是从 CRAN 安装的,而不是从 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)

Code 说明

  • ggcorr(数据):只需要一个参数,即数据框名称。图中不包含因子级变量。

输出:

基本热图

向热图添加控制

我们可以向图表添加更多控件:

ggcorr(data,
    nbreaks = 6,
    low = "steelblue",
    mid = "white",
    high = "darkred",
    geom = "circle")

Code 说明

  • nbreaks=6:以6级打破传奇。
  • 低 = “钢蓝色”:负相关时使用较浅的颜色
  • 中 = “白色”:使用白色表示中等范围的相关性
  • 高 = “深红色”:使用深色表示正相关
  • geom =“圆圈”:使用圆形作为热图中窗口的形状,圆形的大小与相关性的绝对值成正比。

输出:

向热图添加控制

向热图添加标签

GGally 允许我们在窗口内添加标签:

ggcorr(data,
    nbreaks = 6,
    label = TRUE,
    label_size = 3,
    color = "grey50")

Code 说明

  • 标签 = TRUE:添加热图内的相关系数值。
  • 颜色=“灰色50”:选择颜色,例如灰色
  • 标签大小 = 3:设置标签大小为 3

输出:

向热图添加标签

ggpairs 函数

GGally 库还提供了 ggpairs() 函数,该函数返回一个图表矩阵。对于选定的 k 个变量,结果是一个 ak×k 的网格:对角线显示每个变量的分布,而对角线上下两侧的面板可以分别进行不同的计算。语法如下:

ggpairs(df, columns = 1:ncol(df), title = NULL,
    upper = list(continuous = "cor"),
    lower = list(continuous = "smooth"),
    mapping = NULL)		

参数:

  • df:使用的数据集
  • :选择要绘制图表的列
  • 标题:包含标题
  • 控制图表对角线上方的方框。需要指定要返回的计算类型或图表类型。如果 continuous = “cor”,则 R 会计算相关性。请注意,该参数必须是一个列表。还有其他参数可用;请参阅相关文档。 GGally 文档 获取更多信息。
  • 降低:控制对角线下方的箱子。
  • 地图ping:表示图形的美观度。例如,我们可以计算不同组的图形。

使用 ggpair 和 group 进行双变量分析ping

下图描绘了三个信息:

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

Code 说明

  • 列 = 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)
  • 地图ping = aes(color = children_fac):按 children_fac 因子拆分每个面板,该因子为有序因子,标记为“No”表示没有孩子的家庭,标记为“Yes”表示有孩子的家庭。

输出:

使用 ggpair 和 Group 进行双变量分析ping

使用 ggpair 进行双变量分析,并采用部分组ping

下图略有不同。我们改变了地图的位置。ping 在上方参数内部。

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

Code 说明

  • 代码与前面的示例完全相同,除了:
  • 地图ping = aes(color = children_fac): 将列表移动到 upper = list()。我们只需要按组堆叠的计算结果在图的上半部分。

输出:

使用 ggpair 进行双变量分析,采用偏组ping

R 语言中的相关性:关键要点和函数参考

  • 双变量关系描述 R 中两个变量之间的关系或相关性。
  • 计算两个变量之间的相关性有两种主要方法 R编程:皮尔逊和斯皮尔曼。
  • 皮尔逊相关法通常被用作两个变量之间关系的初步检验。
  • 等级相关按等级对观测值进行排序,并计算等级之间的相似度。
  • 斯皮尔曼等级相关系数的取值范围为 -1 到 1,接近任一极端值都表示存在很强的单调关系。
  • 相关矩阵是一个方格表格,其中包含了所有变量之间的两两相关性。
  • p 值可以告诉你观察到的相关性在统计学上是否与零有显著差异。

本教程中使用的所有相关函数如下所示:

图书馆 目的 付款方式 Code
基值 双变量相关性 皮尔逊
cor(dfx2, method = "pearson")
基值 双变量相关性 斯皮尔曼
cor(dfx2, method = "spearman")
基值 多元相关性 皮尔逊
cor(df, method = "pearson")
基值 多元相关性 斯皮尔曼
cor(df, method = "spearman")
杂项 P值 -
rcorr(as.matrix(data[,1:9]))[["P"]]
GGally 热图 -
ggcorr(df)
GGally 多元图矩阵 -
ggpairs(df, columns = c("x1", "x2"))

常见问题

当关系呈单调但非线性、存在异常值或变量为序数变量时,应使用斯皮尔曼等级相关系数。皮尔森等级相关系数则假设数据呈线性关系且近似服从正态分布。

Kendall tau 统计的是一致和不一致的样本对数量,而不是对差异进行排序。在样本量较小且存在大量并列样本的情况下,它比 Spearman 系数更稳健,但在大型数据集上计算速度较慢。

不。相关性只能衡量共同变动。混淆变量可能同时影响两个序列,因此仅凭相关系数无法确定任何真实影响的方向。

相关矩阵可以在训练前揭示冗余特征,因为两个高度相关的预测变量提供的信息很少,而且会破坏线性模型的稳定性。人工智能团队也利用相关矩阵来标记目标变量的数据泄露。

是的。AI 助手可以总结哪些特征对超过了阈值,建议删除哪些冗余特征,并解释热图颜色。在采取任何行动之前,请务必对照您自己的 `cor.test()` 输出结果验证每一项结论。

总结一下这篇文章: