7.3 相关

相关系数可以用来描述定量变量之间的关系。相关系数的符号(?)表明关系的方向(正相关或负相关),其值的大小表示关系的强弱程度(完全不相关时为0,完全相关时为1)。

本节中,我们将关注多种相关系数和相关性的显著性检验。我们将使用R基础安装中的state.x77数据集,它提供了美国50个州在1977年的人口、收入、文盲率、预期寿命、谋杀率和高中毕业率数据。数据集中还收录了气温和土地面积数据,但为了节约空间,这里将其丢弃。你可以使用help(state.x77)了解数据集的更多信息。除了基础安装以外,我们还将使用psychggm包。

7.3.1 相关的类型

R可以计算多种相关系数,包括Pearson相关系数、Spearman相关系数、Kendall相关系数、偏相关系数、多分格(polychoric)相关系数和多系列(polyserial)相关系数。下面让我们依次理解这些相关系数。

  • Pearson、Spearman和Kendall相关

Pearson积差相关系数衡量了两个定量变量之间的线性相关程度。Spearman等级相关系数则衡量分级定序变量之间的相关程度。Kendall’s Tau相关系数也是一种非参数的等级相关度量。

cor()函数可以计算这三种相关系数,而cov()函数可用来计算协方差。两个函数的参数有很多,其中与相关系数的计算有关的参数可以简化为:

  1. cor(x, use= , method= )

这些参数详述于表7-3中。 表7-3 corcov的参数

参  数 描  述 x 矩阵或数据框 use 指定缺失数据的处理方式。可选的方式为all.obs(假设不存在缺失数据——遇到缺失数据时将报错)、everything(遇到缺失数据时,相关系数的计算结果将被设为missing)、complete.obs(行删除)以及 pairwise.complete.obs(成对删除,pairwise deletion) method 指定相关系数的类型。可选类型为pearsonspearmankendall

默认参数为use="everything"method="pearson"。你可以在代码清单7-17中看到一个示例。

代码清单7-17 协方差和相关系数

  1. > states<- state.x77[,1:6]
  2. > cov(states)
  3. Population Income Illiteracy Life Exp Murder HS Grad
  4. Population 19931684 571230 292.868 -407.842 5663.52 -3551.51
  5. Income 571230 377573 -163.702 280.663 -521.89 3076.77
  6. Illiteracy 293 -164 0.372 -0.482 1.58 -3.24
  7. Life Exp -408 281 -0.482 1.802 -3.87 6.31
  8. Murder 5664 -522 1.582 -3.869 13.63 -14.55
  9. HS Grad -3552 3077 -3.235 6.313 -14.55 65.24
  10.  
  11. > cor(states)
  12. Population Income Illiteracy Life Exp Murder HS Grad
  13. Population 1.0000 0.208 0.108 -0.068 0.344 -0.0985
  14. Income 0.2082 1.000 -0.437 0.340 -0.230 0.6199
  15. Illiteracy 0.1076 -0.437 1.000 -0.588 0.703 -0.6572
  16. Life Exp -0.0681 0.340 -0.588 1.000 -0.781 0.5822
  17. Murder 0.3436 -0.230 0.703 -0.781 1.000 -0.4880
  18. HS Grad -0.0985 0.620 -0.657 0.582 -0.488 1.0000
  19.  
  20. > cor(states, method="spearman")
  21. Population Income Illiteracy Life Exp Murder HS Grad
  22. Population 1.000 0.125 0.313 -0.104 0.346 -0.383
  23. Income 0.125 1.000 -0.315 0.324 -0.217 0.510
  24. Illiteracy 0.313 -0.315 1.000 -0.555 0.672 -0.655
  25. Life Exp -0.104 0.324 -0.555 1.000 -0.780 0.524
  26. Murder 0.346 -0.217 0.672 -0.780 1.000 -0.437
  27. HS Grad -0.383 0.510 -0.655 0.524 -0.437 1.000

首个语句计算了方差和协方差,第二个语句则计算了Pearson积差相关系数,而第三个语句计算了Spearman等级相关系数。举例来说,我们可以看到收入和高中毕业率之间存在很强的正相关,而文盲率和预期寿命之间存在很强的负相关。

请注意,在默认情况下得到的结果是一个方阵(所有变量之间两两计算相关)。你同样可以计算非方形的相关矩阵。观察以下示例:

  1. > x <- states[,c("Population", "Income", "Illiteracy", "HS Grad")]
  2. > y <- states[,c("Life Exp", "Murder")]
  3. > cor(x,y)
  4. Life Exp Murder
  5. Population -0.068 0.344
  6. Income 0.340 -0.230
  7. Illiteracy -0.588 0.703
  8. HS Grad 0.582 -0.488

当你对某一组变量与另外一组变量之间的关系感兴趣时,cor()函数的这种用法是非常实用的。注意,上述结果并未指明相关系数是否显著不为0(即,根据样本数据是否有足够的证据得出总体相关系数不为0的结论)。由于这个原因,你需要对相关系数进行显著性检验(在7.3.2节中阐述)。

  • 偏相关

偏相关是指在控制一个或多个定量变量时,另外两个定量变量之间的相互关系。你可以使用ggm包中的pcor()函数计算偏相关系数。ggm包没有被默认安装,在第一次使用之前需要先进行安装。函数调用格式为:

  1. pcor(u, S)

其中的u是一个数值向量,前两个数值表示要计算相关系数的变量下标,其余的数值为条件变量(即要排除影响的变量)的下标。S为变量的协方差阵。这个示例有助于阐明用法:

  1. > library(ggm)
  2. > # 在控制了收入、文盲率和高中毕业率时
  3. > # 人口和谋杀率的偏相关系数
  4. > pcor(c(1,5,2,3,6), cov(states))
  5. [1] 0.346

