R连续列之间的相关性

问题描述 投票:2回答:5

我正在尝试编写一些代码来轻松计算矩阵中所有连续列之间的相关性。

假设我有A,B,C,D,E列。

我想要成对相关AB,BC,CD,DE。

为了避免编写循环,到目前为止,我已经尝试过sapply,但是效果不是很好。

感谢您的支持。

r correlation sapply
5个回答
2
投票

您可以利用cor自动计算所有按列相关的事实:

cor(df)[cbind(2:ncol(df), 1:(ncol(df) - 1))]
# [1] -0.08727070 -0.10444715  0.06008165  0.18030921

相比于:

cor(df$a, df$b)
# [1] -0.0872707 
cor(df$b, df$c)
# [1] -0.1044471

在这里,我们计算完整的相关矩阵,然后计算子集以获得超对角线(对角线从实际对角线向上移动了一个对角线),该对角线对应于cols 1-2、2-3等的相关性。由cbind创建的矩阵,用于指定所有超对角线坐标。

这是我生成数据的方式:

set.seed(123)
df <- as.data.frame(replicate(5, runif(100), s=F))
names(df) <- letters[1:ncol(df)]

1
投票

确实没有必要重新发明轮子。 使用corrplot软件包:

require(corrplot)
data(mtcars)
M <- cor(mtcars)
corrplot(M, order ="AOE", addCoef.col="gray40")
corrplot(M, order="AOE",method="ellips", col="grey", cl.pos="n",addCoef.col="yellow")

安装软件包:

install.packages("corrplot")

在此处输入图片说明


1
投票

让我们重新发明一下,呵呵。

AAA

diag(cor(aaa [,1:(dim(aaa)[2] -1)],aaa [,2:(dim(aaa)[2])])))


1
投票

如果您想sapply

set.seed(1)
df <- data.frame(a=runif(100), b=runif(100), c=runif(100), d=runif(100))
sapply(1:(ncol(df)-1), function(x) cor(df[x], df[x+1]))
# [1] 0.017032146 0.009675918 0.103959503

1
投票

循环并不总是坏的-特别是如果您知道结果向量应该提前多少,然后将其填写。

set.seed(1)
mat <- matrix(rnorm(50), nrow=10, ncol=5)
succ.cor <- function(x){
    n <- ncol(x)
    col1 <- seq(n)[-n]
    col2 <- seq(n)[-1]
    res <- seq(col1)
    for(i in seq(res)){
        res[i] <- cor(x[,col1[i]], x[,col2[i]])
    }
    res
}

succ.cor(mat)
#[1] -0.37670337  0.60402733  0.08296412  0.34192416

这是此处介绍的某些方法之间速度的更好比较:

set.seed(1)
m=3000
n=1000

A <- as.data.frame(matrix(rnorm(m*n), m, n))

#lukeA
t1 <- Sys.time()
tmp1 <- sapply(1:(ncol(A)-1), function(x) cor(A[x], A[x+1]))
lukeA.diff <- Sys.time() - t1
lukeA.diff

#Rufo
t1 <- Sys.time()
tmp2 <- diag(cor(A[,1:(dim(A)[2]-1)], A[,2:(dim(A)[2])]))
Rufo.diff <- Sys.time() - t1
Rufo.diff

#Marc in the box
t1 <- Sys.time()
tmp3 <- succ.cor(A)
Marcinthebox.diff <- Sys.time() - t1
Marcinthebox.diff

#BrodieG
t1 <- Sys.time()
tmp4 <- cor(A)[cbind(2:ncol(A), 1:(ncol(A) - 1))]
BrodieG.diff <- Sys.time() - t1
BrodieG.diff

#Jilber (from  http://stackoverflow.com/a/18535544/1199289)
t1 <- Sys.time()
tmp5 <- mapply(cor, A[,1:(dim(A)[2]-1)], A[,2:(dim(A)[2])])
Jilber.diff <- Sys.time() - t1
Jilber.diff

绩效结果:

t(data.frame(Jilber.diff,  Marcinthebox.diff, lukeA.diff, BrodieG.diff, Rufo.diff))
Jilber.diff       "0.2349489 secs"
Marcinthebox.diff "0.2255359 secs"
lukeA.diff        "0.408231 secs" 
BrodieG.diff      "6.042533 secs" 
Rufo.diff         "12.20104 secs" 

因此看来mapply方法也很快。 lukeA和我的..

© www.soinside.com 2019 - 2024. All rights reserved.