代码之家  ›  专栏  ›  技术社区  ›  Thai

组合对的相关性

  •  5
  • Thai  · 技术社区  · 7 年前

    我是说。。。不是这样的

        v1  v2  v3  v4
    v1  1   x   x   x
    v2  x   1   x   x
    v3  x   x   1   x
    v4  x   x   x   1
    

    但就像这样:

    var1  var2 cor
    v1    v2   x
    v1    v3   x
    v1    v4   x
    v2    v3   x
    v2    v4   x
    v3    v4   x
    

    我是R的新手,我已经做了很多研究,我最终得到了一个代码,说真的,根本没有效率。。。我的代码创建了一个巨大的数据帧,其中包含22个变量的所有可能组合(即4194304个组合)。。。 ) ... 然后代码只为前211行分配相关性,这是只有2个变量的组合。。。然后我排除了所有我不感兴趣的东西。好我得到了我需要的。但我相信这是一个非常愚蠢的方式来做这件事,我想学习一个更好的方式。。。 有什么提示吗?

    我的代码:

    #Getting the variable names from the data frame
    av_variables<-variable.names(data.1)
    
    #Creating a huge data frame for all possible combinations
    corr_combinations <- as.data.frame(matrix(1,0,length(av_variables)))
    for (i in 1:length(av_variables)){
      corr_combinations.i <- t(combn(av_variables,i))
      corr_combinations.new <- as.data.frame(matrix(1,length(corr_combinations.i[,1]),length(av_variables)))
      corr_combinations.new[,1:i] <- corr_combinations.i
      corr_combinations <- rbind(corr_combinations,corr_combinations.new)
    
    #How many combinations for 0:2 variables?
    comb_par_var<-choose(20, k=0:2)
    ##211
    
    #A new column to recieve the values
    corr_combinations$cor <- 0
    
    
      #Getting the correlations and assigning to the empty column
     for (i in (length(av_variables)+1):(length(av_variables)+ sum(comb_par_var) +1)){
      print(i/length(corr_combinations[,1]))
      corr_combinations$cor[i] <- max(as.dist(abs(cor(data.1[,as.character(corr_combinations[i,which(corr_combinations[i,]!=0&corr_combinations[i,]!=1)])]))))
      # combinations$cor[i] <- max(as.dist(abs(cor(data.0[,as.character(combinations[i,combinations[i,]!=0&combinations[i,]!=1])]))))
      }
    
    #Keeping only the rows with the combinations of 2 variables
    corr_combinations[1:(length(av_variables)+ sum(comb_par_var) +2),21]
    corr_combinations<-corr_combinations[1:212,]
    corr_combinations<-corr_combinations[21:210,]
    
    #Keeping only the columns var1, var2 and cor
    corr_combinations<-corr_combinations[,c(1,2,21)]
    
    #Ordering to keep only the pairs with correlation >0.95, 
    #which was my purpose the whole time
    corr_combinations <- corr_combinations[order(corr_combinations$cor),]
    corr_combinations<-corr_combinations[corr_combinations$cor >0.95, ] 
    }
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   user20650    7 年前

    您可以一次性计算完整的相关矩阵。然后你只需要重塑。举个例子,

    cr <- cor(mtcars)
    # This is to remove redundancy as upper correlation matrix == lower 
    cr[upper.tri(cr, diag=TRUE)] <- NA
    reshape2::melt(cr, na.rm=TRUE, value.name="cor")
    
        2
  •  4
  •   lmo    7 年前

    一种基于R的替代方法是在与一起的行/列名上使用矩阵子集 combn

    # get pairwise combination of variable names
    vars <- t(combn(colnames(myMat), 2))
    
    # build data.frame with matrix subsetting
    data.frame(vars, myMat[vars])
      X1 X2 myMat.vars.
    1 V1 V2   0.8500071
    2 V1 V3  -0.2828288
    3 V1 V4  -0.2867921
    4 V2 V3  -0.2698210
    5 V2 V4  -0.2273411
    6 V3 V4   0.9962044
    

    您也可以使用在一行中添加列名 setNames .

    setNames(data.frame(vars, myMat[vars]), c("var1", "var2", "corr"))
    

    数据

    set.seed(1234)
    myMat <- cor(matrix(rnorm(16), 4, dimnames=list(paste0("V", 1:4), paste0("V", 1:4))))
    myMat
               V1         V2         V3         V4
    V1  1.0000000  0.8500071 -0.2828288 -0.2867921
    V2  0.8500071  1.0000000 -0.2698210 -0.2273411
    V3 -0.2828288 -0.2698210  1.0000000  0.9962044
    V4 -0.2867921 -0.2273411  0.9962044  1.0000000
    
        3
  •  1
  •   Russell Shepherd    7 年前

    您可以使用 tidyr

    第一 create a correlation matrix

    > d <- data.frame(x1=rnorm(10),
    +                 x2=rnorm(10),
    +                 x3=rnorm(10))
    > x <- cor(d) # get correlations (returns matrix)
    > x
               x1         x2         x3
    x1  1.0000000  0.3096685 -0.5358578
    x2  0.3096685  1.0000000 -0.7497212
    x3 -0.5358578 -0.7497212  1.0000000
    

    然后,使用tidyr重塑:

    > y <- as.data.frame(x)
    > y$var1 <- row.names(y)
    > library(tidyr)
    > gather(data = y, key = "var2", value = "correlation", -var1)
      var1 var2 correlation
    1   x1   x1   1.0000000
    2   x2   x1   0.3096685
    3   x3   x1  -0.5358578
    4   x1   x2   0.3096685
    5   x2   x2   1.0000000
    6   x3   x2  -0.7497212
    7   x1   x3  -0.5358578
    8   x2   x3  -0.7497212
    9   x3   x3   1.0000000