【问题标题】:R correlation matrix by group using spearman使用 spearman 分组的 R 相关矩阵
【发布时间】:2015-02-10 02:01:07
【问题描述】:

我正在尝试通过因子变量的不同级别创建一组相关矩阵。

这个问题之前已经回答过 (spearman correlation by group in R),但不是针对矩阵,据我所知,向量结果似乎没有概括。

下面的代码有效,但不能写入 csv,因为 by() 输出一个列表 - 错误是“无法将类“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,或者通过输出数据帧的替代方法产生上述结果

非常感谢任何帮助

【问题讨论】:

  • 请提供dput(cor1)

标签: r correlation coercion


【解决方案1】:

你得到一个列表的原因是因为如果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 文件中。

【讨论】:

  • 这是一个好点,最好作为矩阵列表。问题是我想把这些矩阵放到 Excel 中。是否可以将列表中的元素强制转换为数据框?然后,我将拥有(对于因子的 3 个级别)三个数据帧,并且可以将每个数据帧写入 csv
  • 您不需要将它们强制转换为数据框。您可以将矩阵直接写入 csv。如write.csv(cors[[1]],"temp.csv")。只需循环 by 的输出即可。
【解决方案2】:

您可以使用包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)]})

【讨论】:

    【解决方案3】:

    你的问题不是很清楚,至少对我来说是这样。如果我理解正确,您可能需要在计算相关性之前先有一个成对矩阵。 您可能想在SciencesPo 中尝试以下功能。

    要求(SciencesPo)

    m&lt;-rprob(mtcars, df = nrow(mtcars) - 2)

    下面会为你堆叠矩阵,所以检查 r 和相关的 p 值变得更容易。

    rstack(m)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2022-09-27
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2018-11-04
      • 2019-04-15
      • 2018-03-15
      相关资源
      最近更新 更多