cor() 热图也考虑了滞后?

cor() heatmap that also takes into account lag?

我有这个数据框:

> head(calcium)
     Cell 1    Cell 2     Cell 3    Cell 4    Cell 5    Cell 6    Cell 7    Cell 8    Cell 9   Cell 10
1 0.4672073 0.5844194 0.53550783 0.5364516 0.3470978 0.2802241 0.3965193 0.4651296 0.4871049 0.5685573
2 0.6724369 0.5549080 0.46405108 0.5231966 0.3634458 0.4480713 0.4991682 0.5315563 0.5486042 0.5294624
3 0.4596055 0.4670149 0.49120023 0.4395472 0.2961227 0.2931165 0.3343016 0.3347550 0.5988327 0.3738076
4 0.5033532 0.6265054 0.38094926 0.5931815 0.4030199 0.3461845 0.4966594 0.5039769 0.6795089 0.4875191
5 0.2544972 0.3734030 0.06739901 0.2006546 0.1038821 0.2315288 0.1704387 0.1001154 0.3799489 0.3224333
    Cell 11   Cell 12   Cell 13   Cell 14   Cell 15    Cell 16   Cell 17   Cell 18   Cell 19   Cell 20
1 0.6870339 0.6695488 0.6130446 0.5356461 0.6609977 0.58372848 0.5422807 0.5344803 0.6320900 0.6294263
2 0.5734583 0.6547612 0.5392496 0.5330794 0.5704163 0.29659694 0.5567181 0.5780661 0.4010656 0.5863210
3 0.3404278 0.4653025 0.4841558 0.4371394 0.4779519 0.37612878 0.5571457 0.4525741 0.3330830 0.6095697
4 0.5570465 0.5552679 0.5799134 0.5745080 0.5390752 0.44927465 0.5118969 0.5618096 0.4442722 0.5840596
5 0.2730119 0.2671422 0.1901299 0.2949408 0.2715825 0.03302615 0.2712914 0.2962793 0.2137080 0.3243795

> tail(calcium)
        Cell 1    Cell 2    Cell 3    Cell 4    Cell 5    Cell 6    Cell 7    Cell 8    Cell 9   Cell 10
1495 0.4740832 0.5869490 0.5582463 0.6920769 0.5148404 0.4017368 0.6079173 0.7788185 0.8114776 0.7092727
1496 0.6341606 0.5733480 0.4622866 0.6170735 0.3884858 0.3778201 0.5342382 0.6239193 0.5823868 0.6487626
1497 0.3662752 0.4143892 0.2904592 0.4388380 0.2732026 0.4264538 0.4004278 0.4336887 0.3919094 0.4598705
1498 0.4719526 0.5387774 0.4595078 0.4988954 0.4979742 0.3102995 0.5260781 0.5331988 0.6804864 0.6189913
1499 0.4194409 0.5404455 0.4455472 0.5634257 0.4054463 0.4645974 0.4627777 0.5951874 0.4545299 0.6653680
       Cell 11   Cell 12   Cell 13   Cell 14   Cell 15   Cell 16   Cell 17   Cell 18   Cell 19   Cell 20
1495 0.6556259 0.7681060 0.7380664 0.7464327 0.5121680 0.6313292 0.6928669 0.7497219 0.5277792 0.7770823
1496 0.4813021 0.6268656 0.5539104 0.5806629 0.3948412 0.3627633 0.5811911 0.6131842 0.3701380 0.6591560
1497 0.3969300 0.5247286 0.4840403 0.4693218 0.4129616 0.3213437 0.5072689 0.5465302 0.2863405 0.4979315
1498 0.4925699 0.5820069 0.6174026 0.5797521 0.4415087 0.3831081 0.6320489 0.6061551 0.5626544 0.7134859
1499 0.4026728 0.5014044 0.5536220 0.5139246 0.4354147 0.3987318 0.5499019 0.5411839 0.4232987 0.5824049

我想得到一个互相关矩阵,就像我得到的那样:

library(gplots)
Colors=c("blue","yellow","red")
Colors=colorRampPalette(Colors)(100)
heatmap.2(as.matrix(cor(calcium)), dendrogram = "none",
          col = Colors, trace = "none", density.info =  "none")

但这一次,我希望它考虑延迟 1。我该怎么做?

组成示例数据:

nc <- 20
calcium <- matrix(rnorm(nc^2), nc, nc)

遍历整个矩阵(CCF(i,j,1) 与 CCF(j,i,1) 不同,所以我们需要计算整个矩阵,而不是一半),计算相关矩阵:

cmat <- matrix(NA,nc,nc)
for (i in 1:nc) {
   for (j in 1:nc) {
      cmat[i,j] <- cor(calcium[-1,i], calcium[-nrow(calcium),j])
      ## or: ccf(calcium[,i],calcium[,j],lag.max=1)$acf[3,1,1]
   }
}

然后在绘图代码中使用 cmat 代替 cor(calcium)


有(至少)两种方法可以计算CCF(i,j,1)

  • cor(x[-1,i], x[-nrow(x),j]) 手动设置列的滞后版本(通过排除一列的第一个元素和另一列的最后一个元素)
  • ccf(x[,i],x[,j],lag.max=1)$acf[3,1,1] 使用内置的 ccf() 函数。结果在列表的 $acf 元素中返回,这是一个 (lag)x1x1 数组,其中第一个维度包含滞后范围。当 lag.max=1 计算滞后 -1、0、1 的互相关时,因此第三个元素是 +1 滞后结果。