Ошибка Princomp в R: ковариационная матрица не является неотрицательно определенной
У меня есть этот скрипт, который выполняет простой анализ PCA по числу переменных и в конце присоединяет две координаты и два других столбца (присутствие, NZ_Field) к выходному файлу. Я делал это много раз, но теперь это дает мне эту ошибку:
Я понимаю, что это означает, что есть отрицательные собственные значения. Я посмотрел на похожие посты, которые предлагают использовать na.omit, но это не сработало. Я загрузил файл "biodata.Rdata" здесь:
ковариационная матрица не неотрицательно определена
https://www.dropbox.com/s/1ex2z72lilxe16l/biodata.rdata?dl=0
Я уверен, что это не из-за пропущенных значений в данных, потому что я использовал одни и те же данные с разными столбцами "присутствие" и "NZ_Field".
Любая помощь высоко ценится.
load("biodata.rdata")
#save data separately
coords=biodata[,1:2]
biovars=biodata[,3:21]
presence=biodata[,22]
NZ_Field=biodata[,23]
#Do PCA
bpc=princomp(biovars ,cor=TRUE)
#re-attach data with auxiliary data..coordinates, presence and NZ location data
PCresults=cbind(coords, bpc$scores[,1:3], presence, NZ_Field)
write.table(PCresults,file= "hlb_pca_all.txt", sep= ",",row.names=FALSE)
1 ответ
Это кажется проблемой с отсутствующими данными, поэтому есть несколько способов справиться с этим. Одним из способов является ручное удаление списка данных перед запуском PCA, которое в вашем случае будет следующим:
biovars<-biovars[complete.cases(biovars),]
Другой вариант заключается в использовании другого пакета, а именно psych
кажется, хорошо работает здесь, и вы можете использовать principal(biovars)
и хотя выходные данные немного отличаются, он работает с использованием парного удаления, поэтому в основном все сводится к тому, хотите ли вы использовать парное или списочное удаление. Спасибо!