2016-10-29 4 views
5

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.

+0

Sehen Sie, was 'sum (! Is.finite (scale (pca_data)))' Ihnen gibt. –

+0

Haben Sie es gelöst? – Joe

Antwort

6

Ich glaube nicht, dass Sie nach Null-Varianz-Spalten richtig suchen. Versuchen wir es mit Dummy-Daten. Erstens, eine akzeptable Matrix: von 10 × 100:

mat <- matrix(rnorm(1000, 0), nrow = 10) 

Und eins mit einer Null-Varianz-Spalte. Nennen wir es oopsmat.

const <- rep(0.1,100) 
oopsmat <- cbind(const, mat) 

Die ersten Elemente der oopsmat sieht wie folgt aus:

PCs <- prcomp(oopsmat) #works 
PCs <- prcomp(oopsmat, scale. = T) #not forgetting the dot 
#Error in prcomp.default(oopsmat, scale. = T) : 
    #cannot rescale a constant/zero column to unit variance 

Da kann man nicht durch die Standardabweichung teilen:

 const                        
[1,] 0.1 0.75048899 0.5997527 -0.151815650 0.01002536 0.6736613 -0.225324647 -0.64374844 -0.7879052 
[2,] 0.1 0.09143491 -0.8732389 -1.844355560 0.23682805 0.4353462 -0.0.61859245 0.5691021 
[3,] 0.1 -0.80649512 1.3929716 -1.438738923 -0.09881381 0.2504555 -0.857300053 -0.98528008 0.9816383 
[4,] 0.1 0.49174471 -0.8110623 -0.941413109 -0.70916436 1.3332522 0.003040624 0.29067871 -0.3752594 
[5,] 0.1 1.20068447 -0.9811222 0.928731706 -1.97469637 -1.1374734 0.661594937 2.96029102 0.6040814 

des skalierten und unscaled PKA auf oopsmat Lassen Sie versuchen, wenn es unendlich ist. Um die Nullvarianzspalte zu identifizieren, können wir which wie folgt verwenden, um den Variablennamen zu erhalten.

which(apply(oopsmat, 2, var)==0) 
#const 
#1 

Und Null Varianz Spalten aus dem Datensatz zu entfernen, können Sie den gleichen apply Ausdruck verwenden können, Varianz nicht gleich Null.

oopsmat[ , apply(oopsmat, 2, var) != 0] 

Hoffnung, die hilft, Dinge klarer zu machen!

Verwandte Themen