簡體   English   中英

使用Spearman按組划分R相關矩陣

[英]R correlation matrix by group using spearman

我正在嘗試通過因子變量的不同級別來創建一組相關矩陣。

先前已經回答了這個問題( R中按組的Spearman相關性 ),但不是針對矩陣的,據我所知,矢量結果似乎沒有得到概括。

下面的代碼有效,但是由於by()輸出列表,因此無法將其寫入csv-錯誤是“無法將類“” by””強制到data.frame”

cor1<- by(data, INDICES=data$factor0, FUN = function(x) cor(x[,c("x","y","z","a",
    "b","c")],method="spearman",use="pairwise"))

因此,我正在尋找一種將以上內容強制轉換為data.frame的方法,以便可以將其寫入csv,或者通過輸出數據幀的替代方法產生上述結果

任何幫助,不勝感激

之所以得到列表,是因為如果x是矩陣,那么cor(x)也將是矩陣,而不是標量。 在這種情況下,它將是6x6矩陣。 因此,結果是一個6x6矩陣的列表,每個因子級別一個。

在我看來,這是代表結果的自然方式。 您可以根據需要將其放入單個數據框中,盡管我不確定您希望行和列精確表示什么。 這是一個選擇。

data<-matrix(rnorm(500),100,5)
colnames(data)<-letters[1:5]
factors<-sample(LETTERS[1:3],100,T)
cors<-by(data,factors,cor)
cors[[1]]
#             a           b           c           d           e
# a  1.00000000  0.05389618 -0.16944040  0.25747174  0.21660217
# b  0.05389618  1.00000000  0.22735796 -0.06002965 -0.30115444
# c -0.16944040  0.22735796  1.00000000 -0.06625523 -0.01120225
# d  0.25747174 -0.06002965 -0.06625523  1.00000000  0.10402791
# e  0.21660217 -0.30115444 -0.01120225  0.10402791  1.00000000

corsMatrix<-do.call(rbind,lapply(cors,function(x)x[upper.tri(x)]))
names<-outer(colnames(data),colnames(data),paste,sep="X")
colnames(corsMatrix)<-names[upper.tri(names)]
corsMatrix

#           aXb         aXc        bXc         aXd         bXd         cXd
# A  0.05389618 -0.16944040 0.22735796  0.25747174 -0.06002965 -0.06625523
# B -0.34231682 -0.14225269 0.20881053 -0.14237661  0.25970138  0.27254840
# C  0.27199944 -0.01333377 0.06402734  0.02583126 -0.03336077 -0.02207024
#           aXe        bXe         cXe         dXe
# A 0.216602173 -0.3011544 -0.01120225  0.10402791
# B 0.347006942 -0.2207421  0.33123175 -0.05290809
# C 0.007748369 -0.1257357  0.23048709  0.16037247

我不確定這是否是您要找的東西。 另一個選擇是將每個相關矩陣導出到其自己的csv文件。

至少對我來說,您的詢問不清楚。 如果我正確理解,在計算相關性之前,可能首先需要一個成對矩陣。 您可能需要在SciencesPo嘗試以下功能。

要求( SciencesPo)

m<-rprob(mtcars, df = nrow(mtcars) - 2)

以下將使您堆疊矩陣,因此變得更容易檢查r和相關的p值。

rstack(m)

您可以從包library(plyr)使用ddply

 library(plyr)
 n <- 1e2
 mdat <- data.frame(factor0 = factor(LETTERS[sample(26, n, TRUE)]), x = rnorm(n), 
                                     y = rnorm(n), z = rnorm(n), a = rnorm(n), b = rnorm(n),
                                     c = rnorm(n))
 ddply(mdat, .(factor0), function(d) {
      ret <- as.data.frame(cor(d[, letters[c(1:3, 24:26)]], method="spearman",use="pairwise"))
      ret$col <- letters[c(1:3, 24:26)]
      ret[, c(7, 1:6)]})

暫無
暫無

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

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