r 中的嵌套循环将 df1 的列与 df2 的列相关联

nested loop in r to correlate columns of df1 to columns of df2

我有两个数据集,其中包含来自不同物种组的丰度数据。列是物种,行是地点。两个数据集之间的站点(行)相同,我要做的是将第一个数据集的列与第二个数据集的列相关联,以查看是否存在正相关或负相关。

library(Hmisc)
rcorr(otu.table.filter$sp1,new6$spA, type="spearman"))$P
rcorr(otu.table.filter$sp1,new6$spA, type="spearman"))$r

第一个会给出 sp1 和 spA 之间关系的 p 值,第二个会给出 r 值

我最初创建了一个循环,允许我使用第二个数据帧的单个列检查第一个数据帧的所有物种。不用说,如果我要完成这项工作,我将不得不重复这个过程几百次。 我针对 df2(otu.table.filter)

的所有列对 df1(new6) 的一列进行简单循环
pvalues = list() 
for(i in 1:ncol(otu.table.filter)) {      
pvalues[[i]] <-(rcorr(otu.table.filter[ , i], new6$Total, type="spearman"))$P
}
rvalues = list()
for(i in 1:ncol(otu.table.filter)) {     
rvalues[[i]] <-(rcorr(otu.table.filter[ , i], new6$Total, type="spearman"))$r
}
p<-NULL
for(i in 1:length(pvalues)){
tmp <-print(pvalues[[i]][2])
p <- rbind(p, tmp)
}
r<-NULL
for(i in 1:length(rvalues)){
tmp <-print(rvalues[[i]][2])
r <- rbind(r, tmp)
}

fdr<-as.matrix(p.adjust(p, method = "fdr", n = length(p)))
sprman<-cbind(r,p,fdr) 

并以上述为起点,我尝试创建一个嵌套循环,每次都会检查 df1 的一列与 df2 的所有列,然后它会针对 df2 的所有列继续 df1 的第二列等等等等

但在这里我有点迷茫,我无法在 r

中找到解决方案的答案

我假设 pvalues 输出应该是

的列表
pvalues[[i]][[j]]

和类似的右值输出

rvalues[[i]][[j]]

但我有点迷茫,我尝试时不知道该怎么做

pvalues = list()
rvalues = list()
for (j in 1:7){
for(i in 1:ncol(otu.table.filter)) {    
pvalues[[i]][[j]] <-(rcorr(otu.table.filter[ , i], new7[,j], type="spearman"))$P
}
for(i in 1:ncol(otu.table.filter)) {    
rvalues[[i]][[j]] <-(rcorr(otu.table.filter[ , i], new7[,j], type="spearman"))$r
}
}

但我无法让它工作,因为我不确定如何在列表中定向输出,然后如果有人可以帮助我完成下一部分,我将不胜感激,这将是为每次比较提取 p 和r 值并应用 fdr 函数(类似于我对简单循环所做的)

here 是我的两个数据帧的子集

这是一个小演示。假设样本大小为 n 的两个矩阵 x 和 y。然后相关性和近似 p 值可以估计为:

n <- 100
x <- matrix(rnorm(10 * n), nrow = n)
y <- matrix(rnorm(5 * n), nrow = n)

## correlation matrix
r <- cor(x, y, method = "spearman")

## p-values
pval <- function(r, n) 2 * (1 - pt(abs(r)/sqrt((1 - r^2)/(n - 2)), n - 2))
pval(r, n)

## for comparison
cor.test(x[,1], y[,1], method = "spearman", exact = FALSE)

可以在此处找到更多详细信息:https://stats.stackexchange.com/questions/312216/spearman-correlation-significancy-test

编辑

最后是 cor.test 的循环:

## for comparison
p <- matrix(NA, nrow = ncol(x), ncol=ncol(y))
for (i in 1:ncol(x)) {
  for (j in 1:ncol(y)) {
    p[i, j] <- cor.test(x[,i], y[,j], method = "spearman")$p.value    
  }
}

p

值略有不同,因为第一个使用 t 近似,第二个使用 cor.test 的“精确 AS 89 算法”。