随时间绘制相关矩阵

机器算法验证 相关性 数据可视化
2022-03-14 08:22:51

根据您的经验,您对表示随时间变化的相关矩阵有什么建议吗?我查看了https://quant.stackexchange.com/questions/1565/how-do-i-graphically-represent-the-evolution-of-a-covariance-matrix-over-time,但我找不到任何好文章。我问这个问题是因为我对数据分析领域还很陌生,到目前为止我读过的唯一一本书是 Wickham 的ggplot2. 所以,我想请教专家。

我真诚地感谢任何帮助。

2个回答

这里有很多问题(你是否使用ggplot2让我觉得完全与它们正交)。首先,认识到相关性不一定以直观的“线性”方式扩展(很大程度上是因为它们的可能范围是有限的)。值得考虑如何表示这些值。例如,您可以使用:

  1. 原始相关性( -scores)r
  2. 决定系数 ( )r2
  3. z - 基于Fisher 的“ ”转换rz结果的分数:
    zr=.5ln(1+r1r)

我对你的情况一无所知,所以我很难说,但我的默认设置是使用转换后的分数()。 zr

接下来,您需要决定要包含哪些数据(完全,或或多或少突出)。例如,您是想包括值的绝对大小,还是只包括它们的变化(参见水平与经济变化)?您主要关心变化的幅度(即绝对值),是增加还是减少(绝对意义上的符号,或接近或远离无相关性的符号),或两者兼而有之?

鉴于您想要可视化一个相关矩阵(即一组相关),值得记住的是它们不会是独立的。考虑到只有一个变量的变化会对多重相关性产生影响,即使其他变量随时间保持不变。同样,这取决于这对您是否重要。

换句话说,弄清楚你真正关心的是什么是至关重要的。不会有可以捕捉所有这些方面的可视化。


从您的评论中,我猜您将只有两个相关矩阵,之前和之后。这简化了事情。同样,在没有关于您的情况、数据或目标的任何信息的情况下,我可能会制作一个散点图,X 轴为 before 和 after,,表示相同相关性的两个点由一条线连接部分。考虑这个用 R 编码的例子: zr

library(MASS)   # we'll use these packages
library(psych)
set.seed(541)   # this makes the example exactly reproducible
bef = mvrnorm(100, mu=rep(0, 5), Sigma=rbind(c(1.0, 0.0, 0.0, 0.0, 0.0),
                                             c(0.0, 1.0, 0.4, 0.0, 0.5),
                                             c(0.0, 0.4, 1.0, 0.1, 0.0),
                                             c(0.0, 0.0, 0.1, 1.0, 0.8),
                                             c(0.0, 0.5, 0.0, 0.8, 1.0) ))
aft = mvrnorm(100, mu=rep(0, 5), Sigma=rbind(c(1.0, 0.0, 0.0, 0.0, 0.0),
                                             c(0.0, 1.0, 0.4, 0.0, 0.5),
                                             c(0.0, 0.4, 1.0, 0.1, 0.0),
                                             c(0.0, 0.0, 0.1, 1.0, 0.8),
                                             c(0.0, 0.5, 0.0, 0.8, 1.0) ))
aft[,5] = rnorm(100)  # above I generate data 2x from the same population, 
b.c = cor(bef)        #  here I change just 1 variable
a.c = cor(aft)        # then I make cor matrices, & extract the rs into a vector
b.v = b.c[upper.tri(b.c)]
a.v = a.c[upper.tri(a.c)]
d   = stack(list(bef=b.v, aft=a.v))
d$ind = relevel(d$ind, ref="bef")
windows(width=7, height=4)
  layout(matrix(1:2, nrow=1))
  plot(as.numeric(d$ind), fisherz(d$values), main="Fisher's z",
       axes=F, xlab="time", ylab=expression(z [r]), xlim=c(.5,2.5))
  box()
  axis(side=1, at=1:2, labels=c("before","after"))
  axis(side=2, at=seq(-.2,1.5, by=.2), cex.axis=.8, las=1)
  for(i in 1:10){ lines(1:2, matrix(fisherz(d$values), nrow=10, ncol=2)[i,]) }

  plot(as.numeric(d$ind), d$values, main="Raw rs",
       axes=F, xlab="time", ylab="r", xlim=c(.5,2.5))
  box()
  axis(side=1, at=1:2, labels=c("before","after"))
  axis(side=2, at=seq(-.2,1.0, by=.2), cex.axis=.8, las=1)
  for(i in 1:10){ lines(1:2, matrix(d$values, nrow=10, ncol=2)[i,]) }; rm(i)

fdif       = abs(fisherz(a.c)-fisherz(b.c))
diag(fdif) = 0
windows()
  image(1:5, 1:5, z=fdif, 
        xlab="", ylab="", col=gray.colors(8)[8:3])
  for(i in 1:5){ for(j in 1:5){ text(i,j,round(fdif,2)[i,j]) }}

在此处输入图像描述

上图显示了相关性的水平和变化量。您可以看到各种特征,例如向收敛。的区别在于r预先分布得更均匀。例如,之间的距离相同另一方面,对于,相关性接近r=0zrrr0.4.4.8zr0聚集在一起,并且强相关性与其余部分相去甚远。这些数字没有捕捉到的是这些线的非独立性。您可以在下面的热图中(使用中差异的绝对值)看到较大的变化与变量 5 相关联。 zr

在此处输入图像描述


更新:@whuber 详细介绍了一种基于新论文(截至 2020 年 6 月 2 日)比较协方差矩阵的方法:Diagnostic plot for evaluation homogeneity of variance-covariance matrices

在我看来,最好量化参数变化的影响(局部相关性的代理)而不是尝试视觉,因为视觉比较的尝试可能非​​常主观你的问题类似于“我如何测试我的参数是否模型随时间变化”。我所做的是对 Chow 测试进行编程,以确定参数在哪个时间点具有最大的差异。发现这一点可以直接检验重要性,可能会得出“早期数据”应该被搁置的结论。