r中的嵌套循环,用于将df1的列与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值

我最初创建了一个循环,允许我用第二个数据帧的单列检查第一个数据帧中的所有种类。不用说,如果我要完成这项工作,我必须重复几百次这个过程。我对df1(new6(的一列和df2(otu.table.filter(的所有列的简单循环

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的全部列进行第二列,等等

但在这里我有点迷路了,我无法在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函数(类似于我对简单循环所做的(

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

这里是一个小演示。让我们假设两个样本大小为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近似,然后第二个使用"t"近似;精确的AS 89算法";CCD_ 2。

相关内容

  • 没有找到相关文章

最新更新