Как использовать функцию princomp() в R, когда ковариационная матрица имеет нуль?

При использовании функции princomp() в R возникает следующая ошибка: "covariance matrix is not non-negative definite".

Я думаю, что это связано с тем, что некоторые значения равны нулю (фактически близкие к нулю, но при округлении равны нулю) в ковариационной матрице.

Есть ли необходимость работать с PCA, когда матрица ковариации содержит нули?

[FYI: получение ковариационной матрицы является промежуточным шагом в вызове princomp(). Файл данных для воспроизведения этой ошибки можно загрузить здесь - http://tinyurl.com/6rtxrc3]

Ответ 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) )