Анализ PCA с использованием матрицы корреляции в качестве входных данных в R

Теперь у меня есть матрица корреляции 7000 * 7000, и мне нужно сделать PCA для нее в R. Я использовал

CorPCA <- princomp(covmat=xCor)

, xCor — корреляционная матрица, но она выходит

"ковариационная матрица не является неотрицательно определенной"

это потому, что у меня есть некоторая отрицательная корреляция в этой матрице. Мне интересно, какую встроенную функцию в R я могу использовать для получения результата PCA


r pca
person Louisyan    schedule 17.02.2014    source источник
comment
Выполнение PCA корреляционной матрицы кажется странной идеей. Я не думаю, что вы должны делать это.   -  person Roland    schedule 17.02.2014
comment
На stats.stackexchange.com есть обсуждение этой проблемы.   -  person Georg Schnabel    schedule 17.02.2014
comment
Вы можете использовать prcomp(), который использует SVD, вместо princomp(), который использует собственные значения ковариационной матрицы.   -  person Carlos AG    schedule 19.08.2018


Ответы (2)


not non-negative definite не означает, что ковариационная матрица имеет отрицательную корреляцию. Это линейный алгебраический эквивалент попытки извлечь квадратный корень из отрицательного числа! Вы не можете сказать, взглянув на несколько значений матрицы, является ли она положительно определенной.

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

Альтернативой является написание собственного кода для выполнения так называемого анализа NIPLAS. Взгляните на эту ветку в списке рассылки R: https://stat.ethz.ch/pipermail/r-help/2006-July/110035.html

Я бы даже спросил, где вы взяли корреляционную матрицу? Вы его сами построили? Есть ли у него NA? Если вы построили xCor из своих собственных данных, как вы думаете, сможете ли вы выбрать данные и построить матрицу xCor меньшего размера? (скажем 1000х1000). Все эти альтернативы пытаются провести ваш алгоритм PCA по «счастливому пути» (т. Е. Все матричные операции могут выполняться внутри без проблем с диагонализацией и т. Д., Т. Е. Больше никаких «неотрицательно определенных сообщений об ошибках»)

person Sudeep Juvekar    schedule 17.02.2014
comment
спасибо за ответ, я думаю, что понял ошибку, которую я сделал. ну, корреляционная матрица является результатом какой-то внутренней модели, я не могу получить необработанные данные... и 7000 * 7000 довольно сложно анализировать. Сейчас я изо всех сил пытаюсь получить что-то из этой матрицы :( ну... ничего пока ... я думаю, что это должны быть некоторые методы уменьшения размерности, PCA - это всего лишь один подход, я также пробую факторный анализ в R. Однако результат все еще не так хорош. - person Louisyan; 17.02.2014

Один из методов проведения PCA – выполнить разложение ковариационной матрицы по собственным значениям, см. википедию. .

Преимущество разложения по собственным значениям заключается в том, что вы видите, какие направления (собственные векторы) являются значимыми, то есть имеют заметное изменение, выраженное соответствующими собственными значениями. Более того, вы можете определить, является ли ковариационная матрица положительно определенной (все собственные значения больше нуля), а не отрицательно определенной (что нормально), если есть собственные значения, равные нулю, или она неопределенна (что не нормально) отрицательными собственными значениями. Иногда также случается, что из-за числовых неточностей неотрицательно определенная матрица становится отрицательно определенной. В этом случае вы увидите отрицательные собственные значения, которые почти равны нулю. В этом случае вы можете установить эти собственные значения равными нулю, чтобы сохранить неотрицательную определенность ковариационной матрицы. Кроме того, вы все еще можете интерпретировать результат: собственные векторы, дающие важную информацию, связаны с самыми большими собственными значениями. Если список отсортированных собственных значений быстро сокращается, существует множество направлений, которые не вносят существенного вклада и, следовательно, могут быть отброшены.

Встроенная функция R: eigen

Если ваша ковариационная матрица равна A, то

eigen_res <- eigen(A)
# sorted list of eigenvalues
eigen_res$values
# slightly negative eigenvalues, set them to small positive value
eigen_res$values[eigen_res$values<0] <- 1e-10
# and produce regularized covariance matrix
Areg <- eigen_res$vectors %*% diag(eigen_res$values) %*% t(eigen_res$vectors)
person Georg Schnabel    schedule 17.02.2014
comment
спасибо за ответ! Я думаю, что это способ, который определенно нужно попробовать. Во-первых, я должен проверить собственное значение, чтобы увидеть, как выглядят значения :) - person Louisyan; 17.02.2014
comment
ну, я обнаружил, что у меня есть много комплексных чисел в собственном значении ... так что мне нужно также изменить их на ноль? - person Louisyan; 17.02.2014
comment
Если ваша ковариационная матрица симметрична (а она должна быть симметричной!) с математической точки зрения, вы должны получить только действительные собственные значения. Вы можете проверить симметрию, например. макс(А-т(А)). Однако, если у него должен быть шанс быть действительной ковариационной матрицей, мнимые части комплексных чисел должны быть небольшими (я думаю, не уверен на 100%). - person Georg Schnabel; 17.02.2014
comment
да, я проверил, что матрица симметрична. а комплексное число очень маленькое..вы правы :) может из-за большого масштаба матрицы.. - person Louisyan; 17.02.2014
comment
Небольшое дополнительное замечание: если вы знаете, что матрица симметрична, вы можете установить symmetric=TRUE в вызове на eigen, чтобы ускорить вычисление и убрать комплексные числа. - person Georg Schnabel; 17.02.2014
comment
Используйте функцию NearPD() пакета Matrix!! - person Carlos AG; 19.08.2018