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