本例中,在控制了收入、文盲率和高中毕业率的影响时,人口和谋杀率之间的相关系数为0.346。偏相关系数常用于社会科学的研究中。

  • 其他类型的相关

polycor包中的hetcor()函数可以计算一种混合的相关矩阵,其中包括数值型变量的Pearson积差相关系数、数值型变量和有序变量之间的多系列相关系数、有序变量之间的多分格相关系数以及二分变量之间的四分相关系数。多系列、多分格和四分相关系数都假设有序变量或二分变量由潜在的正态分布导出。请参考此程序包所附文档以了解更多。

7.3.2 相关性的显著性检验

在计算好相关系数以后,如何对它们进行统计显著性检验呢?常用的原假设为变量间不相关(即总体的相关系数为0)。你可以使用cor.test()函数对单个的Pearson、Spearman和Kendall相关系数进行检验。简化后的使用格式为:

  1. cor.test(x, y, alternative = , method = )

其中的xy为要检验相关性的变量,alternative则用来指定进行双侧检验或单侧检验(取值为"two.side""less""greater"),而method用以指定要计算的相关类型("pearson""kendall""spearman")。当研究的假设为总体的相关系数小于0时,请使用alternative="less"。在研究的假设为总体的相关系数大于0时,应使用alternative="greater"。在默认情况下,假设为alternative="two.side"(总体相关系数不等于0)。参考代码清单7-18中的示例。

代码清单7-18 检验某种相关系数的显著性

  1. > cor.test(states[,3], states[,5])
  2. Pearson's product-moment correlation
  3. data: states[, 3] and states[, 5]
  4. t = 6.85, df = 48, p-value = 1.258e-08
  5. alternative hypothesis: true correlation is not equal to 0
  6. 95 percent confidence interval:
  7. 0.528 0.821
  8. sample estimates:
  9. cor
  10. 0.703

这段代码检验了预期寿命和谋杀率的Pearson相关系数为0的原假设。假设总体的相关度为0,则预计在一千万次中只会有少于一次的机会见到0.703这样大的样本相关度(即p = 1.258e?08)。由于这种情况几乎不可能发生,所以你可以拒绝原假设,从而支持了要研究的猜想,即预期寿命和谋杀率之间的总体相关度不为 0。

遗憾的是,cor.test每次只能检验一种相关关系。但幸运的是,psych包中提供的corr.test()函数可以一次做更多事情。corr.test()函数可以为Pearson、Spearman或Kendall相关计算相关矩阵和显著性水平。代码清单7-19中给出了一个示例。

代码清单7-19 通过corr.test计算相关矩阵并进行显著性检验

  1. > library(psych)
  2. > corr.test(states, use="complete")
  3. Call:corr.test(x = states, use = "complete")
  4. Correlation matrix
  5. Population Income Illiteracy Life Exp Murder HS Grad
  6. Population 1.00 0.21 0.11 -0.07 0.34 -0.10
  7. Income 0.21 1.00 -0.44 0.34 -0.23 0.62
  8. Illiteracy 0.11 -0.44 1.00 -0.59 0.70 -0.66
  9. Life Exp -0.07 0.34 -0.59 1.00 -0.78 0.58
  10. Murder 0.34 -0.23 0.70 -0.78 1.00 -0.49
  11. HS Grad -0.10 0.62 -0.66 0.58 -0.49 1.00
  12. Sample Size
  13. [1] 50
  14. Probability value
  15. Population Income Illiteracy Life Exp Murder HS Grad
  16. Population 0.00 0.15 0.46 0.64 0.01 0.5
  17. Income 0.15 0.00 0.00 0.02 0.11 0.0
  18. Illiteracy 0.46 0.00 0.00 0.00 0.00 0.0
  19. Life Exp 0.64 0.02 0.00 0.00 0.00 0.0
  20. Murder 0.01 0.11 0.00 0.00 0.00 0.0
  21. HS Grad 0.50 0.00 0.00 0.00 0.00 0.0

参数use=的取值可为"pairwise""complete"(分别表示对缺失值执行成对删除或行删除)。参数method=的取值可为"pearson"(默认值)、"spearman""kendall"。这里可以看到,人口数量和高中毕业率的相关系数(?0.10)并不显著地不为0(p = 0.5)。

其他显著性检验

在7.4.1节中,我们关注了偏相关系数。在多元正态性的假设下,psych包中的pcor.test()函数1可以用来检验在控制一个或多个额外变量时两个变量之间的条件独立性。使用格式为:

  1. pcor.test(r, q, n)

1 这里可能是作者的笔误,函数pcor.test事实上包含于ggm包中。——译者注

其中的r是由pcor()函数计算得到的偏相关系数,q为要控制的变量数(以数值表示位置),n为样本大小。

在结束这个话题之前应当指出的是,psych包中的r.test()函数提供了多种实用的显著性检验方法。此函数可用来检验:

  • 某种相关系数的显著性;

  • 两个独立相关系数的差异是否显著;

  • 两个基于一个共享变量得到的非独立相关系数的差异是否显著;

  • 两个基于完全不同的变量得到的非独立相关系数的差异是否显著。

参阅help(r.test)以了解详情。

7.3.3 相关关系的可视化

以相关系数表示的二元关系可以通过散点图和散点图矩阵进行可视化,而相关图(correlogram)则为以一种有意义的方式比较大量的相关系数提供了一种独特而强大的方法。这些图形将在第11章中详述。