5

Robię hierarchiczne grupowanie z pakietem R o nazwie pvclust, który opiera się na hclust przez włączenie ładowania początkowego w celu obliczenia poziomów istotności dla otrzymanych klastrów.Błąd w hierarchicznym grupowaniu wielościennym w R

Rozważmy następujący zestaw danych z 3 wymiarach i 10 Uwagi:

mat <- as.matrix(data.frame("A"=c(9000,2,238),"B"=c(10000,6,224),"C"=c(1001,3,259), 
         "D"=c(9580,94,51),"E"=c(9328,5,248),"F"=c(10000,100,50), 
         "G"=c(1020,2,240),"H"=c(1012,3,260),"I"=c(1012,3,260), 
         "J"=c(984,98,49))) 

Gdy używam hclust sam, grupowanie działa dobrze dla obu środków euklidesowych i środków Korelacja:

# euclidean-based distance 
dist1 <- dist(t(mat),method="euclidean") 
mat.cl1 <- hclust(dist1,method="average") 

# correlation-based distance 
dist2 <- as.dist(1 - cor(mat)) 
mat.cl2 <- hclust(dist2, method="average") 

jednak podczas korzystania z każdej konfiguracji z pvclust, jak następuje:

library(pvclust) 

# euclidean-based distance 
mat.pcl1 <- pvclust(mat, method.hclust="average", method.dist="euclidean", nboot=1000) 

# correlation-based distance 
mat.pcl2 <- pvclust(mat, method.hclust="average", method.dist="correlation", nboot=1000) 

... otrzymuję następujące błędy:

  • euklidesowej: Error in hclust(distance, method = method.hclust) : must have n >= 2 objects to cluster
  • Korelacja: Error in cor(x, method = "pearson", use = use.cor) : supply both 'x' and 'y' or a matrix-like 'x'.

Należy pamiętać, że odległość jest obliczana przez pvclust więc nie ma potrzeby obliczania odległości wcześniej. Zauważ też, że metoda hclust (średnia, mediana itp.) Nie ma wpływu na problem.

Gdy zwiększam wymiarowość zestawu danych do 4, pvclust teraz działa poprawnie. Dlaczego otrzymuję te błędy dla pvclust w 3 wymiarach i poniżej, ale nie dla hclust? Co więcej, dlaczego błędy znikają, gdy używam zestawu danych powyżej 4 wymiarów?

Odpowiedz

2

Pod koniec funkcji pvclust widzimy linię

mboot <- lapply(r, boot.hclust, data = data, object.hclust = data.hclust, 
    nboot = nboot, method.dist = method.dist, use.cor = use.cor, 
    method.hclust = method.hclust, store = store, weight = weight) 

następnie kopania głębiej znajdziemy

getAnywhere("boot.hclust") 
function (r, data, object.hclust, method.dist, use.cor, method.hclust, 
    nboot, store, weight = F) 
{ 
    n <- nrow(data) 
    size <- round(n * r, digits = 0) 
    .... 
      smpl <- sample(1:n, size, replace = TRUE) 
      suppressWarnings(distance <- dist.pvclust(data[smpl, 
       ], method = method.dist, use.cor = use.cor)) 
    .... 
} 

również pamiętać, że wartość domyślna parametru r dla funkcji pvclust jest r=seq(.5,1.4,by=.1). Cóż, faktycznie jak możemy zobaczyć tę wartość jest zmieniana gdzieś:

Bootstrap (r = 0.33)... 

więc co mamy jest size <- round(3 * 0.33, digits =0) który jest 1 wreszcie data[smpl,] ma tylko 1 wiersz, który jest mniejszy niż 2. Po korekcji r powraca jakiś błąd, który być może jest nieszkodliwa, a wyjście jest podana za:

mat.pcl1 <- pvclust(mat, method.hclust="average", method.dist="euclidean", 
        nboot=1000, r=seq(0.7,1.4,by=.1)) 
Bootstrap (r = 0.67)... Done. 
.... 
Bootstrap (r = 1.33)... Done. 
Warning message: 
In a$p[] <- c(1, bp[r == 1]) : 
    number of items to replace is not a multiple of replacement length 

Daj mi znać, jeśli wyniki są zadowalające.

+0

To jest doskonałe. Zmiana 'r' działa. dzięki. – oisyutat