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, когато ковариационната матрица има нули?

Алтернатива е да напишете някакъв свой собствен код, за да извършите това, което се нарича n NIPLAS анализ. Разгледайте тази тема в списъка с R-поща: https://stat.ethz.ch/pipermail/r-help/2006-July/110035.html

Дори бих стигнал дотам, че да попитам откъде взехте корелационната матрица? Сам ли го конструирахте? Има ли NAs? Ако сте конструирали xCor от вашите собствени данни, мислите ли, че можете да вземете проби от данните и да конструирате по-малка xCor матрица? (да речем 1000X1000). Всички тези алтернативи се опитват да прокарат вашия PCA алгоритъм през „щастливия път“ (т.е. всички матрични операции могат да се извършват вътрешно без затруднения при диагонализация и т.н., т.е. няма повече „неотрицателни съобщения за определена грешка“)

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

Един метод за извършване на PCA е да се извърши декомпозиция по собствена стойност на ковариационната матрица, вижте wikipedia .

Предимството на разлагането на собствените стойности е, че виждате кои посоки (собствени вектори) са значими, т.е. имат забележима вариация, изразена чрез свързаните собствени стойности. Освен това можете да откриете дали ковариационната матрица е положително определена (всички собствени стойности са по-големи от нула), не е отрицателно определена (което е добре), ако има собствени стойности, равни на нула, или ако е неопределена (което не е добре) чрез отрицателни собствени стойности. Понякога се случва също така, че поради числени неточности неотрицателно определена матрица става отрицателно определена. В този случай бихте наблюдавали отрицателни собствени стойности, които са почти нула. В този случай можете да зададете тези собствени стойности на нула, за да запазите неотрицателната определеност на ковариационната матрица. Освен това, вие все още можете да интерпретирате резултата: собствените вектори, допринасящи със значимата информация, са свързани с най-големите собствени стойности. Ако списъкът от сортирани собствени стойности намалява бързо, има много посоки, които не допринасят значително и следователно могат да бъдат премахнати.

Вградената 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
Ако ковариационната ви матрица е симетрична (и трябва да е симетрична!) от математическа гледна точка, трябва да получите само реални собствени стойности. Можете да проверите симетрията, като напр. max(A-t(A)). Ако обаче трябва да има шанс да бъде валидна ковариационна матрица, имагинерните части на комплексните числа трябва да са малки (предполагам, не съм 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