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

计算相关性-cor()-仅限列的子集

  •  44
  • wishihadabettername  · 技术社区  · 15 年前

    我有一个数据框架,想计算 correlation (对于Spearman,数据是分类和排名的),但仅限于列的一个子集。我试过了,但是R cor ()函数只接受数字数据(错误消息称x必须是数字),即使使用了spearman。

    一种残忍的方法是从数据帧中删除非数字列。这并不是很优雅,因为速度我仍然不想计算 全部的 柱。

    我希望有一种方法可以简单地说“计算x、y、z列的相关性”。列引用可以按数字或名称。我想提供它们的灵活方法是通过向量。

    如有任何建议,我们将不胜感激。

    3 回复  |  直到 9 年前
        1
  •  59
  •   Greg    15 年前

    如果您有一个数据帧,其中一些列是数字的,而另一些列是其他的(字符或因子),并且您只想对数字列进行相关性,那么可以执行以下操作:

    set.seed(10)
    
    x = as.data.frame(matrix(rnorm(100), ncol = 10))
    x$L1 = letters[1:10]
    x$L2 = letters[11:20]
    
    cor(x)
    
    Error in cor(x) : 'x' must be numeric
    

    但是

    cor(x[sapply(x, is.numeric)])
    
                 V1         V2          V3          V4          V5          V6          V7
    V1   1.00000000  0.3025766 -0.22473884 -0.72468776  0.18890578  0.14466161  0.05325308
    V2   0.30257657  1.0000000 -0.27871430 -0.29075170  0.16095258  0.10538468 -0.15008158
    V3  -0.22473884 -0.2787143  1.00000000 -0.22644156  0.07276013 -0.35725182 -0.05859479
    V4  -0.72468776 -0.2907517 -0.22644156  1.00000000 -0.19305921  0.16948333 -0.01025698
    V5   0.18890578  0.1609526  0.07276013 -0.19305921  1.00000000  0.07339531 -0.31837954
    V6   0.14466161  0.1053847 -0.35725182  0.16948333  0.07339531  1.00000000  0.02514081
    V7   0.05325308 -0.1500816 -0.05859479 -0.01025698 -0.31837954  0.02514081  1.00000000
    V8   0.44705527  0.1698571  0.39970105 -0.42461411  0.63951574  0.23065830 -0.28967977
    V9   0.21006372 -0.4418132 -0.18623823 -0.25272860  0.15921890  0.36182579 -0.18437981
    V10  0.02326108  0.4618036 -0.25205899 -0.05117037  0.02408278  0.47630138 -0.38592733
                  V8           V9         V10
    V1   0.447055266  0.210063724  0.02326108
    V2   0.169857120 -0.441813231  0.46180357
    V3   0.399701054 -0.186238233 -0.25205899
    V4  -0.424614107 -0.252728595 -0.05117037
    V5   0.639515737  0.159218895  0.02408278
    V6   0.230658298  0.361825786  0.47630138
    V7  -0.289679766 -0.184379813 -0.38592733
    V8   1.000000000  0.001023392  0.11436143
    V9   0.001023392  1.000000000  0.15301699
    V10  0.114361431  0.153016985  1.00000000
    
        2
  •  15
  •   Joris Meys    15 年前

    对于数值数据,你有解决方案。但这是绝对数据,你说。然后生活变得更加复杂…

    首先,两个分类变量之间的关联度不是用斯皮尔曼秩相关来衡量的,而是用卡方检验来衡量的。实际上这是逻辑。排名意味着你的数据有一定的顺序。现在告诉我哪个更大,黄色还是红色?我知道,有时R的确在分类数据上执行斯皮尔曼秩相关。如果我将黄色1和红色2编码,r会认为红色大于黄色。

    所以,忘记斯皮尔曼的分类数据。我将演示chisq测试以及如何使用combn()选择列。但是你会从更多的时间里受益于Agresti的书: http://www.amazon.com/Categorical-Analysis-Wiley-Probability-Statistics/dp/0471360937

    set.seed(1234)
    X <- rep(c("A","B"),20)
    Y <- sample(c("C","D"),40,replace=T)
    
    table(X,Y)
    chisq.test(table(X,Y),correct=F)
    # I don't use Yates continuity correction
    
    #Let's make a matrix with tons of columns
    
    Data <- as.data.frame(
              matrix(
                sample(letters[1:3],2000,replace=T),
                ncol=25
              )
            )
    
    # You want to select which columns to use
    columns <- c(3,7,11,24)
    vars <- names(Data)[columns]
    
    # say you need to know which ones are associated with each other.
    out <-  apply( combn(columns,2),2,function(x){
              chisq.test(table(Data[,x[1]],Data[,x[2]]),correct=F)$p.value
            })
    
    out <- cbind(as.data.frame(t(combn(vars,2))),out)
    

    然后你应该得到:

    > out
       V1  V2       out
    1  V3  V7 0.8116733
    2  V3 V11 0.1096903
    3  V3 V24 0.1653670
    4  V7 V11 0.3629871
    5  V7 V24 0.4947797
    6 V11 V24 0.7259321
    

    其中v1和v2表示它在哪些变量之间移动,“out”表示关联的p值。这里所有的变量都是独立的。正如我随机创建的数据一样,这是您所期望的。

        3
  •  2
  •   wishihadabettername    15 年前

    我找到了一个更简单的方法,通过查看crash生成的r脚本。如下所示:

    correlations <- cor(mydata[,c(1,3,5:87,89:90,94:98)], use="pairwise", method="spearman")
    
    推荐文章