【问题标题】:How to identify dissimilar subsets of binary variables in R?如何识别 R 中二进制变量的不同子集?
【发布时间】:2018-02-27 21:21:32
【问题描述】:

感谢您阅读我的帖子。我有一个二进制矩阵(0,1),其中变量在列中,实例在行中。我试图通过总结每行中的元素来计算实例(行)的分数。但是,我希望独立地为每一行应用一个相异子集,其中我只对非冗余变量求和。对于几个变量 X 和 Y,我使用的相似性是

sim= |intersect(X,Y)| / | unity(X,Y)|

例如,如果row (i) 有 6 个正值(来自 6 个不同的变量),但有 2 对的相似度高于 0.8,则修正后的分数将为 4,而不是 6,其中每个冗余对中的一个变量被删除。

我知道我可以进行通用数据缩减以删除高度相关的变量,但就我而言,由于数据稀疏,我更喜欢保留它们,然后对每一行应用相似性校正。已经计算了平方相似度矩阵,我如何遍历行来纠正总和? 谢谢。

【问题讨论】:

  • 谢谢@Uwe Plonus

标签: r


【解决方案1】:

如果我正确理解你的问题,那么你可以这样做。

首先,我将创建一个可重现的示例。我们将制作一个 5 列 10 行的矩阵:

set.seed(42)
m <- matrix(rbinom(5*10, 1, .5), nrow=10)
m
#>       [,1] [,2] [,3] [,4] [,5]
#>  [1,]    1    0    1    1    0
#>  [2,]    1    1    0    1    0
#>  [3,]    0    1    1    0    0
#>  [4,]    1    0    1    1    1
#>  [5,]    1    0    0    0    0
#>  [6,]    1    1    1    1    1
#>  [7,]    1    1    0    0    1
#>  [8,]    0    0    1    0    1
#>  [9,]    1    0    0    1    1
#> [10,]    1    1    1    1    1

你说你已经有了相似度度量矩阵,这里我只是使用相关性来演示:

sim <- cor(m)
diag(sim) <- 0

您有一些相似性阈值,高于该阈值时您想从总和中排除观察结果。由于相似性是在列级别测量的,因此您要排除的列对于所有行都是相同的——我们只需要弄清楚我们要删除哪些列。我们可以通过检查哪些观察值大于阈值(这里我使用 0.5)然后通过沿列求和将相似度矩阵折叠为向量来做到这一点。

sim <- sim>.5

cols_to_keep <- as.numeric(colSums(sim)==0)
cols_to_keep
#> [1] 0 1 1 0 1

我们现在有一个向量,0 表示太相似的列,1 表示“唯一”列。由于您要求和的行是二进制向量,因此每行的总和同时省略相似的行只是每个矩阵行和列相似性的二进制向量的内积。这使计算变得快速而简单:

apply(m, 1, function(r){r%*%cols_to_keep})
#>  [1] 1 1 2 2 0 3 2 2 1 3

如您所见,第一行是 [1 0 1 1 0],我们只想保留第 2,3 列的求和,第 5 列是向量 [。 0 1 。 0],因此我们返回的总和为 1。

【讨论】:

    猜你喜欢
    • 2023-01-24
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多