5

我有一个看起来像这样的矩阵:

 1 1 1 1 1 1 1 1 1  1  1  1
 1 1 1 1 1 1 0 0 0  0  0  0
 0 0 1 1 0 0 0 0 1  1  0  0
 1 1 0 0 0 0 1 1 0  0  0  0
 0 0 1 1 0 0 0 0 0  0  0  0
 1 1 0 0 0 0 0 0 0  0  0  0

您可以看到每两列都是相同的,表示设计矩阵的“组成员身份”。现在我的问题是,如何在 R 中自动将这个秩不足矩阵(秩 = 6)转换为满秩矩阵?这种情况可能有点特殊,即我可以手动删除重复的列。我只是好奇是否有一种方法可以“更普遍地”解决问题。谢谢!

4

3 回答 3

11

我认为 R 进行 QR 分解的方式是有效的(我的意思是留下一组独立的列):

m[, qr(m)$pivot[seq_len(qr(m)$rank)]]

在来自 OP 的示例中:

m = structure(c(1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 
1L, 1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 
1L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 
0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L), .Dim = c(6L, 12L
))

m[, qr(m)$pivot[seq_len(qr(m)$rank)]]
#     [,1] [,2] [,3] [,4] [,5] [,6]
#[1,]    1    1    1    1    1    1
#[2,]    1    1    1    0    0    0
#[3,]    0    1    0    0    1    0
#[4,]    1    0    0    1    0    0
#[5,]    0    1    0    0    0    0
#[6,]    1    0    0    0    0    0
于 2013-09-30T19:01:34.787 回答
1

尝试:

X[,duplicated(cor(X))]

cor(x) 计算 x 的相关矩阵。如果两列彼此线性相关,则它们在相关矩阵中将具有相同的列

这将摆脱作为单个其他列的线性变换的列。

如果您正在寻找行缩减梯形形式,这将显示一列是否是多个其他列的线性组合,请查看此答案:

减少排梯队形式

于 2013-09-30T18:10:26.023 回答
1

如果您只想删除相同的列,您可以这样做,例如:

 t(unique(t(dat)))
     V1 V3 V5 V7 V9 V11
[1,]  1  1  1  1  1   1
[2,]  1  1  1  0  0   0
[3,]  0  1  0  0  1   0
[4,]  1  0  0  1  0   0
[5,]  0  1  0  0  0   0
[6,]  1  0  0  0  0   0
于 2013-09-30T18:36:42.897 回答