簡體   English   中英

R連續列之間的相關性

[英]R Correlation between successive columns

我正在嘗試編寫一些代碼來輕松計算矩陣中所有連續列之間的相關性。

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

我想要成對相關AB,BC,CD,DE。

為了避免編寫循環,到目前為止,我已經嘗試過sapply,但是效果不是很好。

感謝您的支持。

您可以利用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)]

確實沒有必要重新發明輪子。 使用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")

在此處輸入圖片說明

讓我們重新發明一下,呵呵。

AAA <-data.frame(A = runif(10)中,b = runif(10)中,c = runif(10)中,d = runif(10)中,e = runif(10))

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

如果您想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

循環並不總是壞的-特別是如果您知道結果向量應該提前多少,然后將其填寫。

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和我的..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM