Ошибка 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)и хотя выходные данные немного отличаются, он работает с использованием парного удаления, поэтому в основном все сводится к тому, хотите ли вы использовать парное или списочное удаление. Спасибо!

Другие вопросы по тегам