【问题标题】:how to generate grouping variable based on correlation?如何根据相关性生成分组变量?
【发布时间】:2016-07-29 07:21:55
【问题描述】:
 library(magrittr)
 library(dplyr)
 V1 <- c("A","A","A","A","A","A","B","B","B","B", "B","B","C","C","C","C","C","C","D","D","D","D","D","D","E","E","E","E","E","E")
 V2 <- c("A","B","C","D","E","F","A","B","C","D","E","F","A","B","C","D","E","F","A","B","C","D","E","F","A","B","C","D","E","F")
 cor <- c(1,0.8,NA,NA,NA,NA,0.8,1,NA,NA,NA,NA,NA,NA,1,0.8,NA,NA,NA,NA,0.8,1,NA,NA,NA,NA,NA,NA,1,0.9)


 df <- data.frame(V1,V2,cor)

 # exclude rows where cor=NA
 df <- df[complete.cases(df)==TRUE,]

这是完整的数据框,cor=NA代表小于0.8的相关性

 df

   V1 V2 cor
1   A  A 1.0
2   A  B 0.8
7   B  A 0.8
8   B  B 1.0
15  C  C 1.0
16  C  D 0.8
21  D  C 0.8
22  D  D 1.0
29  E  E 1.0
30  E  F 0.9

在上面的df中,F不在V1中,表示F不感兴趣

所以在这里我删除了 V2=F 的行(更一般地说,V2 等于不在 V1 中的值)

 V1.LIST <- unique(df$V1)
 df.gp <- df[which(df$V2 %in% V1.LIST),]

 df.gp

   V1 V2 cor
1   A  A 1.0
2   A  B 0.8
7   B  A 0.8
8   B  B 1.0
15  C  C 1.0
16  C  D 0.8
21  D  C 0.8
22  D  D 1.0
29  E  E 1.0

所以现在,df.gp 是我需要处理的数据集

我在 V2 中删除了未使用的级别(在示例中为 F)

 df.gp$V2 <- droplevels(df.gp$V2)

我不想排除自相关变量,以防某些 V1 与其他变量不相关,我想将它们中的每一个放在一个单独的组中

看cor,A和B是相关的,C和D是相关的,E自己属于一个组。

因此,这里的例子应该有三组。

【问题讨论】:

  • 鉴于您没有显示任何相关系数,这是否有意义。对于A - CB - CA - D 等...?
  • 您的意思不是>.8,而不是>=.8,否则它们都在同一个组中?而且不是所有变量都必然与自身完美相关吗?
  • 实际上我可以证明这一点,但真正的数据集是从遗传变异网站下载的,通常我只对相关系数>= 0.8 的那些对感兴趣。在样本数据框中,A和B在同一组,C和D在同一组。 A-C、A-D、B-C、B-D 之间无相关性 (>=0.8)。
  • 您可以尝试查看hclust/cutree,例如here——例如cutree(hclust(1 - as.dist(xtabs(cor ~ V1 + V2, df))), h = 0.8)
  • 我编辑了我的答案以反映我对您问题的解释

标签: r grouping correlation


【解决方案1】:

在我看来,将数据直接放入data.frame 可能会使事情变得复杂。我冒昧地将其转换回矩阵。

library(reshape2)
cormat <- as.matrix(dcast(data = df,formula = V1~V2))[,-1]
row.names(cormat) <- colnames(cormat)[-length(colnames(cormat))]
cormat

获得相关矩阵后,很容易看出哪些索引或非 NA 值与其他变量共享。

a <- apply(cormat, 1, function(x) which(!is.na(x)))
a <- data.frame(t(a))
a$var <- row.names(a)
row.names(a) <- NULL
a

  X1 X2 var
1  1  2   A
2  1  2   B
3  3  4   C
4  3  4   D
5  5  6   E

现在X1X2 确定您的唯一分组。

由 cyrusjan 编辑:

假设我们已经选择了cor &gt;= a 中的行,上面的脚本是一个可能的解决方案,其中a 是上述问题中取为0.8 的阈值。

由 alexis_laz 供稿:

通过使用cutreehclust,我们可以将脚本中的阈值(即h=0.8)设置为打击。

 cor.gp <- data.frame(cor.gp =
      cutree(hclust(1 - as.dist(xtabs(cor ~ V1 + V2, df.gp))), h = 0.8))

【讨论】:

  • 谢谢。但是,如果我实际上有三个或更多组,这似乎效果不佳
  • 您能否使用一个数据示例来编辑您的问题,该数据示例最低限度地代表您自己的数据,并且您能否评论哪些问题运行得不好。如果您是根据切割数值变量 cor 来分配组,您如何先验地知道这些组?
  • 我已经修改了我的问题和示例。谢谢你的建议。
猜你喜欢
  • 2015-07-20
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-28
  • 2015-02-27
  • 1970-01-01
  • 2019-07-29
相关资源
最近更新 更多