R cor()函数中的缺失值处理

作者: JeremyL | 来源:发表于2020-09-16 12:43 被阅读0次

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

        本文链接:https://www.haomeiwen.com/subject/wdicyktx.html