为什么我在相关矩阵中得到NA?

时间:2015-06-01 15:08:02

标签: r

我有一个尺寸为39635 * 22的巨大矩阵。我需要计算该矩阵行的相关性。我已经检查过,矩阵中没有NA值。但是当我计算相关性时,我会在最终的相关矩阵中面对很多NA。以下是我要做的步骤:

index2<-which( is.na(Gene), arr.ind=TRUE)
> dim(index2)
[1] 0 2
W<-cor(t(Gene))
index<-which( is.na(W), arr.ind=TRUE)
dim(index)
[1] 9972018       2

任何人都知道为什么我在最终的相关矩阵中得到这么多NA?

2 个答案:

答案 0 :(得分:1)

(不一定是答案,但评论的时间太长了......)

到目前为止,我无法复制;它可以(?)可以想象是非常大的矩阵,但我先没有内存。

nafun <- function(nrows,ncols=22,
                  rfun=runif) {
    Gene <- matrix(runif(nrows*ncols),ncol=ncols)
    W <- cor(t(Gene))
    sum(which(is.na(W)))
}
set.seed(101)
nafun(1000)   ## 0
nafun(5000)   ## 0
nafun(10000)  ## 0
nafun(20000)  ## Error: cannot allocate vector of size 3.0 Gb
nafun(10000,rfun=rnorm) ## 0
nafun(15000,rfun=rnorm) ## Error: cannot allocate vector of size 858.3 Mb

您的数据集中是否可能包含非限定但不是NA的值?值得一试

summary(c(Gene))
any(is.finite(Gene))

答案 1 :(得分:1)

一种可能性是矩阵中的列是常量。这是一个示例,没有丢失数据,由于此问题而生成NA值:

(m <- rbind(1:2, c(1, 3)))
#      [,1] [,2]
# [1,]    1    2
# [2,]    1    3
cor(m)
#      [,1] [,2]
# [1,]    1   NA
# [2,]   NA    1
# Warning message:
# In cor(m) : the standard deviation is zero

您可以根据它产生的警告消息确定这是否是问题,或者您可以运行类似table(apply(t(Gene), 2, sd) == 0)的内容。