相关

相关系数可以用来描述定量变量之间的关系。 相关系数的符号(±)表明关系的方向(正相关或负相关),其值的大小表示关系的强弱程度(完全不相关时为0,完全相关时为1) 本次训练中,我们将关注多种相关系数和相关性的显著检验。

数据集

本次训练的数据集采用R基础安装自带的state.x77数据集,它提供了美国50个州在1977年的人口、收入、文盲率、预期寿命、谋杀率和高中毕业率数据。可以通过help(“state.x77”)查看详细说明

相关系数的类型

R中可以计算多种相关系数,包括: * Pearson(皮尔森)相关系数 * Spearman(斯皮尔曼)相关系数 * Kendall(肯德尔)相关系数 * 偏相关系数 * 多分格(polychoric)相关系数 * 多系列(polyserial)相关系数

1、Pearson、Spearman和Kendall相关

Pearson积差相关系数衡量了两个定量变量之间的线性相关程度。 Spearman等级相关系数则衡量分级定序变量之间的相关程度。 Kendall’s Tau相关系数也是一种非参数的等级相关度量。 cor()函数可以计算这三种相关系数,而cov()函数可用来计算协方差,两个函数的参数有很多,具体可以通过?cor来查看

cor(x, y = NULL, use = “everything”, method = c(“pearson”, “kendall”, “spearman”))

cov(x, y = NULL, use = “everything”, method = c(“pearson”, “kendall”, “spearman”))

表1 cor和cov的参数 参数|描述 x|一个数值型向量,矩阵或数据框 y|默认为NULL,默认情况下y=x,与x兼容,可以是一个数值型的向量、矩阵或数据框 na.rm|逻辑参数,缺失值是否移除 use|“everything”(默认,遇到缺失数据时,相关系数的计算结果将被设为missing), “all.obs”(假设不存在确实数据——遇到确实数据时将报错), “complete.obs”(删除行), “na.or.complete”, or “pairwise.complete.obs”(成对删除) method|指定相关系数的类型。可选类型为pearson,spearman,kendall

states<- state.x77[,1:6]
cov(states)
##               Population      Income   Illiteracy     Life Exp      Murder
## Population 19931683.7588 571229.7796  292.8679592 -407.8424612 5663.523714
## Income       571229.7796 377573.3061 -163.7020408  280.6631837 -521.894286
## Illiteracy      292.8680   -163.7020    0.3715306   -0.4815122    1.581776
## Life Exp       -407.8425    280.6632   -0.4815122    1.8020204   -3.869480
## Murder         5663.5237   -521.8943    1.5817755   -3.8694804   13.627465
## HS Grad       -3551.5096   3076.7690   -3.2354694    6.3126849  -14.549616
##                 HS Grad
## Population -3551.509551
## Income      3076.768980
## Illiteracy    -3.235469
## Life Exp       6.312685
## Murder       -14.549616
## HS Grad       65.237894
cor(states)
##             Population     Income Illiteracy    Life Exp     Murder
## Population  1.00000000  0.2082276  0.1076224 -0.06805195  0.3436428
## Income      0.20822756  1.0000000 -0.4370752  0.34025534 -0.2300776
## Illiteracy  0.10762237 -0.4370752  1.0000000 -0.58847793  0.7029752
## Life Exp   -0.06805195  0.3402553 -0.5884779  1.00000000 -0.7808458
## Murder      0.34364275 -0.2300776  0.7029752 -0.78084575  1.0000000
## HS Grad    -0.09848975  0.6199323 -0.6571886  0.58221620 -0.4879710
##                HS Grad
## Population -0.09848975
## Income      0.61993232
## Illiteracy -0.65718861
## Life Exp    0.58221620
## Murder     -0.48797102
## HS Grad     1.00000000
cor(states,method = "spearman")
##            Population     Income Illiteracy   Life Exp     Murder
## Population  1.0000000  0.1246098  0.3130496 -0.1040171  0.3457401
## Income      0.1246098  1.0000000 -0.3145948  0.3241050 -0.2174623
## Illiteracy  0.3130496 -0.3145948  1.0000000 -0.5553735  0.6723592
## Life Exp   -0.1040171  0.3241050 -0.5553735  1.0000000 -0.7802406
## Murder      0.3457401 -0.2174623  0.6723592 -0.7802406  1.0000000
## HS Grad    -0.3833649  0.5104809 -0.6545396  0.5239410 -0.4367330
##               HS Grad
## Population -0.3833649
## Income      0.5104809
## Illiteracy -0.6545396
## Life Exp    0.5239410
## Murder     -0.4367330
## HS Grad     1.0000000

