如何计算R中不同列维数矩阵之间的相关性
我有两个矩阵,行数相同,列数不同,如下所示:如何计算R中不同列维数矩阵之间的相关性,r,matrix,R,Matrix,我有两个矩阵,行数相同,列数不同,如下所示: mat1 <- matrix(rnorm(20), 4, 5) mat2 <- matrix(rnorm(12), 4, 3) 由于行数相同,我希望计算矩阵列之间的以下相关性: cor.test(mat1[,1], mat2[,1]) cor.test(mat1[,1], mat2[,2]) cor.test(mat1[,1], mat2[,3]) cor.test(mat1[,2], mat2[,1]) cor.test(m
mat1 <- matrix(rnorm(20), 4, 5)
mat2 <- matrix(rnorm(12), 4, 3)
由于行数相同,我希望计算矩阵列之间的以下相关性:
cor.test(mat1[,1], mat2[,1])
cor.test(mat1[,1], mat2[,2])
cor.test(mat1[,1], mat2[,3])
cor.test(mat1[,2], mat2[,1])
cor.test(mat1[,2], mat2[,2])
cor.test(mat1[,2], mat2[,3])
...........
...........
cor.test(mat1[,5], mat2[,3])
for(i in 1:5){
for(j in 1:3){
pv[i,j] <- cor.test(mat1[, i], mat2[ , j])$p.value
}
}
最后我想要一个矩阵x5*3或包含相关值的向量,有人能帮忙吗
我可以用它来返回p.value和estimate吗
FUN <- function(x, y) {
res <- cor.test(x, y, method="spearman", exact=F)
return(list(c = res$estimate, p = res$p.value))
}
r1 <- outer(colnames(mat1), colnames(mat2), Vectorize(function(i,j) FUN(mat1[,i], mat2[,j])$p))
r2 <- outer(colnames(mat1), colnames(mat2), Vectorize(function(i,j) FUN(mat1[,i], mat2[,j])$c))
谢谢。为什么不直接用cor函数来计算皮尔逊相关性呢
seed(1)
mat1 <- matrix(rnorm(20), 4, 5)
mat2 <- matrix(rnorm(12), 4, 3)
cor(mat1, mat2)
[,1] [,2] [,3]
[1,] 0.4406765 -0.70959590 0.10731768
[2,] -0.2566199 -0.01588993 -0.63630159
[3,] -0.9813313 0.85082165 -0.77172317
[4,] 0.6121358 -0.38564314 0.87077092
[5,] -0.6897573 0.66272015 -0.08380553
再核实一下,
> col_1 <- 3
> col_2 <- 2
# all.equal is used to compare numeric equality where `==` is discouraged
> all.equal(cor(mat1, mat2)[col_1, col_2], cor(mat1[,col_1], mat2[,col_2]))
[1] TRUE
他们是平等的 为什么不直接用cor函数来计算皮尔逊相关性呢
seed(1)
mat1 <- matrix(rnorm(20), 4, 5)
mat2 <- matrix(rnorm(12), 4, 3)
cor(mat1, mat2)
[,1] [,2] [,3]
[1,] 0.4406765 -0.70959590 0.10731768
[2,] -0.2566199 -0.01588993 -0.63630159
[3,] -0.9813313 0.85082165 -0.77172317
[4,] 0.6121358 -0.38564314 0.87077092
[5,] -0.6897573 0.66272015 -0.08380553
再核实一下,
> col_1 <- 3
> col_2 <- 2
# all.equal is used to compare numeric equality where `==` is discouraged
> all.equal(cor(mat1, mat2)[col_1, col_2], cor(mat1[,col_1], mat2[,col_2]))
[1] TRUE
他们是平等的 我想你所需要的就是先定义你的矩阵
mat_cor <- matrix(nrow=ncol(mat1), ncol=ncol(mat2))
for(i in 1:5)
{
for(j in 1:3)
{
mat_cor[i,j] <- cor.test(mat1[, i], mat2[ , j])$p.value
}
}
我想你只需要先定义你的矩阵
mat_cor <- matrix(nrow=ncol(mat1), ncol=ncol(mat2))
for(i in 1:5)
{
for(j in 1:3)
{
mat_cor[i,j] <- cor.test(mat1[, i], mat2[ , j])$p.value
}
}
我想你会不带着我去做的。对于基础材料,以下是双重应用方法:
apply(mat1, 2, function(col_mat1){
apply(mat2, 2, function(col2, col1) {
cor.test(col2, col1)$p.value
}, col1=col_mat1)
})
outter apply在mat1列上迭代,并服务于cor.test的一侧。内部的一个也会这样做,但是现在填充了cor.test的第二个面。实际上,apply正在取代for。我想您可能希望在没有for的情况下使用它。对于基础材料,以下是双重应用方法:
apply(mat1, 2, function(col_mat1){
apply(mat2, 2, function(col2, col1) {
cor.test(col2, col1)$p.value
}, col1=col_mat1)
})
outter apply在mat1列上迭代,并服务于cor.test的一侧。内部的一个也会这样做,但是现在填充了cor.test的第二个面。实际上,apply正在取代for。您可以尝试这样的方法
pv <- c()
for(i in 1:dim(mat1)[2]){
for(j in 1:dim(mat2)[2]){
pv <-c(c, cor.test(mat1[, i], mat2[ , j])$estimate)
}
}
dim(pv) <- c(dim(mat1)[2], dim(mat2)[2])
你可以试试这样的东西
pv <- c()
for(i in 1:dim(mat1)[2]){
for(j in 1:dim(mat2)[2]){
pv <-c(c, cor.test(mat1[, i], mat2[ , j])$estimate)
}
}
dim(pv) <- c(dim(mat1)[2], dim(mat2)[2])
另一种选择,在我看来比循环更容易理解:
sapply(
data.frame(mat1),
function(x) Map(function(a,b) cor.test(a,b)$p.value,
list(x),
as.data.frame(mat2))
)
结果:
# X1 X2 X3 X4 X5
#[1,] 0.7400541 0.8000358 0.5084979 0.4441933 0.9104712
#[2,] 0.2918163 0.2764817 0.956807 0.6072979 0.4395218
#[3,] 0.2866105 0.4095909 0.5648188 0.1746428 0.9125866
另一种选择,在我看来比循环更容易理解:
sapply(
data.frame(mat1),
function(x) Map(function(a,b) cor.test(a,b)$p.value,
list(x),
as.data.frame(mat2))
)
结果:
# X1 X2 X3 X4 X5
#[1,] 0.7400541 0.8000358 0.5084979 0.4441933 0.9104712
#[2,] 0.2918163 0.2764817 0.956807 0.6072979 0.4395218
#[3,] 0.2866105 0.4095909 0.5648188 0.1746428 0.9125866
我会把两者都提取出来,我没有问题。我唯一的问题是如何比较每个Column向量。我将同时提取这两个向量,我对此没有问题。我唯一的问题是如何比较每个列向量。从?cor-如果'x'和'y'是矩阵,则计算'x'列和'y'列之间的相关性。我还需要Pvalue,{cor.test}是我要看的。p.值不是相关系数。我可以轻松地用estimate替换p.value,反正我需要这两个。谢谢。请编辑您的问题,清楚地说明您需要什么。是的。从?cor-如果'x'和'y'是矩阵,则计算'x'列和'y'列之间的相关性。我还需要Pvalue,{cor.test}是我要看的。p.值不是相关系数。我可以轻松地用estimate替换p.value,反正我需要这两个。谢谢。请编辑您的问题以清楚地说明您需要什么。编辑以重命名输出矩阵这与问题底部的代码相同。@Athos这就是为什么要编写它的原因,我认为您只需要先定义您的矩阵。编辑以重命名输出矩阵这与问题底部的代码相同。@Athos这就是为什么要编写它的原因我想你只需要先定义你的矩阵。@aliocee-你已经得到了很多解决方案,为什么不使用其中一个呢?@aliocee-你已经得到了很多解决方案,为什么不使用其中一个呢?我可以同时提取“p.value”和“estimate”吗cor.testcol2,col1[[1][2]],我将如何做呢?是的,您可以,但需要一些努力来考虑输出格式。我的意思是,它将如何呈现?两个矩阵?带有p.value和estimate列的data.frame?还有其他一些库可以方便地完成这类工作。我可以同时提取“p.value”和“evaluate”吗cor.testcol2,col1[[1][2]],我将如何做呢?是的,您可以,但需要一些努力来考虑输出格式。我的意思是,它将如何呈现?两个矩阵?带有p.value和estimate列的data.frame?还有其他一些库可以很容易地完成这类工作。