我想计算每个物种(bac)与第二个数据框中每个因子(fac)的相关性的相关性和p值。两者均在相同数量的站点进行测量,但bac和fac的数量不匹配。
bac1 <- c(1,2,3,4,5)
bac2 <- c(2,3,4,5,1)
bac3 <- c(4,5,1,2,3)
bac4 <- c(5,1,2,3,4)
bac <- as.data.frame(cbind(bac1, bac2, bac3, bac4 ))
colnames(bac) <- c("station1", "station2", "station3", "station4")
rownames(bac) <- c("bac1", "bac2", "bac3", "bac4", "bac5")
fac1 <- c(1,2,3,4,5,6)
fac2 <- c(2,3,4,5,1,6)
fac3<- c(3,4,5,1,2,6)
fac4<- c(4,5,1,2,3, 6)
fac <- as.data.frame(cbind(fac1, fac2, fac3, fac4))
colnames(fac) <- c("station1", "station2", "station3", "station4")
rownames(fac) <- c("fac1", "fac2", "fac3", "fac4", "fac5", "fac6")
我认为结果看起来有点像这样,在某个地方让名字知道哪个组合出现了:
bac1-fac1 cor1 p1
bac1-fac2 cor2 p2
bac1-fac3 cor3 p3
bac2-fac1 corx px...
我看过Hmist的函数rcorr和来自psych的corr.test,但找不到行的必要排列的例子......有什么想法吗?
答案 0 :(得分:3)
如果您重新构建数据,以便计算成对列之间的相关性,那将非常简单。
tbac <- data.frame(t(bac))
tfac <- data.frame(t(fac))
f <- function (x, y) cor(x, y)
tab <- outer(tfac, tbac, Vectorize(f))
as.data.frame.table(tab)
我使用相同的想法得到答案:Match data and count number of same value。
答案 1 :(得分:2)
您只需将完整矩阵传递给cor
函数(或psych::corr.test
),它就可以找到相关列的相关性。
例如
cor(t(fac), t(bac))
# bac1 bac2 bac3 bac4 bac5
# fac1 0.9899495 -0.07559289 -0.60000000 -0.60000000 -0.07559289
# fac2 0.9899495 -0.07559289 -0.60000000 -0.60000000 -0.07559289
# fac3 -0.3207135 0.94285714 -0.07559289 -0.07559289 -0.48571429
# fac4 -0.8000000 -0.32071349 0.98994949 0.98994949 -0.32071349
# fac5 -0.3207135 -0.48571429 -0.07559289 -0.07559289 0.94285714
# fac6 NA NA NA NA NA
然后,您可以使用reshape2::melt
reshape2::melt(cor(t(fac), t(bac)))
# Var1 Var2 value
# 1 fac1 bac1 0.98994949
# 2 fac2 bac1 0.98994949
# 3 fac3 bac1 -0.32071349
# 4 fac4 bac1 -0.80000000
# ---
# ---
要获得p值,请使用相同的方法
test <- psych::corr.test(t(fac), t(bac), adjust="none")
像以前一样融化并加入
merge(melt(test$r, value.name="cor"), melt(test$p, value.name="p-value"), by=c("Var1", "Var2"))
# Var1 Var2 cor p-value
# 1 fac1 bac1 0.98994949 0.01005051
# 2 fac1 bac2 -0.07559289 0.92440711
# 3 fac1 bac3 -0.60000000 0.40000000
# 4 fac1 bac4 -0.60000000 0.40000000
# 5 fac1 bac5 -0.07559289 0.92440711
# 6 fac2 bac1 0.98994949 0.01005051
答案 2 :(得分:1)
我们可以使用expand.grid
获取{bac}和'fac'rownames
的组合,循环显示apply
行,将MARGIN
指定为1,根据rownames对'bac'和'fac'行进行子集化,执行corr.test
并将'p'值提取为list
library(psych)
do.call(c, apply(expand.grid(rownames(bac), rownames(fac)), 1,
function(x) list(corr.test(cbind(unlist(bac[1,]), unlist(fac[1,])))$p)))
答案 3 :(得分:1)
您可以循环遍历expand.grid
行pairs <- as.matrix(expand.grid(1:nrow(bac),1:nrow(fac)))
pairs <- cbind(pairs,NA,NA)
b <- as.matrix(bac)
f <- as.matrix(fac)
for(i in 1:nrow(pairs)){
pairs[i,3] <- cor(b[pairs[i,1],], f[pairs[i,2],])
pairs[i,4] <- cor.test(b[pairs[i,1],], f[pairs[i,2],])$p.value
}
colnames(pairs) <- c('bac','fac','corr','p')
pairs
## bac fac corr p
## [1,] 1 1 0.98994949 0.01005051
## [2,] 2 1 -0.07559289 0.92440711
## [3,] 3 1 -0.60000000 0.40000000
## [4,] 4 1 -0.60000000 0.40000000
## [5,] 5 1 -0.07559289 0.92440711
## [6,] 1 2 0.98994949 0.01005051
如果你想要名字,那么
pairs <- as.data.frame(pairs)
pairs[,1] <- sapply(pairs[,1],function(x) rownames(bac)[x])
pairs[,2] <- sapply(pairs[,2],function(x) rownames(fac)[x])
虽然在那一点上使用李哲源哲哲李的解决方案可能更容易。