【问题标题】:cor() heatmap that also takes into account lag?cor() 热图也考虑了滞后?
【发布时间】:2021-03-30 01:51:19
【问题描述】:

我有这个数据框:

> 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。我该怎么做?

【问题讨论】:

  • 你能澄清/确认一下吗?你想计算每对列的 lag-1 互相关(例如)cor(calcium[-1,1], calcium[-nrow(calcium),2])(即第一列和第二列之间的 lag-1 互相关?(或等效地ccf(calcium[,1],calcium[,2],lag.max=1)$acf[3,1,1])?我不'不认为会有一个内置的解决方案,我认为你必须自己循环对列。到目前为止你尝试了什么......?
  • 是的,我想在每对列之间进行互相关,最大滞后为 1。似乎 ``` ccf(calcium[,1],calcium[,2],lag .max=1)$acf[3,1,1]``` 可能是这样,但我不明白$acf[3,1,1] 位?你能解释一下吗?另外,如果出现循环,在这种情况下我该怎么办?我知道for 循环,但只是基础知识,我不确定在这种情况下如何引用这两列。谢谢

标签: r correlation cross-correlation


【解决方案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 滞后结果。

【讨论】:

  • 谢谢,这行得通,你解释得很好!我想知道,是否有一种方法可以进行这种滞后 1 互相关,然后只选择提供更高相关性的滞后?例如:``` > ccfccf ccfccf 系列“X”的自相关,滞后 -1 0 1 0.279 0.723 0.266 ```并选择 0.723,因为它是 ±1 范围内的最高值。我在想这样的函数:``` max_CCF
  • ..this 确实返回了最大 corr 值,但我想知道如何使用它来构建合适的矩阵?我所说的类似于您使用heatmap() 得到的内容,但使用±1 滞后范围并仅为最终相关矩阵选择最高值。
  • 您在这些 cmets 中建议的代码似乎很合理,您可以在上面的 for 循环中替换,即 cmat[i,j] &lt;- max_CCF(calcium[,i],calcium[,j]) ... ?如果这对您不起作用,您可以尝试发布后续问题...
猜你喜欢
  • 2021-12-30
  • 1970-01-01
  • 2018-12-16
  • 2017-06-26
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
相关资源
最近更新 更多