R x相关性计算时缺失值的处理

我们拿到的观测数据常常是有缺失值的,有时候基于数据分布是可以预测缺失值。有时候却是不能,比如缺失值太多,数据量太小。因此,计算相关性时需要考虑到缺失值的使用。在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

你可能感兴趣的:(R x相关性计算时缺失值的处理)