从矩阵中提取最大的独立列集

时间:2013-09-30 17:51:16

标签: r matrix

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

 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

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

3 个答案:

答案 0 :(得分:8)

我认为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

答案 1 :(得分:1)

尝试:

X[,duplicated(cor(X))]

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

中具有相同的列

这将删除作为单个其他列的线性转换的列。

如果你正在寻找行减少的梯队形式,它会显示一个列是否是多个其他列的线性组合,请查看以下答案:

Reduced row echelon form

答案 2 :(得分: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