本文主要参考《R语言实战》中第七章内容。

首先来看一下分类变量的探索。R提供了多种检验类别型变量(因子)独立性的方法,主要有卡方独立性检验、Fisher精确检验和Cochran-Mantel-Haenszel检验


卡方检验

卡方独立性检验可以使用chisq.test()函数对二维列联表的行变量和列变量进行卡方独立性检验。


分类变量和连续变量的相关性度量_数据


图中显示:病人的治疗方式与改善情况间不独立,即存在某种相关性;而病人的性别与治疗的改善情况间是独立的,认为治疗的改善情况与病人的性别没有关系。


Fisher精确检验

可以使用fisher.test()函数进行Fisher精确检验,该检验的原假设是:边界固定的列联表中行和列是相互独立的。与许多统计软件不同的是fisher.test()函数可以在任意行列数大于等于2的二维列联表中使用,但不能用于2×2的列联表。


分类变量和连续变量的相关性度量_fish_02


Cochran-Mantel-Haenszel检验

可以通过mantelhaen.test()函数进行Cochran-Mantel-Haenszel检验(如果不记得该检验函数,可以尝试使用apropos('test')查询所有可用的各种检验,其中就包含M-H检验)。该检验的原假设为:两个名义变量在第三个变量的每一层中都是条件独立的


分类变量和连续变量的相关性度量_数据_03


上图结果显示,在不同的性别下,治疗方式与改善情况间不是独立的,仍然存在一定的相关性。


分类变量相关程度度量

如果已知某些类别型变量之间(因子)不独立,即存在一定的相关性。那如何得到相关性的大小。这里可以使用vcd包中的assocstats()函数计算二维列联表的phi系数、列联系数(contingency coefficient)和Cramer's V系数


分类变量和连续变量的相关性度量_fish_04


连续变量的相关性度量

对于连续变量的相关性,使用相关系数来描述变量间的关系。相关系数的符号表示正相关或负相关,其值的大小表示关系的强弱。


R中可以计算多种相关系数,包括Pearson相关系数、Spearman相关系数、Kendall相关系数、偏相关系数等。


Pearson相关系数度量了两个连续变量之间的线性相关程度;

Spearman等级相关系数可以衡量非线性关系变量间的相关系数,是一种非参数的统计方法,可以用于定序变量或不满足正态分布假设的等间隔数据;

Kendall秩相关系数也是一种非参数的等级相关度量,类似于Spearman等级相关系数。


可以通过cor函数计算这三种相关系数。cor()函数中最重要的三个参数为X,use,method:

X为指定分析的矩阵或数据框;

use指定缺失数据的处理办法(all.obs则假设不存在缺失数据,遇到缺失数据时将会报错;everything遇到缺失数据时,结果将返回missing;complete.obs进行行删除;pairwise.complete.obs则成对删除);

method指明计算相关系数的方法,可以使pearson相关系数、spearman相关系数和kendall相关系数。


attach(women)
a <- height
b <- weight
c <- a^2 #a和c之间不存在线性关系

cor(a,b,method = 'pearson')
cor(a,b,method = 'spearman')
cor(a,b,method = 'kendall')

cor(a,c,method = 'pearson')
cor(a,c,method = 'spearman')
cor(a,c,method = 'kendall')


分类变量和连续变量的相关性度量_fish_05


对于有缺失的数据集,通过use参数的设定,将会产生不同计算的结果:

分类变量和连续变量的相关性度量_fish_06


偏相关系数

偏相关系数指在控制一个或多个定量变量时,另外两个定量变量之间的相互关系。可以使用ggm包中的pcor函数计算偏相关系数。其中pcor函数中的两个重要参数是u和S:

u为一个数值向量,前两个数值表示要计算相关系数的变量下标,其余的数值为条件变量的下标;

S为所有变量的协方差矩阵。

分类变量和连续变量的相关性度量_数据_07


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


总结:本文涉及到的R包和函数

stats包

chisq.test()

fisher.test()

mantelhaen.test()

cor()

cov()

vcd包

assocstats()

ggm包

pcor()

gmodels包

CrossTable()

这里说明一下,gmodels包中的CrossTable()函数可以实现列联表分析,其结果类似于SAS中的PROC FREQ过程。