Ich habe einen Datensatz von 9 Proben (Zeilen) mit 51608 Variablen (Spalten) und ich bekomme den Fehler immer wenn ich versuche zu skalieren es:So lösen Sie prcomp.default(): kann keine Konstanten/Nullspalte zu Einheitsvarianz reskalieren
Dies funktioniert
pca = prcomp(pca_data)
jedoch
pca = prcomp(pca_data, scale = T)
gibt
> Error in prcomp.default(pca_data, center = T, scale = T) :
cannot rescale a constant/zero column to unit variance
Offensichtlich ist es ein wenig schwierig, ein reproduzierbares Beispiel zu veröffentlichen. Irgendwelche Ideen, was der Deal sein könnte?
der Suche nach konstanten Spalten:
sapply(1:ncol(pca_data), function(x){
length = unique(pca_data[, x]) %>% length
}) %>% table
Ausgang:
.
2 3 4 5 6 7 8 9
3892 4189 2124 1783 1622 2078 5179 30741
So keine konstanten Spalten. Das Gleiche gilt für die NA -
is.na(pca_data) %>% sum
>[1] 0
Dies funktioniert:
pca_data = scale(pca_data)
Aber dann danach beide noch genau die gleichen Fehler geben:
pca = prcomp(pca_data)
pca = prcomp(pca_data, center = F, scale = F)
Also warum kann ich eine skalierte PKA bekommen verwalten auf diese Daten? Ok, machen wir 100% sicher, dass es nicht konstant ist.
pca_data = pca_data + rnorm(nrow(pca_data) * ncol(pca_data))
Gleiche Fehler. Numierc Daten?
sapply(1:nrow(pca_data), function(row){
sapply(1:ncol(pca_data), function(column){
!is.numeric(pca_data[row, column])
})
}) %>% sum
Immer noch die gleichen Fehler. Ich habe keine Ideen mehr.
Edit: mehr und ein Hack zumindest um es zu lösen.
Später haben noch eine harte Zeit Clustering diese Daten zB:
Error in hclust(d, method = "ward.D") :
NaN dissimilarity value in intermediate results.
Werte Trimmen unter einem bestimmten cuttoff zB < 1 auf Null keine Wirkung hatte. Was schließlich funktionierte, war das Trimmen aller Spalten, die mehr als x Nullen in der Spalte hatten. Arbeitete für # Nullen < = 6, aber 7+ gab Fehler. Keine Ahnung, ob das bedeutet, dass es sich um ein Problem im Allgemeinen handelt oder ob es sich dabei nur um eine problematische Kolumne handelt. Es würde mich trotzdem freuen zu hören, ob irgendjemand irgendwelche Ideen hat, warum dies gut funktionieren sollte, solange keine Variable nur Nullen (oder konstant auf eine andere Art) ist.
Sehen Sie, was 'sum (! Is.finite (scale (pca_data)))' Ihnen gibt. –
Haben Sie es gelöst? – Joe