Re: [R-es] Crear Cluster

2021-01-27 Por tema l.graco--- via R-help-es
clustMixType no es una función, es un paquete de R que implementa el algoritmo 
k-prototypes en R. Este es un algoritmo similar la k-means pero válido para 
tipos de datos mixtos.

El paquete incluye no solo métodos para la determinación de clústeres sino 
también para el cálculo de índices de validación, que a lo mejor es lo que te 
confunde. Puedes encontrar más información sobre el algoritmo por ejemplo aquí: 
https://medium.com/datadriveninvestor/k-prototype-in-clustering-mixed-attributes-e6907db91914.

Los índices de validación puedes emplearlos para intentar estimar el número 
óptimo de grupos en tus datos, empleando la función validation_kproto, tal y 
como indica el manual: 
https://www.rdocumentation.org/packages/clustMixType/versions/0.2-9/topics/validation_kproto

Pero si tienes escasa experiencia con R y clustering es complicado poderte 
ayudar.

Ánimo

‐‐‐ Original Message ‐‐‐

El miércoles, 27 de enero de 2021 a las 19:33, ricardo alva 
 escribió:

> Hola amigos.
>
> Soy algo nuevo en este tema de R, pero estoy aprendiendo a empujones porque 
> el tiempo apremia. Necesito segmentar 165000 personas con los siguientes 
> datos, los cuales los tengo en excel en un archivo llamado Data, el cual 
> tiene la siguiente forma.
>
> Nombre
>
> Gnero Edad R_Edad Domilicio Actividad econmica Ingresos mensuales R_Ingresos 
> Categoria Persona
>
> Pepito 1 24 2 1104 23 1200 2 3
>
> Juanita 0 56 4 1021 140 3450 4 16
>
> Pedro 1 35 3 1104 45 300 1 4
>
> Especificaciones:
>
> -   Gnero: 1 =Masculino y 0=Femenino
> -   R_Edad: La edad recodificada en 9 categoras.
> -   Domilicio: Cdigos que representan distintas regiones del pas. Son 167 
> categoras en total.
> -   Actividad econmica: Clasificado en 164 categoras.
> -   R_Ingresos: Ingresos mensuales recodificados en 15 categoras.
> -   Categora Persona: Clasificado en 19 categoras.
>
> Estuve intentando usar la distancia de gower(al ser variables mixtas), 
> con las variables Gnero, R_Edad, Domicilio, Actividad Econmica, R_Ingresos y 
> Categora Persona, para luego poder usar la funcin kmeans y PAM, para poder 
> comparar los resultados, pero me arroja que mis variables son character y no 
> continua con el proceso. Habia ledo tambin que la funcin clustMixType tambin 
> es muy til cuando tienes datos nominales con bastantes categoras, pero no 
> entiendo como armar la sintaxis; en realidad se me hace difcil entender la 
> sintaxis de todo jajajaja.
>
> Si alguien con tiempo, podra indicarme como sera la sintaxis para 
> realizar el anlisis con los mtodos antes indicados y as poder evaluar el 
> mejor nmero de cluster y la consistencia de stos se los agradecera mucho.
>
> [[alternative HTML version deleted]]
>
> R-help-es mailing list
>
> R-help-es@r-project.org
>
> https://stat.ethz.ch/mailman/listinfo/r-help-es

___
R-help-es mailing list
R-help-es@r-project.org
https://stat.ethz.ch/mailman/listinfo/r-help-es


