我有一个尺寸为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?
答案 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)
的内容。