5

Sto facendo il clustering gerarchico con un pacchetto R chiamato pvclust, che si basa su hclust incorporando il bootstrap per calcolare i livelli di significatività per i cluster ottenuti.Errore con clustering gerarchico multiscala in R

Considerate i seguenti dati impostati con 3 dimensioni e 10 osservazioni:

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))) 

Quando uso hclust sola, il raggruppamento funziona bene sia misure euclidee e misure di correlazione:

# 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") 

Tuttavia, quando si utilizza ciascuna configurazione con pvclust, come segue:

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) 

... ottengo i seguenti errori:

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

Si noti che la distanza viene calcolata da pvclust quindi non è necessario un calcolo della distanza in anticipo. Si noti inoltre che il metodo hclust (media, mediana, ecc.) Non influisce sul problema.

Quando si aumenta la dimensionalità del set di dati su 4, pvclust ora funziona correttamente. Perché ho ricevuto questi errori per pvclust in 3 dimensioni e in basso ma non per hclust? Inoltre, perché gli errori scompaiono quando utilizzo un set di dati superiore a 4 dimensioni?

risposta

2

Alla fine della funzione pvclust vediamo una linea

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) 

poi scavando sempre troviamo

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)) 
    .... 
} 

noti inoltre, che il valore di default del parametro r per la funzione pvclust è r=seq(.5,1.4,by=.1). Beh, in realtà come si può vedere questo valore viene cambiato da qualche parte:

Bootstrap (r = 0.33)... 

così quello che otteniamo è size <- round(3 * 0.33, digits =0) che è 1, finalmente data[smpl,] ha solo 1 riga, che è inferiore a 2. Dopo la correzione di r restituisce qualche errore che è probabilmente innocuo e l'output è dato anche:

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 

Fammi sapere se i risultati sono soddisfacenti.

+0

Questo è eccellente. Cambiare 'r' fa il trucco. Grazie. – oisyutat

Problemi correlati