可以看出收入和高中毕业率有很强的正相关性,谋杀和预期寿命有很强的负相关性; 我们也可以指定x和y来进行观察

x <- state.x77[,c("Population","Income","Illiteracy","Life Exp")]
y <- state.x77[,c("Murder","HS Grad")]
cor(x,y)
##                Murder     HS Grad
## Population  0.3436428 -0.09848975
## Income     -0.2300776  0.61993232
## Illiteracy  0.7029752 -0.65718861
## Life Exp   -0.7808458  0.58221620

但要注意,上述结果为指明相关系数是否显著不为0,这说明我们要有足够的证据得出总体相关系数不为0的结论。因此我们要进行相关系数的显著性检验。

2、偏相关

偏相关是指在控制一个或多个定量变量时,另外两个定量变量之间的相互关系。这里使用ggm包中的pcor()函数计算偏相关系数。调用格式如下: pcor(u,S) “u”为一个数值向量,前两个下标表明要计算相关系数的变量下标,其余的数值为条件变量(即要排除影响或者控制的变量)的下标。S为变量的协方差阵。

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

拓展,还有一个polycor包中的hetcor()函数可以计算一种混合的相关矩阵,可以用于计算几乎所有的相关系数。可以参考详细文档

相关性的显著性检验

前面的练习已经提到过,在计算出相关系数以后,还要对这些系数进行统计显著性检验,常用的原假设为H0:变量间不相关(即总体的相关系数为0)。这可使用cor.test()函数对单个的Pearson,Spearman和Kendall相关系数进行检验。调用格式如下:

cor.test(x, y, alternative = c(“two.sided”, “less”, “greater”), method = c(“pearson”, “kendall”, “spearman”), exact = NULL, conf.level = 0.95, continuity = FALSE, …)

x和y为要检验相关性的变量,alternative制定双侧检验或单侧检验。

#Illiteracy <- states[,3]
Life.Exp <- states[,4]
Murder <- states[,5]
cor.test(Life.Exp,Murder)
## 
##  Pearson's product-moment correlation
## 
## data:  Life.Exp and Murder
## t = -8.6596, df = 48, p-value = 2.26e-11
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  -0.8700837 -0.6420442
## sample estimates:
##        cor 
## -0.7808458

p值小于0.05,可以拒绝原假设,说明预期寿命和谋杀率之间的总体相关度不为0,切为负相关

不足的是cor.test()一次只能检验一种相关关系。这里可以用psych包中提供的corr.test()函数来一次检验多种相关关系。

library(psych)
corr.test(states,use="complete")
## Call:corr.test(x = states, use = "complete")
## Correlation matrix 
##            Population Income Illiteracy Life Exp Murder HS Grad
## Population       1.00   0.21       0.11    -0.07   0.34   -0.10
## Income           0.21   1.00      -0.44     0.34  -0.23    0.62
## Illiteracy       0.11  -0.44       1.00    -0.59   0.70   -0.66
## Life Exp        -0.07   0.34      -0.59     1.00  -0.78    0.58
## Murder           0.34  -0.23       0.70    -0.78   1.00   -0.49
## HS Grad         -0.10   0.62      -0.66     0.58  -0.49    1.00
## Sample Size 
## [1] 50
## Probability values (Entries above the diagonal are adjusted for multiple tests.) 
##            Population Income Illiteracy Life Exp Murder HS Grad
## Population       0.00   0.59       1.00      1.0   0.10       1
## Income           0.15   0.00       0.01      0.1   0.54       0
## Illiteracy       0.46   0.00       0.00      0.0   0.00       0
## Life Exp         0.64   0.02       0.00      0.0   0.00       0
## Murder           0.01   0.11       0.00      0.0   0.00       0
## HS Grad          0.50   0.00       0.00      0.0   0.00       0
## 
##  To see confidence intervals of the correlations, print with the short=FALSE option

可视化

使用相关关系图correlogram进行相关关系的可视化

library(corrgram)
corrgram(states,order = TRUE,lower.panel = panel.shade,upper.panel = panel.pie,text.panel = panel.txt,main="Correlogram of state.x77 intercorrelations")