R 包corrplot
除其他内容外,还包含这个漂亮的功能
cor.mtest <- function(mat, conf.level = 0.95){
mat <- as.matrix(mat)
n <- ncol(mat)
p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
diag(p.mat) <- 0
diag(lowCI.mat) <- diag(uppCI.mat) <- 1
for(i in 1:(n-1)){
for(j in (i+1):n){
tmp <- cor.test(mat[,i], mat[,j], conf.level = conf.level)
p.mat[i,j] <- p.mat[j,i] <- tmp$p.value
lowCI.mat[i,j] <- lowCI.mat[j,i] <- tmp$conf.int[1]
uppCI.mat[i,j] <- uppCI.mat[j,i] <- tmp$conf.int[2]
}
}
return(list(p.mat, lowCI.mat, uppCI.mat))
}
计算变量之间成对相关性的 p 值和置信区间x_1,...,x_n
, given N
的观察n
变量。该函数在输入中接受一个数字矩阵,并返回一个list
其 3 个元素为 3nxn
对称矩阵:这就是为什么,在嵌套矩阵内for
循环中,仅计算 3 个矩阵的上对角线部分。例子:
res1 <- cor.mtest(mtcars,0.95)
> str(res1)
List of 3
$ : num [1:11, 1:11] 0.00 6.11e-10 9.38e-10 1.79e-07 1.78e-05 ...
$ : num [1:11, 1:11] 1 -0.926 -0.923 -0.885 0.436 ...
$ : num [1:11, 1:11] 1 -0.716 -0.708 -0.586 0.832 ...
我认为(我可能是错的)for
循环在 R 中不是很惯用:我看到很多代码,人们用map
函数族来自purr
, 或者apply
函数族来自base
。我想消除这两个for
具有此类函数式编程函数的循环。你能告诉我该怎么做吗?