如何从R的2xN信号的第2列创建NxM Corr矩阵?

时间:2016-10-30 11:56:57

标签: r matrix

我在files中有2x N量的1D信号,其中列1是信号1,列2是信号2。 代码1是关于1x N量的1D信号的简化示例,而代码2是具有两个伪代码的实际目标:

  1. 创建二维向量(files[[i]] = i,i+1) - 每行只有两个整数数据单元,用逗号分隔,
  2. 然后稍后访问数据(tcrossprod( files[[]][, 2], files[[]][, 2] )),我无法引用所有信号的所有第2列
  3. 简化代码1按预期工作

    ## Example with 1D vector in Single column
    N <- 7
    files <- vector("list", N)
    # Make a list of two column data
    for (i in 1:N) {
        files[[i]] = i
    }
    
    str(files)
    
    # http://stackoverflow.com/a/40323768/54964
    tcrossprod( files, files )
    

    代码2是伪代码,但目标是

    ## Example with 2x1D vectors in two columns
    N <- 7
    files <- vector("list", N)
    # Make a list of two column data
    for (i in 1:N) { 
        files[[i]] = i,i+1 # PSEUDOCODE 
    }
    
    str(files)
    
    # access one signal single columns by files[[1]][,1] and files[[1]][,2]
    tcrossprod( files[[]][, 2], files[[]][, 2] ) # PSEUDOCODE
    

    假设向量1维度为Nx1,向量1为1xM。 例如,files[[1]][,2]为信号2列2访问的每个单元包含1D信号。 通过trossprod多次列出第2列的所有此类信号,您应该得到预期的结果:NxM矩阵。

    数学描述

    数据:两列的列表,其中第一列是1D信号;第二列是改进的1D信号。我想在矩阵中将这些改进的1D信号进行比较。 预期产出

       cor      Improved 1 Improved 2 ...
    Improved 1  1          0.55 
    Improved 2  0.111      1
    ...
    

    我不依赖于任何特定的R数据结构。

    列和单元格只是我对数据单元中项目的描述。所以不准确,因为我是R的新手。

    在我的系统中输出tchakravarty的图形代码,其中您看到x轴是正确的但不是y轴

    enter image description here

    操作系统:Debian 8.5
    R:3.1.1

1 个答案:

答案 0 :(得分:1)

我仍然不确定您的问题,因此我将首先尝试确保您考虑的数据结构。

我创建了一个长度为M(= 100)的列表,其中每个元素的N x 2矩阵(其中N = 1000)代表2D信号。

library(dplyr)
library(ggplot2)

N = 1000
li_matrices = setNames(
  lapply(paste("Improved", 1:100), function(x) matrix(rnorm(N*2), nrow = N, ncol = 2, byrow = TRUE)),
  paste("Improved", 1:100))

> str(li_matrices, list.len = 5, max.level = 1)
List of 100
 $ Improved 1  : num [1:1000, 1:2] 0.228 -0.44 0.713 -0.118 -0.918 ...
 $ Improved 2  : num [1:1000, 1:2] 0.928 0.362 -0.105 -0.1 0.165 ...
 $ Improved 3  : num [1:1000, 1:2] 0.0881 -0.1466 1.8549 -0.3376 -1.1626 ...
 $ Improved 4  : num [1:1000, 1:2] 0.0575 -0.7809 0.4221 0.5378 -0.7882 ...
 $ Improved 5  : num [1:1000, 1:2] 0.6739 1.4515 -0.0704 -0.1596 0.2157 ...
  [list output truncated]

然后,我从M个列表元素中的每一个中提取了信号的第二维,并计算了它们在M个重复中的相关性。

> cor(sapply(li_matrices, function(x) x[, 2]))
                Improved 1    Improved 2    Improved 3    Improved 4    Improved 5    Improved 6    Improved 7
Improved 1    1.0000000000 -0.0181724914  0.0307864778 -0.0235266506  0.0681155904 -0.0654758679 -0.0416660418
Improved 2   -0.0181724914  1.0000000000  0.0837086793 -0.0310760562  0.0035757641 -0.0303866471 -0.0345608009
Improved 3    0.0307864778  0.0837086793  1.0000000000 -0.0093528744  0.0282039040 -0.0525328267  0.0410787784
Improved 4   -0.0235266506 -0.0310760562 -0.0093528744  1.0000000000 -0.0139707732 -0.0145970712 -0.0022037703
Improved 5    0.0681155904  0.0035757641  0.0282039040 -0.0139707732  1.0000000000 -0.0406468255  0.0381800143
Improved 6   -0.0654758679 -0.0303866471 -0.0525328267 -0.0145970712 -0.0406468255  1.0000000000 -0.0534592829
Improved 7   -0.0416660418 -0.0345608009  0.0410787784 -0.0022037703  0.0381800143 -0.0534592829  1.0000000000
Improved 8   -0.0320972342 -0.0344929079 -0.0204718584 -0.0007383034  0.0223386392 -0.0361548831  0.0090484961
Improved 9    0.0068743021 -0.0109232340  0.0071627901  0.0102613137  0.0265829001 -0.0443782611  0.0266421500
Improved 10  -0.0228804070 -0.0163596866  0.0066448268  0.0137962914  0.0357421845  0.0403325013 -0.0391002841

编辑:

以下是OP要求的绘图代码:

m_corr = cor(sapply(li_matrices, function(x) x[, 2])) 

    m_corr %>% 
  as.data.frame() %>% 
  rownames_to_column(var = "Var1") %>% 
  as_data_frame() %>% 
  gather(key = Var2, value = Value, -Var1) %>% 
  ggplot(
    aes(
      x = reorder(Var1, as.numeric(gsub("Improved ", "", Var1))), 
      y = reorder(Var2, as.numeric(gsub("Improved ", "", Var2))), 
      fill = Value
    )
  ) + 
  geom_tile() + 
  theme_bw() + 
  theme(
    axis.text.x = element_text(angle = 90, size = 5, hjust = 1),
    axis.text.y = element_text(size = 5)
  ) + 
  xlab("Variable 1") + 
  ylab("Variable 2")

这给出了:

enter image description here