2012-02-26 11 views
6

Mi programa R es como a continuación:error Strange de Hierarchical Clustering en R

hcluster <- function(dmatrix) { 
    imatrix <- NULL 
    hc <- hclust(dist(dmatrix), method="average") 
    for(h in sort(unique(hc$height))) { 
     hc.index <- c(h,as.vector(cutree(hc,h=h))) 
     imatrix <- cbind(imatrix, hc.index) 
    } 
    return(imatrix) 
} 

dmatrix_file = commandArgs(trailingOnly = TRUE)[1] 
print(paste('Reading distance matrix from', dmatrix_file)) 
dmatrix <- as.matrix(read.csv(dmatrix_file,header=FALSE)) 

imatrix <- hcluster(dmatrix) 
imatrix_file = paste("results",dmatrix_file,sep="-") 
print(paste('Wrinting results to', imatrix_file)) 
write.table(imatrix, file=imatrix_file, sep=",", quote=FALSE, row.names=FALSE, col.names=FALSE) 
print('done!') 

Mi entrada es una matriz de distancia (de simétrica supuesto). Cuando ejecuto por encima de programa con una matriz de distancias mayores de unos miles de registros (Nada sucede por varios cientos), que me dio el mensaje de error:

Error in cutree(hc, h = h) : 
    the 'height' component of 'tree' is not sorted 
(increasingly); consider applying as.hclust() first 
Calls: hcluster -> as.vector -> cutree 
Execution halted 

Mi máquina tiene alrededor de 16 GB de RAM y 4CPU, por lo que ganó' t el problema de los recursos.

¿Puede alguien decirme cuál es el problema? ¡¡Gracias!!

+0

implementado Ingenuamente, la agrupación jerárquica tiene 'O (n^3)' complejidad (de hecho, el conocido 'O (n^2)' algoritmos son sólo para algunas versiones especializadas, véase 'SLINK',' CLINK '). De hecho, podría ser un problema de complejidad, aunque el error no se parece a esto. –

+4

Me gustaría profundizar, ¿podría publicar la muestra de dmatrix_file y dar instrucciones sobre cómo ampliar? –

+0

De acuerdo con Peter: ¿no puede hacer que dmatrix_file esté disponible, o un conjunto de datos ficticio de las mismas dimensiones? – geotheory

Respuesta

1

En cuanto a la función cutree aquí http://code.ohloh.net/file?fid=QM4q0tWQlv2VywAoSr2MfgcNjnA&cid=ki3UJjFJ8jA&s=cutree%20component%20of%20is%20not%20sorted&mp=1&ml=1&me=1&md=1&browser=Default#L1

Es posible que trate de añadir el k escalador para el número de grupos, esto anulará la altura argumento. Si no, puede ver qué es hc $ height porque si no es un vector numérico, complejo, de caracteres o lógico, is.unsorted devolverá true y le dará este error.

if(is.null(k)) { 
    if(is.unsorted(tree$height)) 
     stop("the 'height' component of 'tree' is not sorted (increasingly)") 
    ## h |--> k 
    ## S+6 help(cutree) says k(h) = k(h+), but does k(h-) [continuity] 
    ## h < min() should give k = n; 
    k <- n+1L - apply(outer(c(tree$height,Inf), h, ">"), 2, which.max) 
    if(getOption("verbose")) message("cutree(): k(h) = ", k, domain = NA) 
}