Open Asanfe opened 8 months ago
Buenos días, Alejandro.
Este fin de semana estuve repasando el tema de la jerarquía. A partir de la función import.wimp he intentado, tal como nos indicaste, obtener los vectores IN (cambio de un constructo cuando el resto cambia). Vector OUT (cuanto cambio genera un constructo sobre el resto de constructos). Número de cambios, acumulado de puntuaciones directa que cambian y acumulado standarizado.
Para describir la jerarquía, entiendo que tenemos que presuponer que los constructos jerárquicamente superiores no se verán afectado por las variaciones de otros subordinados, y que estos al ser superiores afectarán y generarán variaciones en los subordinados.
Condiciones necesarias de un constructo supra ordenado, superior en la jerarquía de constructos. 1.- El constructo supra ordenado tendrá mínima afectación por los subordinados. Recibe pocos IN.
IN cero o muy bajo no tiene porque representar centralidad podría mostrar independencia respecto al resto de constructos o que se trata de un constructo muy impermeable y específico.
Si realmente, IN fuera mas influyente en la centralidad que OUT, podríamos dividir el vector IN por el vector OUT, para obtener en qué medida se ve afectado in/out el constructo. Valores bajos del índice por ejemplo por debajo de 0,40/0,30 podría indicar centralidad. Por encima de un determinado valor indicaria que es subordinado/periférico. Los índices también se podrían sacar en función del total de variación. OUT del constructo/todos los OUT. IN del construtos/todos los IN. Nuevo IN/OUT dividido por el número de elementos.
wimp$vector_core_IN_pd[[1]] <- vector_core_IN_acum wimp$vector_core_OUT_pd[[2]] <- vector_core_OUT_acum wimp$core_pd[[3]] <- matriz_IN_OUT_acum_indice names(wimp$core_pd) <- c("matriz core pd","IN core pd","OUT core pd")
wimp$vector_core_IN_stn[[1]] <- vector_core_IN_stn wimp$vector_core_OUT_stn[[2]] <- vector_core_OUT_stn wimp$core_stn[[3]] <- matriz_IN_OUT_stn_indice names(wimp$core_stn) <- c("matriz core stn","IN core stn","OUT core stn") Vaya rollo he contado. Saludos.
De: Alejandro Sanfeliciano @.> Enviado: miércoles, 7 de febrero de 2024 10:47 Para: GICUNED/GridFCM.practicum @.> Cc: FRANCISCO GIL MORENTE @.>; Assign @.> Asunto: [GICUNED/GridFCM.practicum] Planteamiento Teórico de las Funciones de Centralidad (Issue #3)
La tarea consiste en:
Detalles y comentarios:
Si necesitáis repasar conmigo @.***https://github.com/Asanfe) la teoría sobre jerarquía y presencialidad, estoy abierto a dudas y a quedar por videoconferencia para charlar sobre el tema largo y tendido.
Respecto a la definición de las funciones buscamos establecer lo siguiente:
— Reply to this email directly, view it on GitHubhttps://github.com/GICUNED/GridFCM.practicum/issues/3, or unsubscribehttps://github.com/notifications/unsubscribe-auth/BFQ6PKA3PCGFFJO76QQF74LYSNESLAVCNFSM6AAAAABC5PYRKWVHI2DSMVQWIX3LMV43ASLTON2WKOZSGEZDENRRGE4DSNI. You are receiving this because you were assigned.Message ID: @.***>
Hola @Fgil77, no termino de entender algunas cosas que planteas. Mañana si después de la reunión tienes un momento y podemos comentarlo sería perfecto.
Revisa la función degree_index()
que está ubicada en R/WimpIndicesFunctions.R. Esa función te permite sacar el número de Ins y Outs de cada constructo. Además, tiene el parámetro method
que lo puedes igualar a "weight" y en vez de sacarte el número directo de Ins y Outs, te muestra el sumatorio ponderado.
Y lo que planteas de dividir entre variaciones totales, puede ser una buena idea para dar valores estandarizados a estos índices. Podemos conocer el número de variaciones contando el número total de aristas del grafo, que sería igual a la cantidad de elementos distintos de 0 en la matriz de pesos.
Hola,
En cuanto a la función de centralidad, creo que podrían tener:
Para hacer el cálculo con pesos, para una wimp, hay una función con la que ya podríamos tener los In y los Out de cada constructo (degree_index). Algo como:
# Conectividad de los constructos c.io <- GridFCM.practicum::degree_index(wimp)
# Intercambiamos las columnas In (originalmente 2) y Out (originalmente 1) de orden c.io <- c.io[, c(2,1,3)]
Si aplicamos la transformación lineal que indicaba Alejandro:
coef <- 0.5 * sqrt(2) mat.proy <- matrix(c(coef, coef, -coef, coef), nrow = 2, byrow = TRUE)
..el cálculo del producto para obtener p y j con constructo sería bastante directo.
En cuanto a la estandarización, podríamos hacer pruebas, pero también sería una posible estrategia dividir la matriz de p's y j's por el máximo valor que se tenga de la suma de entradas y salidas en un constructo (el máximo All de la función degree_index(wimp)
Si en la función aceptamos el parámetro de incorporar los pesos, también hay opciones que te ponderan el cálculo (argumento method) en degree_index
Me he cruzado el mensaje contigo, Alejandro..
Perdonad, que puesto también una almohadilla en un minifragmento de código sin darme cuenta que aquí lo iba a interpretar como Markdown (título de nivel 1)
@churtado-gh bien planteada la idea, en el issue #6 he dejado un ejemplo de cómo podríamos plantear las nuevas funciones a desarrollar. Cuando @Fgil77 y tu tengáis coordinada la idea para esa función podéis crear un nuevo issue parecido a #6 y dejar ahí bien definida de forma teórica la función.
Los mensajes que se ponen por aquí se pueden editar siempre que queramos, @churtado-gh si quieres puedes editar tu comentario y arreglar el problema de la almohadilla.
Reflexionando, además del cálculo de estos dos índices de jerarquía y centralidad, tal y cómo os lo plantee el otro día. A lo mejor también sería interesante explorar la centralidad por vector propio y ver si realmente tiene algún tipo de sentido psicológico. Ya que la centralidad por vector propio ponderaría si las conexiones que tiene son a otros constructos centrales o perífericos.
Si tenéis tiempo, yo echaría un vistazo también a la centralidad por vector propio para en un futuro ver si tiene sentido expresar la centralidad a través de ese valor o no.
Hecho lo del comentario ('#'). Y ok! vamos a echarle un vistazo a un resultado con "eigenvectors", y si pudiera ser interesante, quizá también la adecuación de los constructos a una distribución chi-cuadrado según distancia de Mahalanobis...
...y a lo mejor, para "ver", podríamos ver cómo se agrupan por clustering los constructos en un espacio de In-Outs con pesos, y en el espacio transformado este que propones de p's y j's..
Alejandro, proponemos una línea de unas primeras funciones:
Nombre de la función: wimp_ph_matrix()
Objetivo de la función: Obtener la presencialidad (P, frecuencia con la que aparece) y jerarquía (H, influencia sobre otros) de los constructos asociados a una rejilla de implicaciones.
Parámetros de la función: • wimp (S3 wimp): WimpGrid de entrada para cuyos constructos calcularemos presencialidad y jerarquía • method: método para calcular el grado de conexiones de los constructos (directo, normalizada, ponderada), que influirá en los P y H resultado
Salida de la función: Matriz que contiene, por filas, los constructos del objeto wimp de entrada; y por columnas, los valores de P (Presencialidad) y H (Jerarquía) asociados a cada constructo según la rejilla de implicaciones dada Requisitos previos al desarrollo: Función GridFCM.practicum::degree_index que proporciona el grado de conexiones de cada constructo con el resto (entrada, salida, total)
Comentarios: • Los valores de P y H se estandarizarán dividiendo por el máximo valor de conexiones presente para un constructo del grafo
Pseudocódigo:
Extraer matrix de grado de conexiones con entradas, salidas y totales, según el método indicado en method, de los constructos de la rejilla wimp
Para cada constructo Calcular P como producto escalar de los vectores (0.5sqrt(2),0.5sqrt(2) y (cin , cout) Calcular H como producto escalar de los vectores (-0.5sqrt(2),0.5sqrt(2)) y (cin , cout)
Estandarizar P y H dividiendo por max(conexiones(ci))
Crea matriz whp.mat con columnas P y H por constructo
Devolver matriz whp.mat
Nombre de la función: wimp_centr_eigvectors()
Objetivo de la función: Obtener una medida de centralidad basada en vectores propios. Para cada constructo, obtener la componente asociada del primer vector propio en la matriz de covarianzas del espacio P – H de la matriz de implicaciones
Parámetros de la función: • wimp (S3 wimp): WimpGrid de entrada para cuyos constructos calcularemos la medida de centralidad
Salida de la función: Matriz con los constructos asociados a wimp por filas, y una columna con el primer vector propio de la matriz de covarianzas, que estará asociada a la dirección de mayor variabilidad
Requisitos previos al desarrollo: Función eigen que calcule los vectores y valores propios de una matriz numérica
Comentarios: • Tomaremos como matriz de adyacencia, la matriz covarianzas de la matriz de implicaciones del objeto wimp
Pseudocódigo: Definir matrix de adyacencia, tomada como la matriz de covarianzas de la matriz de matriz de implicaciones del objeto wimp
Calcular los vectores propios de la matriz de adyacencia Extraer el vector propio principal (primer vector) Crea matriz ev.mat con columna del vector propio principal, teniendo el componente de cada constructo por filas
Devolver matriz ev.mat
Nombre de la función: wimp_centr_mahalanobis()
Objetivo de la función: Obtener una medida de centralidad de los constructos basada en la distancia de Mahalanobis en el espacio transformado de coordenadas P - H
Parámetros de la función: • wimp (S3 wimp): WimpGrid de entrada para cuyos constructos calcularemos la distancia de Mahalanobis
Salida de la función: Matriz con los constructos asociados a wimp por filas, y por columnas, sus datos asociados de coordenadas P, H y la distancia de Mahalanobis en este espacio vectorial
Requisitos previos al desarrollo: Función wimp_ph_matrix , que proporciona las coordenadas de los constructos en el espacio P-H
Comentarios:
Pseudocódigo:
Obtener la matriz de constructos con coordenadas P-H
Para la matriz de los constructos que contiene sus componentes P - H Calcular la matriz de covarianzas de la matriz Calcular el vector de medias de la matriz
Calcular la distancia de Mahalanobis, con centro el vector de medias, y la matriz de covarianzas calculada anteriormente
Crea matriz dm.mat con columna del vector propio principal, teniendo el componente de cada constructo por filas
Devolver matriz dm.mat
Aparte, tenemos una serie de cuestiones, para desarrollar las funciones y proponer otras:
Si te parecen bien los puntos primordiales de las funciones, podemos:
En cuanto pueda os reviso las funciones que habéis planteado.
Respecto a las cuestiones que habéis planteado:
Hola @churtado-gh @Fgil77, Las funciones que planteáis me parecen perfectas, muy buen trabajo!!
Os dejo una serie de comentarios:
A lo mejor para el cálculo de la centralidad por eigenvector se podría utilizar la matriz de pesos como matriz de adyacencia. Esta matriz al fin y al cabo es la que utilizamos para construir el grafo.
También respecto a los nombres de la funciones para manterner la coherencia respecto al resto del código, me gusta más la idea de llamarlas index_ph(), index_eigen() y index_phmahalanobis().
A lo hora de construir los diagramas de puntos, una serie de indicaciones que podrían ser apropiadas: (a) Dibujar con una linea o un sombreado donde los vectores PH no pueden caer , (b) Acoger el estilo lo más parecido posible a otros plots de PsychLab, (c) Insertar leyenda dinámica para poder seleccionar orientación al ideal, (d) Introducir quizás también interacción dinámicas para poder seleccionar/colorear los puntos del plot en función de la centralidad por eigenvector y mahalanobis.
Respecto a la estandarización del espacio PH, he estado haciendo cálculos y si intento maximizar los posibles valores de PH en función de N, me sale que la P máxima es (n-1)*2*sqrt(2)
y la H máxima es (n-1)*sqrt(2)
(siendo n el número de vértices). Esto es una idea, pero tengo en mente otras normalizaciones. A lo mejor creo otro Issue para discutir este tema y ponemos todas las propuestas en común.
Esto no es del todo obligatorio, pera para llevar un mejor registro de lo que se va implementando y no, si podéis llevar cada una de las propuestas de función a un Issue independiente para ellas con el título de "Desarrollo de función para [objetivo de la función] y así los vamos cerrando según los vayamos completando.
Cuando podáis id implementando el código dentro del repositorio y así puedo ir haciendo pruebas con él. Si teneís alguna duda de github, aquí estoy para lo que sea.
Un abrazo!
La tarea consiste en:
Detalles y comentarios:
Si necesitáis repasar conmigo (@Asanfe) la teoría sobre jerarquía y presencialidad, estoy abierto a dudas y a quedar por videoconferencia para charlar sobre el tema largo y tendido.
Respecto a la definición de las funciones buscamos establecer lo siguiente:
Utilizar el foro de este Issue para comentar cualquier cosa sobre esta tarea.