【问题标题】:Correlation matrix in R from paired columns and coefficients来自成对列和系数的 R 中的相关矩阵
【发布时间】:2017-05-23 08:13:25
【问题描述】:

我有一个包含三个变量的数据框:a、b、c。数据集中的前两列是所有可能组合的两个变量的配对,第三列是它们之间的相关性。如下图所示。

> var1 <- c("a","a","b")
> var2 <- c("b","c","c")
> r <- c(.55,.25,.75)
> as.data.frame(cbind(var1,var2,r))
  var1 var2    r
1    a    b  0.55
2    a    c  0.25
3    b    c  0.75

我的问题是是否可以将包含相关性的数据框转换为 R 中的相关性矩阵对象?我还想使用一些 R 的绘图和绘图功能。

最终我想要的是一个看起来像这样的矩阵

  a    b    c
a 1   .55  .25

b .55  1   .25

c .25  .75  .75

【问题讨论】:

  • xtabs(r ~ ., data=data.frame(var1,var2,r)) 可能会接近,具体取决于您想要什么。如果你能澄清我可以调整这样的答案。
  • 很抱歉给您带来了困惑,感谢您的帮助。这很接近,我最终想要的是a b c a 1 .55 .25 b .55 1 .75 c .25 .75 1
  • 因为我无法让它在 cmets 中工作,所以我在主要问题中添加了我想要针对的矩阵的图片。
  • @Jean1213 您提供的矩阵包含一些错误值(错别字?),例如,cor(c,c) 应该是 1 而不是 0.75。

标签: r matrix correlation


【解决方案1】:

显然,您有相关矩阵的上三角和下三角部分(由r 提供),并且您不需要 data.frame 来实现您的目的。为元素为 1 的矩阵提供上下三角形就足够了。

var <- unique(c(var1,var2))
corr <- matrix(1,nrow=length(r),ncol=length(r)) # a matrix with 1s
corr[lower.tri(corr,diag = FALSE)] <- r # lower triangular matrix to be r
corr[upper.tri(corr,diag = FALSE)] <- r # upper triangular matrix to be r 
corr <- as.data.frame(corr) # formatting
row.names(corr) <- var # row names
colnames(corr) <- var # column names

corrplot 有一个函数corrplot 非常适合绘制具有不同选项的相关矩阵(参见参数method)。这是一个例子:

library(corrplot)
corrplot(as.matrix(corr),method="circle")

【讨论】:

    【解决方案2】:

    试试这个:

    vars <- unique(c(var1, var2))
    df <- cbind.data.frame(var1,var2,r)
    cor.df <- expand.grid(vars, vars)
    cor.df <- rbind(merge(cor.df, df, by.x=c('Var1', 'Var2'), by.y=c('var1', 'var2')),
                    merge(cor.df, df, by.x=c('Var2', 'Var1'), by.y=c('var1', 'var2')),
                    data.frame(Var1=vars, Var2=vars, r=1))
    library(reshape2)
    cor.mat <- dcast(cor.df, Var1~Var2, value.var='r')
    rownames(cor.mat) <- cor.mat[,1]
    cor.mat <- as.matrix(cor.mat[-1])
    cor.mat
    #      a    b    c
    # a 1.00 0.55 0.25
    # b 0.55 1.00 0.75
    # c 0.25 0.75 1.00
    
    # plot the correlation matrix
    library(ggplot2)
    ggplot(data = cor.df, aes(x=Var1, y=Var2, fill=r)) + 
      geom_tile()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多