Mam zestaw danych 9 próbek (wierszy) z 51608 zmiennymi (kolumnami) i ciągle otrzymuję błąd za każdym razem, gdy próbuję zmienić skalę to:Jak rozwiązać prcomp.default(): nie można przeskalować kolumny stałej/zera do wariancji jednostki
działa to dobrze
pca = prcomp(pca_data)
jednak
pca = prcomp(pca_data, scale = T)
daje
> Error in prcomp.default(pca_data, center = T, scale = T) :
cannot rescale a constant/zero column to unit variance
Oczywiście trochę trudniej jest zamieścić powtarzalny przykład. Jakieś pomysły na temat tego, czym może być umowa?
Szukam stałych kolumn:
sapply(1:ncol(pca_data), function(x){
length = unique(pca_data[, x]) %>% length
}) %>% table
wyjściowa:
.
2 3 4 5 6 7 8 9
3892 4189 2124 1783 1622 2078 5179 30741
więc nie ma stałych kolumn. Podobnie jest z NA użytkownika -
is.na(pca_data) %>% sum
>[1] 0
Działa to dobrze:
pca_data = scale(pca_data)
Ale potem oboje wciąż daje dokładnie ten sam błąd:
pca = prcomp(pca_data)
pca = prcomp(pca_data, center = F, scale = F)
Więc dlaczego nie mogę ja kieruję dostać skalowany PCA na tych danych? Ok, pozwala na 100% pewność, że nie jest stała.
pca_data = pca_data + rnorm(nrow(pca_data) * ncol(pca_data))
Identyczne błędy. Dane Numierc?
sapply(1:nrow(pca_data), function(row){
sapply(1:ncol(pca_data), function(column){
!is.numeric(pca_data[row, column])
})
}) %>% sum
Nadal te same błędy. Nie mam pomysłów.
Edytuj: więcej i włamań przynajmniej do rozwiązania.
Później nadal problemy ze grupowanie tym danych np:
Error in hclust(d, method = "ward.D") :
NaN dissimilarity value in intermediate results.
Przycinanie wartości poniżej pewnego cuttoff np < 1 do zera miał żadnego wpływu. Ostatecznie udało się przyciąć wszystkie kolumny, które miały więcej niż x zer w kolumnie. Przetworzono dla zer: < = 6, ale 7+ dało błędy. Nie mam pojęcia, czy to oznacza, że jest to problem w ogóle, czy po prostu przydarzyło się problematyczne kolumny. Nadal byłby szczęśliwy, gdyby ktoś miał jakieś pomysły, dlaczego to powinno działać dobrze, o ile żadna zmienna nie jest zerowa (lub stała w inny sposób).
Zobacz, co 'sum (! Is.finite (scale (pca_data))) daje. –
Rozwiązałeś problem? – Joe