Первая стратегия может заключаться в уменьшении аргумента терпимости. Мне кажется, что princomp
не будет передавать аргумент толерантности, но prcomp
принимает аргумент 'tol'. Если неэффективно, это должно идентифицировать векторы, которые имеют почти нулевую ковариацию:
nr0=0.001
which(abs(cov(M)) < nr0, arr.ind=TRUE)
И это идентифицирует векторы с отрицательными собственными значениями:
which(eigen(M)$values < 0)
Использование примера h9 на странице справки (qr):
> which(abs(cov(h9)) < .001, arr.ind=TRUE)
row col
[1,] 9 4
[2,] 8 5
[3,] 9 5
[4,] 7 6
[5,] 8 6
[6,] 9 6
[7,] 6 7
[8,] 7 7
[9,] 8 7
[10,] 9 7
[11,] 5 8
[12,] 6 8
[13,] 7 8
[14,] 8 8
[15,] 9 8
[16,] 4 9
[17,] 5 9
[18,] 6 9
[19,] 7 9
[20,] 8 9
[21,] 9 9
> qr(h9[-9,-9])$rank
[1] 7 # rank deficient, at least at the default tolerance
> qr(h9[-(8:9),-(8:9)])$ take out only the vector with the most dependencies
[1] 6 #Still rank deficient
> qr(h9[-(7:9),-(7:9)])$rank
[1] 6
Другим подходом может быть использование функции alias
:
alias( lm( rnorm(NROW(dfrm)) ~ dfrm) )