Re: [R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina

2020-12-14 Por tema l.graco--- via R-help-es
Aunque no entiendo el objetivo final, te apunto un par de cosas, por si te 
sirven.

Primero probaría lo que te dije de usar data.table y tratar de vectorizar lo 
máximo.

Luego puedes probar algo así mediante el tidyverse:

tu_dataframe %>%
rowwise(var) %>%
mutate(maximo = max(c_across(starts_with('M')),na.rm = TRUE ))

Tendrás que ajustarlo para el caso de que haya más de un máximo.

Y ya dependiendo de tu lógica de negocio, podrías probar a transformar tu tabla 
en long, con 4 columnas:

- var
- ref (contendría el nombre de la columna M)
- valor (valor de la columna M)
- casos (cuántas veces aparece cada "valor" para cada "var")

Obtener el/los máximos así es trivial. Y si ya lo metes en una base de datos y 
ejecutas un par de sentencias sql eso tiene que llevar muy, muy poco tiempo.

Pero tengo la impresión, subjetiva, de que el proceso que has elegido para los 
cálculos no es el adecuado. Demasiado complicado. Pero como no sé qué significa 
var, ni las columnas M ni el propósito de elegir así, tampoco te puedo orientar 
mejor.

A ver si todo esto te ayuda. Suerte.

‐‐‐ Original Message ‐‐‐
El lunes, 14 de diciembre de 2020 a las 12:24, Carlos Santos 
 escribió:

> gracias por tus comentarios.
>
> lo que dices es asi, excepto cuando hay varios máximos iguales entonces se 
> ejecuta f5 para saber cual de ellos es el elegido, y a continuación se hace 
> lo mismo que has puesto en la frase, es decir elegir el valor de la columna 
> var que ocupa dicha posición del elegido
>
> gracias de todas formas, cualquier ayuda y comentario es de agradecer
>
> El lun, 14 dic 2020 a las 12:05,  escribió:
>
>> Te quería echar una mano pero no veo el objetivo del proceso.
>>
>> A ver si lo voy entendiendo: "Supongamos que tenemos esta matriz, se quiere 
>> conseguir para el mayor valor por fila tomar el valor de la posición que 
>> ocupa la primera columna "Var" en base a la columna elegida y si hay varios 
>> valores máximos iguales, entonces ejecutar la función "f5" para elegir una y 
>> según valor máximo obtenido proceder de la misma manera que antes."
>>
>> ¿Con eso quieres decir que buscas en la fila el valor máximo de las columnas 
>> MX... (supongamos que es la columna MZ) y seleccionas el valor de la columna 
>> var que ocupa dicha posición (la posición Z en este caso?. ¿Y en caso de 
>> varios máximos eliges una de las columnas candidatas mediante la función 
>> f5?. Y esa función f5 contiene una llamada a cohend, nada más.
>>
>> No sé, no acabo de entender la lógica de todo el proceso. Pero así, a 
>> oscuras, data.table es más eficiente manejando grandes volúmenes de datos y 
>> hacer un repeat tal vez no sea lo más rápido, sino aplicar vectorización 
>> allá donde se pueda.
>>
>> Siento no poder ayudar más. Ánimo.
>>
>> ‐‐‐ Original Message ‐‐‐
>>
>> El lunes, 14 de diciembre de 2020 a las 10:31, Carlos Santos 
>>  escribió:
>>
>>> gracias Emilio por tu ayuda, la selección es por fila, no por variable
>>>
>>> He intentado discriminar cuando solo encuentra una posición en la fila que
>>>
>>> es el máximo, pero el ahorro de tiempo no es mucho aunque algo es algo
>>>
>>> Creo que el tiempo se consume en la parte del ELSE, y aunque entiendo que
>>>
>>> se tiene que leer toda la matriz fila a fila, no veo cómo hacer que consuma
>>>
>>> menos tiempo
>>>
>>> Solo me quedaría probar dividir la matriz en trozos, para ver si en proceso
>>>
>>> paralelo podría consumir menos tiempo, ya que cada fila es independiente de
>>>
>>> otra fila.
>>>
>>> if (smc == 1) {
>>>
>>> data1$Clus.Multi.OPTIMO[fila] <-
>>>
>>> data1$Clus.Multi.MAX[max(data2[fila,(3:(rr+2))])]
>>>
>>> } else {
>>>
>>> RECEPTOR$clus <-
>>>
>>> data2[which(as.vector(t(data2[fila,])[,1])==max(data2[fila,(3:(rr+2))]))-2,1][1]$Var
>>>
>>> RECEPTOR$dist <- mclapply((1:smc),f5) %>% unlist()
>>>
>>> data1$Clus.Multi.OPTIMO[which(data1$Clus.Multi.MAX == EMISOR)] <-
>>>
>>>
>>> RECEPTOR[which.max(RECEPTOR[,2]),1]
>>>
>>> }
>>>
>>> Muchas gracias de nuevo Emilio
>>>
>>> Un saludo
>>>
>>> El lun, 14 dic 2020 a las 8:08, Emilio L. Cano (emilopezc...@gmail.com)
>>>
>>> escribió:
>>>
>>> > Hola,
>>> >
>>> > Para la primera parte (seleccionar los valores más altos de una variable)
>>> >
>>> > yo usaría dplyr::slice_max(). Creo que eso debería ser rápido y con el
>>> >
>>> > filtro hecho lo demás debería ser trivial. Si he entendido bien el 
>>> > problema.
>>> >
>>> > Un saludo,
>>> >
>>> > Emilio
>>> >
>>> > El 13 dic 2020, a las 15:31, Carlos Santos carlossantos@gmail.com
>>> >
>>> > escribió:
>>> >
>>> > Perdón Carlos, con las prisas se me olvidó por completo añadir lo que
>>> >
>>> > > faltaba, tienes toda la razón
>>> > >
>>> > > Supongamos que tenemos esta matriz, se quiere conseguir para el mayor
>>> > >
>>> > > valor por fila tomar el valor de la posición que ocupa la primera
>>> > >
>>> > > columna "Var" en base a la columna elegida y si hay varios valores
>>> > >
>>> > > máximos iguales, entonces ejecutar la función "f5" para elegir una y

Re: [R-es] Como puedo reducir el tiempo de ejecución en la siguiente rutina

2020-12-14 Por tema l.graco--- via R-help-es
Te quería echar una mano pero no veo el objetivo del proceso.

A ver si lo voy entendiendo: "Supongamos que tenemos esta matriz, se quiere 
conseguir para el mayor valor por fila tomar el valor de la posición que ocupa 
la primera columna "Var" en base a la columna elegida y si hay varios valores 
máximos iguales, entonces ejecutar la función "f5" para elegir una y según 
valor máximo obtenido proceder de la misma manera que antes."

¿Con eso quieres decir que buscas en la fila el valor máximo de las columnas 
MX... (supongamos que es la columna MZ) y seleccionas el valor de la columna 
var que ocupa dicha posición (la posición Z en este caso?. ¿Y en caso de varios 
máximos eliges una de las columnas candidatas mediante la función f5?. Y esa 
función f5 contiene una llamada a cohend, nada más.

No sé, no acabo de entender la lógica de todo el proceso. Pero así, a oscuras, 
data.table es más eficiente manejando grandes volúmenes de datos y hacer un 
repeat tal vez no sea lo más rápido, sino aplicar vectorización allá donde se 
pueda.

Siento no poder ayudar más. Ánimo.

‐‐‐ Original Message ‐‐‐

El lunes, 14 de diciembre de 2020 a las 10:31, Carlos Santos 
 escribió:

> gracias Emilio por tu ayuda, la selección es por fila, no por variable
>
> He intentado discriminar cuando solo encuentra una posición en la fila que
>
> es el máximo, pero el ahorro de tiempo no es mucho aunque algo es algo
>
> Creo que el tiempo se consume en la parte del ELSE, y aunque entiendo que
>
> se tiene que leer toda la matriz fila a fila, no veo cómo hacer que consuma
>
> menos tiempo
>
> Solo me quedaría probar dividir la matriz en trozos, para ver si en proceso
>
> paralelo podría consumir menos tiempo, ya que cada fila es independiente de
>
> otra fila.
>
> if (smc == 1) {
>
> data1$Clus.Multi.OPTIMO[fila] <-
>
> data1$Clus.Multi.MAX[max(data2[fila,(3:(rr+2))])]
>
> } else {
>
> RECEPTOR$clus <-
>
> data2[which(as.vector(t(data2[fila,])[,1])==max(data2[fila,(3:(rr+2))]))-2,1][1]$Var
>
> RECEPTOR$dist <- mclapply((1:smc),f5) %>% unlist()
>
> data1$Clus.Multi.OPTIMO[which(data1$Clus.Multi.MAX == EMISOR)] <-
>
>
> RECEPTOR[which.max(RECEPTOR[,2]),1]
>
> }
>
> Muchas gracias de nuevo Emilio
>
> Un saludo
>
> El lun, 14 dic 2020 a las 8:08, Emilio L. Cano (emilopezc...@gmail.com)
>
> escribió:
>
> > Hola,
> >
> > Para la primera parte (seleccionar los valores más altos de una variable)
> >
> > yo usaría dplyr::slice_max(). Creo que eso debería ser rápido y con el
> >
> > filtro hecho lo demás debería ser trivial. Si he entendido bien el problema.
> >
> > Un saludo,
> >
> > Emilio
> >
> > El 13 dic 2020, a las 15:31, Carlos Santos carlossantos@gmail.com
> >
> > escribió:
> >
> > Perdón Carlos, con las prisas se me olvidó por completo añadir lo que
> >
> > > faltaba, tienes toda la razón
> > >
> > > Supongamos que tenemos esta matriz, se quiere conseguir para el mayor
> > >
> > > valor por fila tomar el valor de la posición que ocupa la primera
> > >
> > > columna "Var" en base a la columna elegida y si hay varios valores
> > >
> > > máximos iguales, entonces ejecutar la función "f5" para elegir una y
> > >
> > > según valor máximo obtenido proceder de la misma manera que antes.
> > >
> > > El problema es cuando tengo matrices de 3000x3000 o 1x1, y
> > >
> > > además los dígitos de la columna primera son superiores al puesto en este
> > >
> > > ejemplo, entonces el tiempo de calculo es excesivo.
> > >
> > > 
> > >
> > > codigo:
> >
> > > f5 <- function(x){data1 %>% filter(Clus.Multi.OPTIMO %in%
> > >
> > > c(EMISOR,RECEPTOR[x])) %>%
> > >
> > > dplyr::select(1:numvar+1) %>% data.matrix() %>% CohenD()}
> > >
> > > fila = 1
> > >
> > > rr = nrow(data2)
> > >
> > > data1 <- data1 %>% mutate(Clus.Multi.OPTIMO=Clus.Multi.MAX)
> > >
> > > repeat{
> > >
> > > smc <-
> > >
> > > sum(data2[fila,((2+fila):(nrow(data2)+2))]==max(data2[fila,((2+fila):(nrow(data2)+2))]))
> > >
> > > EMISOR <- data2[fila,1]$Var
> > >
> > > RECEPTOR <-
> > >
> > > data2[which(as.vector(t(data2[fila,])[,1])==max(data2[fila,((2+fila):(nrow(data2)+2))]))-2,1]$Var
> > >
> > > Rmax <- RECEPTOR[mclapply((1:smc),f5) %>% unlist() %>% which.max()]
> > >
> > > data1$Clus.Multi.OPTIMO[which(data1$Clus.Multi.MAX ==
> > >
> > > data2[fila,1]$Var)] <- Rmax
> > >
> > > fila = fila + 1
> > >
> > > if (fila == rr) {break}
> > >
> > > }
> >
> > > https://www.avast.com/sig-email?utm_medium=email_source=link_campaign=sig-email_content=webmail
> > >  Libre
> > >
> > > de virus. www.avast.com
> > >
> > > https://www.avast.com/sig-email?utm_medium=email_source=link_campaign=sig-email_content=webmail
> > >
> > > El dom, 13 dic 2020 a las 12:49, Carlos Ortega (c...@qualityexcellence.es)
> > >
> > > escribió:
> > >
> > > > Hola,
> > > >
> > > > Mejor si pones un ejemplo de tu matriz y cuentas lo que quieres hacer...
> > > >
> > > > El enfoque puede ser muy diferente al que has planteado.
> > > >
> > > > Gracias,
> > > >
> > > > Calros Ortega
> > > >
> > > > 

Re: [R-es] En R.4.03 no corre el comando plot.design

2020-12-10 Por tema l.graco--- via R-help-es
Como alternativa:
Léelo mediante red_csv o read_delim, usando las funciones de readr y especifica 
en el parámetro col_types que es una columna de tipo col_factor().
En la documentación tienes ejemplos: 
https://readr.tidyverse.org/reference/read_delim.html

‐‐‐ Original Message ‐‐‐

El jueves, 10 de diciembre de 2020 a las 10:56, Marcelino de la Cruz Rot 
 escribió:

> Prueba$TRATAMIENTO <- factor(Prueba$TRATAMIENTO)
>
> El 10/12/2020 a las 10:44, Juan Bautista escribió:
>
> > Muchas gracias Carlos.
> >
> > Efectivamente lo he comprobado …y tienes razón.
> >
> > La columna “TRATAMIENTO” no me la lee como “Factor” si no como
> >
> > “Character”.
> >
> > Estoy intentando cambiar para que me aparezca como “Factor” Dos formas
> >
> > que he probado no me han funcionado. Alguna sugerencia?
> >
> > Gracias Otra vez
> >
> > Un saludo.
> >
> > Juan Bautista Relloso Barrio
> >
> > Coordinador de Equipos e Infraestructuras | Técnico de Cultivos del
> >
> > Departamento de Producción Vegetal
> >
> > Talde eta Azpiegitura Koordinatzailea | Laborantza teknikaria Landare
> >
> > Ekoizpen Departamentua
> >
> > jbauti...@neiker.eus mailto:jbauti...@neiker.eus| M. 688 62 98 14
> >
> > www.neiker.eus http://www.neiker.eus/
> >
> > https://www.linkedin.com/company/neiker/
> >
> > https://twitter.com/neiker_BRTA**
> >
> > https://www.facebook.com/neikerBRTA
> >
> > https://www.youtube.com/user/neikertec**
> >
> > ej_ekonomia_garapen_lateral
> >
> > https://www.emakunde.euskadi.eus/contenidos/informacion/violencia_puntolila/eu_def/adjuntos/punto.lila.jpg
> >
> > **
> >
> > PRIBATUTASUN POLITIKA https://neiker.eus/eu/pribatutasun-politika/|
> >
> > POLÍTICA DE PRIVACIDAD https://neiker.eus/es/politica-privacidad/|
> >
> > LEGAL NOTICE https://neiker.eus/en/privacy-policy/__
> >
> > De: Carlos Ortega c...@qualityexcellence.es
> >
> > Enviado el: jueves, 10 de diciembre de 2020 10:17
> >
> > Para: Juan Bautista jbauti...@neiker.eus
> >
> > CC: Proyecto R-UCA r-...@uca.es; r-help-es@r-project.org
> >
> > Asunto: Re: [R-es] En R.4.03 no corre el comando plot.design
> >
> > Hola,
> >
> > Desde la 4.0 R al importar un dataset, ya no convierte los "strings" a
> >
> > "factors" y ese es el error que tienes. Sospecho que la columna
> >
> > "TRATAMIENTO" no es factor y aparece el error.
> >
> > Comprueba la clase de las columnas en la 3.63 antes de entrar en el
> >
> > plot y lo mismo con la 4.03.
> >
> > Gracias,
> >
> > Carlos Ortega
> >
> > www.qualityexcellence.es http://www.qualityexcellence.es
> >
> > El jue, 10 dic 2020 a las 10:02, Juan Bautista ( >
> > mailto:jbauti...@neiker.eus>) escribió:
> >
> > Hola a todos.
> > Acabo de instalar la versión de R 4.03 y hay un comando que no
> > corre. Me dá un mensaje de error que no se descifrar
> > Este es el comando:
> > plot.design( PESO ~ TRATAMIENTO, data=Prueba, ylab="PESO",
> > col.lab="blue", col.axis="red", cex.axis=0.4)
> > Y el mensaje de error que me da es este:
> > Error in .plot.des(xf, ydata[, j], fun = fun, ylab = ylab[j], ylim
> > = ylim,  :
> >   all columns/components of 'x' must be factors
> >
> > Lo que me fastidia es que el mismo comando sin cambiar nada en R
> > 3.63 corre perfectamente sin ningún problema
> > ¿Puede que me falte algún paquete o librería de cargar?
> >
> > Un saludo.
> > Juan Bautista Relloso Barrio
> > Coordinador de Equipos e Infraestructuras | Técnico de Cultivos
> > del Departamento de Producción Vegetal
> > Talde eta Azpiegitura Koordinatzailea | Laborantza teknikaria
> > Landare Ekoizpen Departamentua
> > jbauti...@neiker.eus  | M. 688 62 98 14
> > www.neiker.eus 
> >
> >
> > PRIBATUTASUN POLITIKA | POLÍTICA DE PRIVACIDAD | LEGAL NOTICE
> >
> > -Mensaje original-
> > De: R-help-es  > > En nombre de Proyecto R-UCA
> > Enviado el: viernes, 27 de noviembre de 2020 10:08
> > Para: r-help-es@r-project.org 
> > Asunto: Re: [R-es] Cargar data frame en app shiny
> >
> > Hola:
> >
> > ¿Has comprobado los permisos de las carpetas padre?
> >
> > Ten en cuenta que shiny tal vez se esté ejecutando por algún
> > usuario de sistema con privilegios restringidos como www-data o
> > similar.
> >
> > Un saludo.
> >
> > ___
> > R-help-es mailing list
> > R-help-es@r-project.org 
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> > 
> >
> > ___
> > R-help-es mailing list
> > R-help-es@r-project.org 
> > https://stat.ethz.ch/mailman/listinfo/r-help-es
> > 
> >
> >
> > --
> >
> > Saludos,
> >
>