我们拿到的观测数据常常是有缺失值的,有时候基于数据分布是可以预测缺失值。有时候却是不能,比如缺失值太多,数据量太小。因此,计算相关性时需要考虑到缺失值的使用。在R中的基础函数cor中有相当全面的缺失值处理方法。
#cor()参数
cor(x, y = NULL, use = "everything",
method = c("pearson", "kendall", "spearman"))
x a numeric vector, matrix or data frame.
y NULL (default) or a vector, matrix or data frame with compatible dimensions to x. The default is equivalent to y = x (but more efficient).
na.rm logical. Should missing values be removed?
use an optional character string giving a method for computing covariances in the presence of missing values. This must be (an abbreviation of) one of the strings "everything", "all.obs", "complete.obs", "na.or.complete", or "pairwise.complete.obs".
method a character string indicating which correlation coefficient (or covariance) is to be computed. One of "pearson" (default), "kendall", or "spearman": can be abbreviated.
V symmetric numeric matrix, usually positive definite such as a covariance matrix.
在使用cor(),可以指定x,y两个向量;也可以使用一个矩阵,计算所有样本两两之间的相关性。
use参数可以设定缺失值处理的方法,方法有:everything,all.obs,complete.obs,na.or.complete,pairwise.complete.obs
#解释一下各种方法:
- everything:数据中只要存在NA,结果就会是NA;
- all.obs:如果存在NA,计算会报错;
- complete.obs:有缺失值的观测会被删除;如果计算相关性的对象之间没有完整的观测(overlap不是NA),计算会报错;这儿的完整的观测值是在所有样本中都不缺失,例如矩阵中所有样本。此方法相当于,所有样本的观测值求overlap,然后保留,用于计算相关性。
- na.or.complete:其实与complete.obs一样,只是如果计算相关性的两个对象之间没有完整的观测(overlap不是NA),计算不会报错,返回值是NA;
- pairwise.complete.obs:相关性和协方差计算时,每次使用总数据中正在计算的一对数据完整的观测值(两组数据的overlap);因此,相关性和协方差矩阵会是半正定矩阵,两个对象之间不存在完整的观测值(观测值没有overlap)返回NA。对于cov 和 var, "pairwise.complete.obs"只适用于pearson方法。此方法相当于,所有样本求相关性时,正在计算的两个样本的观测值求overlap,然后保留,用于计算相关性。
在这几种方法中everything和na.or.complete在没有观测值时,返回NA;其他方法无法计算。
##示例
> a=c(1, 2, 3, NA, NA, NA)
> b=c(NA, NA, NA, 1, 2, 3)
> cor(a, b, use="everything")
[1] NA
> cor(a, b, use="all.obs")
Error in cor(a, b, use = "all.obs") : cov/cor中有遗漏值
> cor(a, b, use="complete.obs")
Error in cor(a, b, use = "complete.obs") : 不存在完的一对
> cor(a, b, use="na.or.complete")
[1] NA
> cor(a, b, use="pairwise.complete.obs")
[1] NA
> a=c(1, 2, 3, 4, 5, NA, NA, NA)
> b=c(NA, NA, NA, 4, 5, 1, 2, 3)
> cor(a, b)
[1] NA
> cor(a, b, use="everything")
[1] NA
> cor(a, b, use="all.obs") #不能存在缺失值
Error in cor(a, b, use = "all.obs") : cov/cor中有遗漏值
> cor(a, b, use="complete.obs") #overlap值
[1] 1
> cor(a, b, use="na.or.complete")
[1] 1
> cor(a, b, use="pairwise.complete.obs")
[1] 1
#complete.obs与"pairwise.complete.obs"比较:
相同点:
- 都是使用样本完整的观测值(但二者完整定义的范围不同)
- 不存在完整的观测值(观测值没有overlap),都返回NA
区别:
二者完整的观测值定义的范围不同;当处理数据是矩阵时,complete.obs是观测值在整个数据中不缺失才算完整;pairwise.complete.obs是在两两样本(正在计算的样本)之间都存在的观测值就是完整。
##示例:
> a=c(1, 2, 3, 4, 5, NA, NA, NA)
> b=c(NA, NA, NA, 4, 5, 1, 2, 3)
> c=c(1, 2, 3, NA, NA, 1, 2, 3)
> d=data.frame(a,b,c)
> d
a b c
1 1 NA 1
2 2 NA 2
3 3 NA 3
4 4 4 NA
5 5 5 NA
6 NA 1 1
7 NA 2 2
8 NA 3 3
> cor(d, use = 'na.or.complete')
a b c
a NA NA NA
b NA NA NA
c NA NA NA
> cor(d, use = 'pairwise.complete.obs')
a b c
a 1 1 1
b 1 1 1
c 1 1 1