我正在使用cor.prob()函数,该函数已在邮件列表周围多次发布,以获得相关矩阵(下对角线)和p值(上对角线):
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
Run Code Online (Sandbox Code Playgroud)
如何将上述相关矩阵(下半部分的相关性,上半部分的p值)折叠成四列矩阵:两个指标,相关性和p值?例如:
i j cor pval
x y .88 .048
x z -.79 .107
y z -.97 0.0035
Run Code Online (Sandbox Code Playgroud)
我已经看到了上一个问题的答案,但这只会给我一个3列矩阵,而不是一个四列矩阵,其中p值和相关性分别为列.
任何帮助表示赞赏!
Chr*_*isW 11
好吧,它不是一个矩阵,因为你不能混合字符和数字.但:
这是我的第一次尝试(在你的标签交换之前):
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])
Run Code Online (Sandbox Code Playgroud)
现在应用我建议的修正,你得到
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])
Run Code Online (Sandbox Code Playgroud)
最后你的标签交换,使用row()/ col(),并将其写为函数:
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])
}
Run Code Online (Sandbox Code Playgroud)
然后
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
Run Code Online (Sandbox Code Playgroud)
如果不是这个,你能解释一下你的期望吗?
| 归档时间: |
|
| 查看次数: |
3295 次 |
| 最近记录: |