具有最少同时出现的非NA值数量的矩阵的最佳子集?

问题描述

我有一个N×T数据矩阵(N >> T),其中有许多缺失的NA值。我正在寻找矩阵的最佳行子集,以便任何两行N_i和N_j将至少具有k> = 2并发(即同时发生在t时刻)的非NA值。为此,我找到该子集的最终目标是能够计算成对的相关矩阵(使用R的cor(.,use="pairwise.complete.obs")作为收缩过​​程的初始估计量。

形式上,如果X是我的原始矩阵,则让Y为矩阵,其中如果相应的X条目具有观察值,则每个条目的值为1,对于NA则为0。那么YY'将是一个N x N矩阵,用于计算非NA值的同时出现。最初,该YY'矩阵将包含0个值,指示行N_i和N_j具有0个同时出现的值。我想找到X的最大子集,以使YY'的最小值等于k = 2或3,等等。

是否有任何算法可以解决此问题,理想情况下可以在R中实现?我有一种感觉,可以将YY'矩阵视为一个图形,并且可能存在针对该问题的已知程序(古怪的发现?斯坦纳树?),但是我对该领域的知识不足...我能想到一个贪婪的迭代算法每次都删除最差的行并重新计算YY,但是希望有一个更优雅,更快速的解决方案吗?

数据的快速仿真:

set.seed(123)
X <- matrix(rnorm(200*20),200,20)
X[sample(1:(200*20),200*20/2)] <- NA
Y <- 1*!is.na(X)
YY <- tcrossprod(Y)
YY[1:3,1:3]
#>      [,1] [,2] [,3]
#> [1,]    9    6    3
#> [2,]    6   10    4
#> [3,]    3    4   11
min(YY)
#> [1] 0

reprex package(v0.3.0)于2020-09-28创建

解决方法

不幸的是,这个问题很难解决。给定一个具有n个顶点和m个边的图,我们可以减少在顶点边缘入射矩阵(k重复的列)上以k = 1的情况下找到解决该问题的最大集团的问题。

我会以明显的方式扭转这种情况,并将这个问题减少到最大程度。

图形的顶点对应于行。如果相应的行具有足够的非NA并发值,则两个顶点之间会有一条边。要找到最大集团,您可以拨出igraph R package

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...