我有一个看起来像这样的矩阵:
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中的全秩矩阵自动?这种情况可能有点特殊,即我可以手动删除重复的列。我只是好奇是否有一种方法能够“更普遍地”解决问题。谢谢!
答案 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的相关矩阵。如果两列彼此线性相关,则它们在相关矩阵
中具有相同的列这将删除作为单个其他列的线性转换的列。
如果你正在寻找行减少的梯队形式,它会显示一个列是否是多个其他列的线性组合,请查看以下答案:
答案 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