2012-08-24 30 views
3

我使用在邮件列表中多次发布的cor.prob()函数来获得相关矩阵(较低对角线)和p - 值(上对角线):在R中将矩阵平展到四列(索引和上/下三角形)

cor.prob <- function (X, dfr = nrow(X) - 2) { 
    R <- cor(X) 
    above <- row(R) < col(R) 
    r2 <- R[above]^2 
    Fstat <- r2 * dfr/(1 - r2) 
    R[above] <- 1 - pf(Fstat, 1, dfr) 
    R[row(R) == col(R)] <- NA 
    R 
} 

d <- data.frame(x=1:5, y=c(10,16,8,60,80), z=c(10,9,12,2,1)) 

cor.prob(d) 

> cor.prob(d) 
      x   y   z 
x   NA 0.04856042 0.107654038 
y 0.8807155   NA 0.003523594 
z -0.7953560 -0.97945703   NA 

如何会崩溃上述相关矩阵(与在上半部下半部,p值的相关性)向四列的矩阵:两个索引,所述相关性和p值?例如: -

i j cor pval 
x y .88 .048 
x z -.79 .107 
y z -.97 0.0035 

我见过the answer to the previous question like this,但只会给我一个3列的矩阵,而不是一个四列矩阵的p值和相关单独的列。

任何帮助表示赞赏!

+0

为了清楚起见,我刚编辑。我想将cor.prob()的输出合并到一个四列表中,其中两列用于索引,一列用于相关性(位于原始矩阵的较低对角线上),一列用于p-值(位于原始矩阵的上半部分)。 –

回答

10

好吧,它不是一个矩阵,因为你不能混合字符和数字。但是:

这是我第一次尝试(您的标签交换前):

m <- cor.prob(d) 
ut <- upper.tri(m) 
lt <- lower.tri(m) 
d <- data.frame(i=rep(row.names(m),ncol(m))[as.vector(ut)], 
      j=rep(colnames(m),each=nrow(m))[as.vector(ut)], 
      cor=m[ut], 
      p=m[lt]) 

现在申请我以下建议的修正,你会得到

d <- data.frame(i=rep(row.names(m),ncol(m))[as.vector(ut)], 
      j=rep(colnames(m),each=nrow(m))[as.vector(ut)], 
      cor=m[ut], 
      p=t(m)[ut]) 

最后你的标签交换,使用行( )/列(),并把它写入作为一个函数:

f1 <- function(m) { 
    ut <- upper.tri(m) 
    data.frame(i = rownames(m)[row(m)[ut]], 
      j = rownames(m)[col(m)[ut]], 
      cor=t(m)[ut], 
      p=tm[ut]) 
} 

然后

m<-matrix(1:25,5,dimnames=list(letters[1:5],letters[1:5]) 
> m 
    a b c d e 
a 1 6 11 16 21 
b 2 7 12 17 22 
c 3 8 13 18 23 
d 4 9 14 19 24 
e 5 10 15 20 25 

> f1(m) 
    i j cor p 
1 a b 6 2 
2 a c 11 3 
3 b c 12 8 
4 a d 16 4 
5 b d 17 9 
6 c d 18 14 
7 a e 21 5 
8 b e 22 10 
9 c e 23 15 
10 d e 24 20 

如果不是这样,你能解释一下吗?

+0

+1智能,做得好:) – hhh

+0

是的,做得很好。除了cor/p中的开关ut/lt(相关性越低,p越高)。我会编辑。 –

+0

@StephenTurner请预览ChrisW的评论:“最后一行应该是'p = t(m)[ut]' 或者它不会推广到> 3行/列。他无法评论显然。 – hhh

3
cd <- cor.prob(d) 
dcd <- as.data.frame(which(row(cd) < col(cd), arr.ind=TRUE)) 
dcd$pval <- cd[row(cd) < col(cd)] 
dcd$cor <- cd[row(cd) > col(cd)] 
dcd[[2]] <-dimnames(cd)[[2]][dcd$col] 
dcd[[1]] <-dimnames(cd)[[2]][dcd$row] 
dcd 
#-------------------- 
    row col  pval  cor 
1 x y 0.048560420 0.8807155 
2 x z 0.107654038 -0.7953560 
3 y z 0.003523594 -0.9794570 
相关问题