我有一个非常大的矩阵,其中包含很多缺失值。我想要得到变量之间的相关性。
1. 解决方案是:
cor(na.omit(matrix))
比下面更好吗?
cor(matrix, use = "pairwise.complete.obs")
我已经选择了只有超过20%缺失值的变量。
2. 哪种方法是最好的理解方式?
我有一个非常大的矩阵,其中包含很多缺失值。我想要得到变量之间的相关性。
1. 解决方案是:
cor(na.omit(matrix))
cor(matrix, use = "pairwise.complete.obs")
我会选择第二个选项。听起来你有相当数量的缺失数据,因此你需要寻找合理的多重插补策略来填补这些空白。查看Harrell的文本“回归建模策略”以获取关于如何正确执行此操作的大量指导。
我认为第二种选择更有意义,
您可以考虑使用Hmisc包中的rcorr函数。
它非常快速,并且仅包括成对完整观测值。返回的对象包含一个矩阵
这意味着您可以忽略基于少量观测值(无论您的阈值是多少)或基于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
对于未来的读者,《完整成对相关性被认为是危险的》可能很有价值。该文章认为使用cor(matrix, use = "pairwise.complete.obs")
是危险的,并提出了替代方案,例如use = "complete.obs")
。
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
cor
和一些其他包(如ppcor
)在数据中存在NA时会显示错误。您需要摆脱NA或设置一些选项。WGCNA包处理缺失值问题,并提供计算相关性的p值等统计信息。 - mehrdadorm