R语言 如何使用combn的输出找到超过50%的变量相关性中超过阈值的相关性数量?

knsnq2tg  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(123)

我有一个很大的 Dataframe ,我使用combn来获得每对变量之间的唯一组合。因此输出如下(只有7个变量的小例子)。我的问题是,我希望确定哪些特征的相关性超过50%超过0.5;然而,combn的输出具有在两列中出现的变量。例如,从下面的Var 2总共出现5次(Variable_list1中出现4次,Variable_list2中出现一次),但是Var 1在Variable_list1中出现7次。

structure(list(Variable_list1 = c("Var1", "Var1", "Var1", "Var1", 
 "Var1", "Var1", "Var1", "Var2", "Var2", "Var2", "Var2", "Var3", 
"Var3", "Var3", "Var3", "Var3", "Var4", "Var4", "Var4", "Var4", 
"Var5", "Var5", "Var5", "Var6", "Var6", "Var7"), Variable_list2 =     c("Var2", 
  "Var3", "Var4", "Var5", "Var6", "Var7", "Var8", "Var4", "Var5", 
 "Var6", "Var7", "Var4", "Var5", "Var6", "Var7", "Var8", "Var5", 
  "Var6", "Var7", "Var8", "Var6", "Var7", "Var8", "Var7", "Var8", 
 "Var8"), Coefficient = c("0.771428571428571", "0.839285714285714", 
 "0.839285714285714", "0.807142857142857", "0.775",      "0.807142857142857", 
 "0.739285714285714", "0.964285714285714", "0.982142857142857", 
 "0.935714285714286", "0.953571428571429", "0.925",     "0.946428571428571", 
"0.957142857142857", "0.975", "0.921428571428571", "0.985714285714286", 
"0.921428571428571", "0.935714285714286", "0.964285714285714", 
 "0.932142857142857", "0.957142857142857", "0.978571428571428", 
 "0.982142857142857", "0.95", "0.960714285714286")), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 7L, 9L, 10L, 11L, 12L, 14L, 15L, 16L, 17L, 
18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 27L, 28L), class =     "data.frame")

我不知道如何处理这个问题(我知道你可以使用排列来获得完整的组合列表,其中该特征在Variable_list1中以相同的数字出现,但我无论如何都会删除一些行,因此无论该特征在列表1和2中以不同的数字出现)。
我会用table(data$Variable_list1)和表(data$Variable_list2)并查看每个特征出现的次数,考虑每个列唯一的变量以及变量在两者中出现的位置。但是,我如何将此作为新列引入到上面的结果数据框架中,然后计算哪些特征在其相关性超过50%时超过相关系数阈值,其中每个特征具有不同数量的总相关性?
任何建议将不胜感激。
EDIT:一种潜在的(低效的)方法。
1.将超过阈值的相关性分段出来,2)对变量在两列变量中出现的次数进行计数并保存,3)将其与这些特征具有的总相关性的数量合并并获得百分比,4)保持特征〉50%

hc2pp10m

hc2pp10m1#

您可以创建一个唯一的vars字符向量,然后在该向量上使用lapply()(即对于vars中的每个v,返回一个布尔值,指示Variable_list1Variable_list2列中具有v的行的集合是否具有满足您的标准的系数数量:

library(data.table)
setDT(df)
vars = unique(union(df$Variable_list1, df$Variable_list2))
vars[sapply(vars, \(v) df[Variable_list1==v | Variable_list2==v, sum(Coefficient>.5)/.N > .5])]

输出:

[1] "Var1" "Var2" "Var3" "Var4" "Var5" "Var6" "Var7" "Var8"

(In在这种情况下,所有变量都满足您的条件,因此它们都将返回)
另一种设置方法是通过一个helper函数,该函数返回一个包含所需信息的单行数据框,给出df和变量名;然后使用bind_rows()vars的每个值上的结果绑定在一起:

library(dplyr)

f <- function(df,v) {
  df %>%
    filter(Variable_list1 == v | Variable_list2==v) %>% 
    reframe(correlations = n(), prop_gt_threshold = sum(Coefficient>0.5)/n()) %>% 
    mutate(variable = v)
}

bind_rows(lapply(vars, \(v) f(df, v)))

输出:

correlations prop_gt_threshold variable
1            7                 1     Var1
2            5                 1     Var2
3            6                 1     Var3
4            7                 1     Var4
5            7                 1     Var5
6            7                 1     Var6
7            7                 1     Var7
8            6                 1     Var8

相关问题