Ответ 1
Первой стратегией может быть уменьшение аргумента допуска. Полагает, что 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) )