处理缺失值以进行相关性计算

48

我有一个非常大的矩阵,其中包含很多缺失值。我想要得到变量之间的相关性。

1. 解决方案是:

cor(na.omit(matrix))

比下面更好吗?
cor(matrix, use = "pairwise.complete.obs")

我已经选择了只有超过20%缺失值的变量。
2. 哪种方法是最好的理解方式?
4个回答

22

我会选择第二个选项。听起来你有相当数量的缺失数据,因此你需要寻找合理的多重插补策略来填补这些空白。查看Harrell的文本“回归建模策略”以获取关于如何正确执行此操作的大量指导。


18

我认为第二种选择更有意义,

您可以考虑使用Hmisc包中的rcorr函数。

它非常快速,并且仅包括成对完整观测值。返回的对象包含一个矩阵

  1. 相关分数
  2. 用于每个相关值的观测次数
  3. 每个相关性的p值

这意味着您可以忽略基于少量观测值(无论您的阈值是多少)或基于p值的相关性值。

library(Hmisc)
x<-matrix(nrow=10,ncol=10,data=runif(100))
x[x>0.5]<-NA
result<-rcorr(x)
result$r[result$n<5]<-0 # ignore less than five observations
result$r

7

4
我不能推荐那篇文章。作者提出了一个反例,试图说明在明显不合适的情况下使用成对相关性是错误的,但文章中甚至没有提到相关系数的数学定义。考虑这个例子,仅仅是作者演示的延伸:如果A和B在所有观测值上都一致,但A有99个观测值而B只有97个,那么成对相关性系数显示1是否真的荒谬?你会认同作者关于NA相关性更加合理的结论吗? - David Klotz

0
尝试使用WGCNA包。R基础函数cor和其他一些包,如ppcor,如果数据中有NA,则会显示错误。您需要摆脱NAs或设置一些选项。该WGCNA包处理缺失值问题,并提供一些计算相关性的统计信息,例如p值。
library(WGCNA)
varX <- seq(from=1, to=10, length=10)
varY <- seq(from=20, to=50, length=10)
varZ <- rnorm(10)

varZ[c(1,5,7)] <- NA

mat <- cbind(varX, varY, varZ)

corAndPvalue(mat, method='spearman')

$cor
     varX varY varZ
varX  1.0  1.0  0.5
varY  1.0  1.0  0.5
varZ  0.5  0.5  1.0

$p
             varX         varY         varZ
varX 1.063504e-62 1.063504e-62 2.531700e-01
varY 1.063504e-62 1.063504e-62 2.531700e-01
varZ 2.531700e-01 2.531700e-01 1.411089e-39

$Z
          varX      varY      varZ
varX 51.953682 51.953682  1.228286
varY 51.953682 51.953682  1.228286
varZ  1.228286  1.228286 41.072992

$t
             varX         varY         varZ
varX 1.342177e+08 1.342177e+08 1.290994e+00
varY 1.342177e+08 1.342177e+08 1.290994e+00
varZ 1.290994e+00 1.290994e+00 1.061084e+08

$nObs
     varX varY varZ
varX   10   10    7
varY   10   10    7
varZ    7    7    7

R基础函数cor和一些其他包(如ppcor)在数据中存在NA时会显示错误。您需要摆脱NA或设置一些选项。WGCNA包处理缺失值问题,并提供计算相关性的p值等统计信息。 - mehrdadorm
谢谢。我把你的评论添加到了你的答案正文中。这样,读者更有可能看到它,并加强了你传达的内容。如果你写更多的答案,你总是可以选择编辑,在你的帖子下面有编辑按钮。 - xilliam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接