Buenos dias para todos, Estoy trabajando en una aplicación que involucra análisis de clusters. Básicamente el objetivo es determinar a qué cluster pertenece cada observación de una matriz de datos "mydata" y luego generar muestras aleatorias de los mismos datos para determinar la proporción de veces que cada observación es clasificada en el cluster k. Este tipo de análisis es muy común en aplicaciones de Phylogeny < http://en.wikipedia.org/wiki/Phylogeny> Suponiendo que el método de cluster a utilizar es fijo y que de alguna manera se determinó que el número de clusters óptimo, conocen alguna libreria en R que permita hacer lo que describo? Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters # Data set set.seed(123) mydata <- matrix(rnorm(100*10), ncol=10) colnames(mydata) <- paste(''X'', 1:10, sep="") rownames(mydata) <- paste(''s'', 1:100, sep="") # Función para determinar el cluster al que # pertenece cada muestra s_i foo <- function(X, k = 7){ x <- X[sample(nrow(X)),] rx <- rownames(x) cluster <- kmeans(x, k)$cluster names(cluster) <- rx cluster[rownames(X)] } # Repitiendo foo 1000 veces N <- 1000 res <- replicate(N, foo(mydata)) # Dandole un nuevo formato a la salida de res grupos <- t(apply(res, 1, function(x){ x <- factor(x, levels = 1:7) table(x) } ) ) /1000 head(grupos) Al trabajar con datos completamente aleatorios, se espera que las proporciones de los grupos sea similares. En este caso el valor cluster donde la proporción es mayor puede ser obtenido como: apply(grupos, 1, which.max) Muchas gracias, Jorge Ivan Velez [[alternative HTML version deleted]]
Hola, ¿qué tal? Hay algo que no entiendo dado que en cada iteración creas una nueva partición del espacio (una nueva llamada a kmeans). Algo se me escapa porque no veo qué relación guarda el cluster con la etiqueta "i" entre cada una de las iteraciones... Un saludo, Carlos J. Gil Bellosta El 24 de junio de 2009 17:50, Jorge Ivan Velez<jorgeivanvelez en gmail.com> escribió:> Buenos dias para todos, > Estoy trabajando en una aplicación que involucra análisis de clusters. > Básicamente el objetivo es determinar a qué cluster pertenece cada > observación de una matriz de datos "mydata" y luego generar muestras > aleatorias de los mismos datos para determinar la proporción de veces que > cada observación es clasificada en el cluster k. > > Este tipo de análisis es muy común en aplicaciones de Phylogeny < > http://en.wikipedia.org/wiki/Phylogeny> > > Suponiendo que el método de cluster a utilizar es fijo y que de alguna > manera se determinó que el número de clusters óptimo, conocen alguna > libreria en R que permita hacer lo que describo? > > Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters > > # Data set > set.seed(123) > mydata <- matrix(rnorm(100*10), ncol=10) > colnames(mydata) <- paste('X', 1:10, sep="") > rownames(mydata) <- paste('s', 1:100, sep="") > > # Función para determinar el cluster al que > # pertenece cada muestra s_i > foo <- function(X, k = 7){ > x <- X[sample(nrow(X)),] > rx <- rownames(x) > cluster <- kmeans(x, k)$cluster > names(cluster) <- rx > cluster[rownames(X)] > } > > # Repitiendo foo 1000 veces > N <- 1000 > res <- replicate(N, foo(mydata)) > > # Dandole un nuevo formato a la salida de res > grupos <- t(apply(res, 1, function(x){ > x <- factor(x, levels = 1:7) > table(x) > } > ) > ) /1000 > head(grupos) > > Al trabajar con datos completamente aleatorios, se espera que las > proporciones de los grupos sea similares. En este caso el valor cluster > donde la proporción es mayor puede ser obtenido como: > > apply(grupos, 1, which.max) > > > Muchas gracias, > > Jorge Ivan Velez > > [[alternative HTML version deleted]] > > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >
Jorge, podrías dar un ejemplo concreto en Filogenia. No estoy seguro de entender la finalidad del bootstap que aparece en tu código. Intuyo que un análisis cluster jerárquico podría ser adecuado en este tipo de problema. Si es así el package pvclust debería serte de ayuda. Un saludo. Olivier -- ____________________________________ Olivier G. Nuñez Email: onunez en iberstat.es Tel : +34 663 03 69 09 Web: http://www.iberstat.es ____________________________________ El 24/06/2009, a las 17:50, Jorge Ivan Velez escribió:> Buenos dias para todos, > Estoy trabajando en una aplicación que involucra análisis de clusters. > Básicamente el objetivo es determinar a qué cluster pertenece cada > observación de una matriz de datos "mydata" y luego generar muestras > aleatorias de los mismos datos para determinar la proporción de > veces que > cada observación es clasificada en el cluster k. > > Este tipo de análisis es muy común en aplicaciones de Phylogeny < > http://en.wikipedia.org/wiki/Phylogeny> > > Suponiendo que el método de cluster a utilizar es fijo y que de alguna > manera se determinó que el número de clusters óptimo, conocen alguna > libreria en R que permita hacer lo que describo? > > Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters > > # Data set > set.seed(123) > mydata <- matrix(rnorm(100*10), ncol=10) > colnames(mydata) <- paste('X', 1:10, sep="") > rownames(mydata) <- paste('s', 1:100, sep="") > > # Función para determinar el cluster al que > # pertenece cada muestra s_i > foo <- function(X, k = 7){ > x <- X[sample(nrow(X)),] > rx <- rownames(x) > cluster <- kmeans(x, k)$cluster > names(cluster) <- rx > cluster[rownames(X)] > } > > # Repitiendo foo 1000 veces > N <- 1000 > res <- replicate(N, foo(mydata)) > > # Dandole un nuevo formato a la salida de res > grupos <- t(apply(res, 1, function(x){ > x <- factor(x, levels = 1:7) > table(x) > } > ) > ) /1000 > head(grupos) > > Al trabajar con datos completamente aleatorios, se espera que las > proporciones de los grupos sea similares. En este caso el valor > cluster > donde la proporción es mayor puede ser obtenido como: > > apply(grupos, 1, which.max) > > > Muchas gracias, > > Jorge Ivan Velez > > [[alternative HTML version deleted]] > > _______________________________________________ > R-help-es mailing list > R-help-es en r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es
Hola Carlos, Muchas gracias por tu respuesta. En cada iteración creo una nueva kmeans para luego determinar qué tan consistentes son los clusters que encuentro cuando aplico el procedimiento con los datos originales. Si observas, en las muestras que genero realmente lo que hago es permutar las filas de los datos (las muestras s1,...,s_{100} en este caso). Los cluster iniciales pueden calcularse fácilmente como: # Cluster inicial cini <- kmeans(mydata, 7)$cluster head(cini) # s1 s2 s3 s4 s5 s6 # 6 6 3 1 2 4 Otra forma de ver el problema (que no mostré en mi primer mensaje), sería determinando la proporción de veces que los cluster iniciales (ver variable cini) se mantienen a través de las permutaciones. En este caso sería algo como: # Tablas de los cluster iniciales (cini) calculados # con los datos originales y los clusters calculados # en cada permutacion res2 <- apply(res, 2, function(x) list(table(cini,x))) # Función para sumar listas add <- function(x) Reduce("+", x) # Cálculo de las proporciones # la diagonal representaría la proporción de veces que el cluster i se mantuvo # después de las permutaciones res3 <- add(lapply(res2, function(x) x[[1]])) diag(res3/(7*rowMeans(res3))) # 1 2 3 4 5 6 7 # 0.1335385 0.1406923 0.1543000 0.1471333 0.1331000 0.1423889 0.1430909 Comercialmente, existe una programa llamado LatentGOLD (ver [1]). Uno de los procedimientos implementados allí cuando se realiza análisis de clases latentes (LCA), tiene que ver con la determinación de la consistencia del modelo ajustado. Los modelos de LCA generan clusters (llamados clases latentes), utilizando el modelo definido por el usuario. Luego el análisis se replica cientos o miles de veces. El objetivo de ello es contrastar, utilizando bootstrap, las hipótesis H_0: El modelo ajustado es adecuado H_1: El modelo ajustado NO es adecuado Es esto, a groso modo, lo que quiero hacer con el procedimiento que he intentado describir. Por favor dime si ahora es un poco más claro. Muchas gracias de nuevo, Jorge Ivan Velez [1] http://www.statisticalinnovations.com/products/latentgold_v4.html 2009/6/24 Carlos J. Gil Bellosta <gilbellosta@gmail.com>> Hola, ¿qué tal? > > Hay algo que no entiendo dado que en cada iteración creas una nueva > partición del espacio (una nueva llamada a kmeans). Algo se me escapa > porque no veo qué relación guarda el cluster con la etiqueta "i" entre > cada una de las iteraciones... > > Un saludo, > > Carlos J. Gil Bellosta > > El 24 de junio de 2009 17:50, Jorge Ivan > Velez<jorgeivanvelez@gmail.com> escribió: > > Buenos dias para todos, > > Estoy trabajando en una aplicación que involucra análisis de clusters. > > Básicamente el objetivo es determinar a qué cluster pertenece cada > > observación de una matriz de datos "mydata" y luego generar muestras > > aleatorias de los mismos datos para determinar la proporción de veces que > > cada observación es clasificada en el cluster k. > > > > Este tipo de análisis es muy común en aplicaciones de Phylogeny < > > http://en.wikipedia.org/wiki/Phylogeny> > > > > Suponiendo que el método de cluster a utilizar es fijo y que de alguna > > manera se determinó que el número de clusters óptimo, conocen alguna > > libreria en R que permita hacer lo que describo? > > > > Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters > > > > # Data set > > set.seed(123) > > mydata <- matrix(rnorm(100*10), ncol=10) > > colnames(mydata) <- paste(''X'', 1:10, sep="") > > rownames(mydata) <- paste(''s'', 1:100, sep="") > > > > # Función para determinar el cluster al que > > # pertenece cada muestra s_i > > foo <- function(X, k = 7){ > > x <- X[sample(nrow(X)),] > > rx <- rownames(x) > > cluster <- kmeans(x, k)$cluster > > names(cluster) <- rx > > cluster[rownames(X)] > > } > > > > # Repitiendo foo 1000 veces > > N <- 1000 > > res <- replicate(N, foo(mydata)) > > > > # Dandole un nuevo formato a la salida de res > > grupos <- t(apply(res, 1, function(x){ > > x <- factor(x, levels = 1:7) > > table(x) > > } > > ) > > ) /1000 > > head(grupos) > > > > Al trabajar con datos completamente aleatorios, se espera que las > > proporciones de los grupos sea similares. En este caso el valor cluster > > donde la proporción es mayor puede ser obtenido como: > > > > apply(grupos, 1, which.max) > > > > > > Muchas gracias, > > > > Jorge Ivan Velez > > > > [[alternative HTML version deleted]] > > > > > > _______________________________________________ > > R-help-es mailing list > > R-help-es@r-project.org > > https://stat.ethz.ch/mailman/listinfo/r-help-es > > > > >[[alternative HTML version deleted]]
Hola Olivier, Muchas gracias por mencionar la libreria pvclust. La revisaré a la mayor brevedad. Desafortunadamente no tengo un ejemplo de Filogenia que pueda enviar. Sin embargo, lo que quiero hacer es muy similar a lo que en este tipo de aplicaciones se realiza y en las que básicamente se realizan pruebas estadísticas para determinar qué tan válidos son los clusters generados. MEGA4 <http://www.megasoftware.net/index.html> es uno de los programas utilizados para tal fin y es de dominio público. En particular [1] --> Part IV: Evolutionary Analysis --> Statistical Test of a Tree Obtained --> Bootstrap tests presenta una breve introducción de estas pruebas via bootstrap. Agradeciendo tu ayuda y en espera de comentarios adicionales por parte de otros R-help-es helpers, Jorge [1] http://www.megasoftware.net/WebHelp/helpfile.htm 2009/6/24 Olivier Nuñez <onunez@iberstat.es>> Jorge, > > podrías dar un ejemplo concreto en Filogenia. > No estoy seguro de entender la finalidad del bootstap que aparece en tu > código. > Intuyo que un análisis cluster jerárquico podría ser adecuado en este tipo > de problema. > Si es así el package pvclust debería serte de ayuda. > Un saludo. Olivier > > -- ____________________________________ > > Olivier G. Nuñez > Email: onunez@iberstat.es > Tel : +34 663 03 69 09 > Web: http://www.iberstat.es > > ____________________________________ > > > > > El 24/06/2009, a las 17:50, Jorge Ivan Velez escribió: > > Buenos dias para todos, >> Estoy trabajando en una aplicación que involucra análisis de clusters. >> Básicamente el objetivo es determinar a qué cluster pertenece cada >> observación de una matriz de datos "mydata" y luego generar muestras >> aleatorias de los mismos datos para determinar la proporción de veces que >> cada observación es clasificada en el cluster k. >> >> Este tipo de análisis es muy común en aplicaciones de Phylogeny < >> http://en.wikipedia.org/wiki/Phylogeny> >> >> Suponiendo que el método de cluster a utilizar es fijo y que de alguna >> manera se determinó que el número de clusters óptimo, conocen alguna >> libreria en R que permita hacer lo que describo? >> >> Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters >> >> # Data set >> set.seed(123) >> mydata <- matrix(rnorm(100*10), ncol=10) >> colnames(mydata) <- paste(''X'', 1:10, sep="") >> rownames(mydata) <- paste(''s'', 1:100, sep="") >> >> # Función para determinar el cluster al que >> # pertenece cada muestra s_i >> foo <- function(X, k = 7){ >> x <- X[sample(nrow(X)),] >> rx <- rownames(x) >> cluster <- kmeans(x, k)$cluster >> names(cluster) <- rx >> cluster[rownames(X)] >> } >> >> # Repitiendo foo 1000 veces >> N <- 1000 >> res <- replicate(N, foo(mydata)) >> >> # Dandole un nuevo formato a la salida de res >> grupos <- t(apply(res, 1, function(x){ >> x <- factor(x, levels = 1:7) >> table(x) >> } >> ) >> ) /1000 >> head(grupos) >> >> Al trabajar con datos completamente aleatorios, se espera que las >> proporciones de los grupos sea similares. En este caso el valor cluster >> donde la proporción es mayor puede ser obtenido como: >> >> apply(grupos, 1, which.max) >> >> >> Muchas gracias, >> >> Jorge Ivan Velez >> >> [[alternative HTML version deleted]] >> >> _______________________________________________ >> R-help-es mailing list >> R-help-es@r-project.org >> https://stat.ethz.ch/mailman/listinfo/r-help-es >> > >[[alternative HTML version deleted]]
Hola, ¿qué tal? Sería interesante poder echarle un buen vistazo a esos programas y métodos de Statistical Innovations. Pero ésa es otra historia. El problema de tus iteraciones consiste en que en función de la elección de los centroides originales, k-means queda atrapado en uno u otro mínimo local distinto. Es muy difícil saber si el clúster 4 de la iteración 729 se corresponde con el clúster 7 de la iteración 273. Lo que tal vez pudiera darte idea de si los clústers recogen la estructura de los datos es un algoritmo basado en lo siguiente: 1) Toma un x% de tus datos y ajusta un kmeans, guarda los centroides. 2) Itera cierto número de veces lo siguente: 2a) Muestrea un x% de tus datos. 2b) Ajusta un kmeans obligando a que el algoritmo arranque _desde tus centroides originales_. 3) Mira a ver si cada observación tiende a caer siempre en el mismo clúster. El paso 2b sería fácil de realizar si las etiquetas de los clústers se relacionasen (habría que comprobarlo) con el orden de los centroides de partida. Pero, vale la pena insistir, es clave poder arrancar desde centroides dados. No se me ocurre cuál podría ser la hipótesis H0 de partida sobre la que construir un p-valor: ¿tal vez que los datos originales proceden, por ejemplo, de una distribución normal con media y varianza dadas? Un saludo, Carlos J. Gil Bellosta
Hola Jorge, No conozco otro paquete de R que haga lo que necesitas. Random-forest usa una mescla de bootstrap y regression trees para construir no solo modelos de clasificacion sino tambien modelos de clusters. Quizas te interese usarlo en tu problema. Te adjunto un paper sobre el tema que te puede ser util. En general el problema que tenes es que estas estimando una matriz de probabilidades de dimension (nxk) y los metodos de boostrap pueden dar resultados erraticos. Posiblemente tengas que agregar un segundo nivel de remuestreo para este problema de prediccion. Pablo ----- Original Message ----- From: "Jorge Ivan Velez" <jorgeivanvelez en gmail.com> To: "R-help-es" <r-help-es en r-project.org> Sent: Wednesday, June 24, 2009 5:50 PM Subject: [R-es] Remuestreo de Clusters Buenos dias para todos, Estoy trabajando en una aplicación que involucra análisis de clusters. Básicamente el objetivo es determinar a qué cluster pertenece cada observación de una matriz de datos "mydata" y luego generar muestras aleatorias de los mismos datos para determinar la proporción de veces que cada observación es clasificada en el cluster k. Este tipo de análisis es muy común en aplicaciones de Phylogeny < http://en.wikipedia.org/wiki/Phylogeny> Suponiendo que el método de cluster a utilizar es fijo y que de alguna manera se determinó que el número de clusters óptimo, conocen alguna libreria en R que permita hacer lo que describo? Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters # Data set set.seed(123) mydata <- matrix(rnorm(100*10), ncol=10) colnames(mydata) <- paste('X', 1:10, sep="") rownames(mydata) <- paste('s', 1:100, sep="") # Función para determinar el cluster al que # pertenece cada muestra s_i foo <- function(X, k = 7){ x <- X[sample(nrow(X)),] rx <- rownames(x) cluster <- kmeans(x, k)$cluster names(cluster) <- rx cluster[rownames(X)] } # Repitiendo foo 1000 veces N <- 1000 res <- replicate(N, foo(mydata)) # Dandole un nuevo formato a la salida de res grupos <- t(apply(res, 1, function(x){ x <- factor(x, levels = 1:7) table(x) } ) ) /1000 head(grupos) Al trabajar con datos completamente aleatorios, se espera que las proporciones de los grupos sea similares. En este caso el valor cluster donde la proporción es mayor puede ser obtenido como: apply(grupos, 1, which.max) Muchas gracias, Jorge Ivan Velez [[alternative HTML version deleted]] ---------------------------------------------------------------------------- ---- _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es ------------ próxima parte ------------ A non-text attachment was scrubbed... Name: bootstrap-trees.pdf Type: application/pdf Size: 301248 bytes Desc: no disponible URL: <https://stat.ethz.ch/pipermail/r-help-es/attachments/20090625/96f15911/attachment-0001.pdf>
Muchas gracias Pablo por tu ayuda. En definitiva lo que intenté hacer con el código que envié a la lista parece más complejo de lo que inicialmente pensé, así que cambiaré mi estrategia. Por ahora el artículo que me envías y tu sugerencia de explorar RandomForest me son de gran ayuda. Gute nacht, Jorge 2009/6/25 Pablo Emilio Verde <PabloEmilio.Verde@uni-duesseldorf.de>> Hola Jorge, > > No conozco otro paquete de R que haga lo que necesitas. Random-forest usa > una > mescla de bootstrap y regression trees para construir no solo modelos de > clasificacion > sino tambien modelos de clusters. Quizas te interese usarlo en tu problema. > > Te adjunto un paper sobre el tema que te puede ser util. En general el > problema que > tenes es que estas estimando una matriz de probabilidades de dimension > (nxk) > y > los metodos de boostrap pueden dar resultados erraticos. Posiblemente > tengas > que > agregar un segundo nivel de remuestreo para este problema de prediccion. > > Pablo > > > ----- Original Message ----- > From: "Jorge Ivan Velez" <jorgeivanvelez@gmail.com> > To: "R-help-es" <r-help-es@r-project.org> > Sent: Wednesday, June 24, 2009 5:50 PM > Subject: [R-es] Remuestreo de Clusters > > > Buenos dias para todos, > Estoy trabajando en una aplicación que involucra análisis de clusters. > Básicamente el objetivo es determinar a qué cluster pertenece cada > observación de una matriz de datos "mydata" y luego generar muestras > aleatorias de los mismos datos para determinar la proporción de veces que > cada observación es clasificada en el cluster k. > > Este tipo de análisis es muy común en aplicaciones de Phylogeny < > http://en.wikipedia.org/wiki/Phylogeny> > > Suponiendo que el método de cluster a utilizar es fijo y que de alguna > manera se determinó que el número de clusters óptimo, conocen alguna > libreria en R que permita hacer lo que describo? > > Este es un ejemplo en R en el que utilizo ksmeans y 7 clusters > > # Data set > set.seed(123) > mydata <- matrix(rnorm(100*10), ncol=10) > colnames(mydata) <- paste(''X'', 1:10, sep="") > rownames(mydata) <- paste(''s'', 1:100, sep="") > > # Función para determinar el cluster al que > # pertenece cada muestra s_i > foo <- function(X, k = 7){ > x <- X[sample(nrow(X)),] > rx <- rownames(x) > cluster <- kmeans(x, k)$cluster > names(cluster) <- rx > cluster[rownames(X)] > } > > # Repitiendo foo 1000 veces > N <- 1000 > res <- replicate(N, foo(mydata)) > > # Dandole un nuevo formato a la salida de res > grupos <- t(apply(res, 1, function(x){ > x <- factor(x, levels = 1:7) > table(x) > } > ) > ) /1000 > head(grupos) > > Al trabajar con datos completamente aleatorios, se espera que las > proporciones de los grupos sea similares. En este caso el valor cluster > donde la proporción es mayor puede ser obtenido como: > > apply(grupos, 1, which.max) > > > Muchas gracias, > > Jorge Ivan Velez > > [[alternative HTML version deleted]] > > > > > > ---------------------------------------------------------------------------- > ---- > > > _______________________________________________ > R-help-es mailing list > R-help-es@r-project.org > https://stat.ethz.ch/mailman/listinfo/r-help-es > >[[alternative HTML version deleted]]