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

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

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

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

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

1 Ответ

9 голосов
/ 19 декабря 2011

Первая стратегия может заключаться в уменьшении аргумента терпимости. Мне кажется, что 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) )
...