`cor()` 在给定整个矩阵和仅给定一对列时给出不一致的结果

`cor()` gives inconsistent results when given the whole matrix and when given just a pair of columns

我有一个包含大量缺失值的矩阵,我正在尝试计算列之间的相关性。

为了处理缺失值,我使用

cor(matrix,use="complete")

这给出了一个没有所需 NA 值的矩阵。但是,如果我在 A 列和 B 列中的两列之间进行成对相关

cor(matrix[,A],matrix[,B],use="complete")

我得到的结果与矩阵中 [A,B] 条目中的结果不同。

看两个变量之间的关系图,似乎第二个结果更合理。

这种差异从何而来?

你问的是"complete.obs""pairwise.complete.obs"的区别。

## example matrix
set.seed(0);X <- matrix(rnorm(10*3),ncol=3)
X[1:2,1] <- NA
X[3:4,2] <- NA
X[5:6,3] <- NA

#              [,1]       [,2]        [,3]
# [1,]           NA  0.7635935 -0.22426789
# [2,]           NA -0.7990092  0.37739565
# [3,]  1.329799263         NA  0.13333636
# [4,]  1.272429321         NA  0.80418951
# [5,]  0.414641434 -0.2992151          NA
# [6,] -1.539950042 -0.4115108          NA
# [7,] -0.928567035  0.2522234  1.08576936
# [8,] -0.294720447 -0.8919211 -0.69095384
# [9,] -0.005767173  0.4356833 -1.28459935
#[10,]  2.404653389 -1.2375384  0.04672617

## complete
cor(X, use = "complete.obs")
#            [,1]        [,2]        [,3]
#[1,]  1.00000000 -0.69629279 -0.09773585
#[2,] -0.69629279  1.00000000 -0.01228196
#[3,] -0.09773585 -0.01228196  1.00000000

## pairwise
cor(X, use = "pairwise.complete.obs")
#            [,1]       [,2]        [,3]
#[1,]  1.00000000 -0.5531396  0.08229729
#[2,] -0.55313958  1.0000000 -0.10786401
#[3,]  0.08229729 -0.1078640  1.00000000

对于 use = "complete.obs",任何至少包含一个 NA 的行都将被删除。所以它本质上是

X1 <- X[7:10, ]  ## only the last 4 rows have no `NA`
cor(X1)
#            [,1]        [,2]        [,3]
#[1,]  1.00000000 -0.69629279 -0.09773585
#[2,] -0.69629279  1.00000000 -0.01228196
#[3,] -0.09773585 -0.01228196  1.00000000

此处,(1,2)(2,1) 条目 -0.69629279 仅使用 4 个数据计算。但是,如果你做pairwise,它可以用6个数据计算:

cor(X[5:10, 1], X[5:10, 2])
# [1] -0.5531396