<jupyter_start><jupyter_text>Datos de MBI<jupyter_code>load("Datos_MBI.RData")<jupyter_output><empty_output><jupyter_text>Asegurarnos que la importación fue exitosa. Ver qué clase de objeto son los datos y así.<jupyter_code>dim(mbi)
head(mbi)
colnames(mbi)
class(mbi)<jupyter_output><empty_output><jupyter_text>Los items no están ordenados tal cual si indica el BMI:* Item 1. Me siento emocionalmente agotado por mi trabajo.* Item 2. Me siento cansado al final de la jornada de trabajo.* Item 3. Me siento fatigado cuando me levanto por la mañana y tengo que enfrentarme con otro día de trabajo.* Item 4. Fácilmente comprendo cómo se sienten los clientes/pacientes.* Item 5. Creo que trato a las otras personas como si fuesen objetos impersonales.* Item 6. Trabajar todo el día con mucha gente es un esfuerzo.* Item 7. Trato eficazmente los problemas de los demás.* Item 8. Siento que mi trabajo me está desgastando.* Item 9. Creo que estoy influyendo positivamente, con mi trabajo, en la vida de los demás.* Item 10. Me he vuelto más insensible con la gente desde que ejerzo esta profesión.* Item 11. Me preocupa el hecho de que este trabajo me esté endureciendo emocionalmente.* Item 12. Me siento muy activo.* Item 13. Me siento frustrado con mi trabajo.* Item 14. Creo que estoy trabajando demasiado.* Item 15. No me preocupa lo que le ocurra a los clientes/pacientes.* Item 16. Trabajar directamente con los demás me produce estrés.* Item 17. Fácilmente puedo crear una atmósfera relajada con los clientes/pacientes.* Item 18. Me siento estimulado después de trabajar en contacto con los clientes/pacientes.* Item 19. He conseguido muchas cosas útiles en mi profesión.* Item 20. Me siento como si estuviera al límite de mis posibilidades.* Item 21. En mi trabajo trato los problemas que se me presentan con mucha calma.* Item 22. Creo que mis clientes/pacientes me culpan de alguno de sus problemas.Ahora creamos un color de vectores. Identificamos los 9 ítems del **Agotamiento Emocional** con el color verde, los 8 de **Autoestima** con el color azul y los ítems de **Despersonalización** con el color naranja.<jupyter_code>colores = c(rep("green", 9), rep("blue", 8), rep("orange", 5))
colores<jupyter_output><empty_output><jupyter_text>Análisis factorial<jupyter_code>library(corrplot)
cmbi = cor(mbi)
corrplot(cmbi)
FA_mbi = factanal(mbi, factors = 3, rotation = "none")
FA_mbi
saturaciones = FA_mbi$loadings[, 1:3]
saturaciones<jupyter_output><empty_output><jupyter_text>Color verde es agotamiento personal,<jupyter_code>FA1 = barplot(saturaciones[,1],
              ylim = c(-0.6, 0.8),
              names.arg = colnames(mbi),
              cex.names = 0.6,
              col = colores,
              main = "Factor 1")
FA2 = barplot(saturaciones[,2],
              ylim = c(-0.2,0.8),
              names.arg = colnames(mbi),
              cex.names = 0.6,
              col = colores,
              main = "Factor 2")
FA3 = barplot(saturaciones[,3],
              ylim = c(-0.4,0.6),
              names.arg = colnames(mbi),
              cex.names = 0.6,
              col = colores,
              main = "Factor 3")<jupyter_output><empty_output><jupyter_text>Prácticamente todas las saturaciones más altas están en el primer factor. No aparece ninguna variable especialmente relevante en la formación de los factores. No existe una interpretación clara de los ejes comunes que nos lleve a identificar de forma segura los ítems que conforman cada una de las escalas de las que hablaban los autores. Aun así, podemos identificar el primer factor como el agotamiento emocional y el segundo como la autoestima. Sin embargo, en todas ellas aparecen variables (ítems) con saturaciones también “importantes” que no se tendrían en cuenta si siguiésemos la estructura latente teórica. El análisis Factorial sobre esta matriz de datos no identifica de manera clara la estructura teórica buscada no se trata de un buen modelo factorial. La despersonalización no aparece recogida en ninguna dimensión latente.  Rotación varimax¿Qué estructura puede adivinarse para el MBI en la muestra de farmacéuticos ahora?<jupyter_code>FA_mbi_varimax = factanal(mbi, factors = 3, rotation = "varimax")
FA_mbi_varimax
barplot(FA_mbi_varimax$loadings[,1],
        ylim = c(-0.4,1),
        names.arg = colnames(mbi),
        cex.names = 0.6,
        col = colores,
        main = "Factor 1 Varimax")
barplot(FA_mbi_varimax$loadings[,2],
        ylim = c(-0.4,0.8),
        names.arg = colnames(mbi),
        cex.names = 0.6,
        col = colores,
        main = "Factor 2 Varimax")
barplot(FA_mbi_varimax$loadings[,3],
        ylim = c(-0.6,0.8),
        names.arg = colnames(mbi),
        cex.names = 0.6,
        col = colores,
        main = "Factor 3 Varimax")<jupyter_output><empty_output><jupyter_text>Si observamos la matriz de saturaciones rotadas, aunque la interpretación no es del todo fácil, se ha mejorado con respecto al caso anterior. Puede identificarse el primer factor de agotamiento y el segundo de autoestima. Sin embargo, este método falla en la identificación del tercer factor como la escala de la despersonalización, pues las saturaciones que definen el factor no coinciden con los ítems que definían la escala según los autores. La dimensión de la despersonalización no es clara en el colectivo de los farmacéuticos. Esto se debe a que no existe variabilidad en los ítems de dicha latente en esta muestra de sujetos.  Análisis de Componentes Principales sin rotaciónEl ACP se implementa mediante la función `prcomp`:<jupyter_code>PCAmbi = prcomp(mbi)<jupyter_output><empty_output><jupyter_text>La matriz de cargas está almacenada bajo el nombre de `rotation`:<jupyter_code>matrizcargas = PCAmbi$rotation[, 1:3]<jupyter_output><empty_output><jupyter_text>Obtenemos el `screeplot`:<jupyter_code>plot(PCAmbi)<jupyter_output><empty_output><jupyter_text>Aunque en nuestro caso hemos seleccionado inicialmente 3 factores, existen distintos para seleccionar el número adecuado. El hecho de que un valor propio esté claramente separado del que le precede y del que le sigue, es señal de que el eje que le corresponde está bien separado y es razonable buscar la interpretación de ese eje. Con este razonamiento respaldamos nuestra elección inicial de tres dimensiones factoriales.Se analiza la matriz de cargas factoriales, representando gráficamente el valor de las mismas para cada componente principal mediante un diagrama de barras:<jupyter_code>PCA1 = barplot(PCAmbi$rotation[,1],
               ylim = c(-0.6,0.8),
               names.arg = colnames(mbi),
               cex.names = 0.5,
               col = colores,
               main = "PC 1")
PCA2 = barplot(PCAmbi$rotation[,2],
               ylim = c(-0.2, 0.8),
               names.arg = colnames(mbi),
               cex.names = 0.5,
               col = colores,
               main = "PC 2")
PCA3 = barplot(PCAmbi$rotation[,3],
               ylim = c(-0.4, 0.6),
               names.arg = colnames(mbi),
               cex.names = 0.5,
               col = colores,
               main = "PC 3")<jupyter_output><empty_output><jupyter_text>Al igual que ocurría en el Análisis Factorial, la interpretación de las cargas obtenidas tampoco es clara. Para facilitar la interpretación, podría establecerse un umbral por debajo del cual considerar cargas como nulas sin serlo (es decir, realizar una selección manual de las características, a diferencia del Análisis de Componentes Principales Sparse que veremos más adelante). Sin embargo, no todos los ítems establecidos por los autores cargan en la escala definida. La estructura vuelve a no ser clara.  ACP con elasticnetSe realiza un Análisis de Componentes Principales Sparse, haciendo uso de la función spca de la librería elasticnet, reteniendo 3 componentes principales e imponiendo el número de cargas no nulas que debe aparecer en cada una de las componentes sparse (9,8 y 5 respectivamente).La función `spca` trabaja sobre la matriz de correlaciones de los datos de partida. El número de componentes sparse a retener se indica mediante el argumento `K`, el tipo de datos con el que trabajamos mediante el argumento type (`type=”gram”` indica que la matriz de partida es una matriz de correlaciones). Como se desea restringir el número de cargas no nulas de cada componente debe utilizarse el argumento `sparse=”varnum”`. Por último, el número de cargas no nulas deseadas en cada dimensión se indica en el argumento para:<jupyter_code>library(elasticnet)
 spca1 = spca(cor(mbi),
              K = 3,
              type = "Gram",
              sparse = "varnum",
              trace = TRUE,
              para = c(9, 8, 5))<jupyter_output>iterations 10
iterations 20
iterations 30<jupyter_text>El porcentaje de varianza que retienen ahora dichas componentes y su estructura se obtiene analizando la matriz de cargas<jupyter_code>spca1<jupyter_output><empty_output><jupyter_text>El porcentaje de varianza explicada puede observarse en:<jupyter_code>spca1$pev<jupyter_output><empty_output><jupyter_text>Las componentes sparse retienen un 20.2%, 14% y 6.4% de varianza respectivamente. En total absorben un 40.6% de la varianza de los datos. Este porcentaje es menor al de las técnicas clásicas. Sin embargo, la interpretación de la matriz de cargas es más sencilla. Representando las cargas de cada componente:<jupyter_code>SPC1 = barplot(spca1$loadings[,1],
               ylim = c(-0.6, 0.8),
               names.arg = colnames(mbi),
               cex.names = 0.4,
               col = colores,
               main = "SPC 1")
SPC2 = barplot(spca1$loadings[,2],
               ylim = c(-0.6, 0.8),
               names.arg = colnames(mbi),
               cex.names = 0.4,
               col = colores,
               main = "SPC 2")
SPC3 = barplot(spca1$loadings[,3],
               ylim = c(-0.6, 0.8),
               names.arg = colnames(mbi),
               cex.names = 0.4,
               col = colores,
               main = "SPC 3")<jupyter_output><empty_output><jupyter_text>Ahora, la primera componente sparse está conformada claramente por ítems del Agotamiento, la segunda representa la Autoestima y la tercera la Despersonalización. A diferencia de las técnicas clásicas, que trabajaban maximizando la varianza, el sparse ACP es capaz de identificar la despersonalización.  Sparse PCA reteniendo 3 componentes principalesImponiendo ahora una penalización de 0.15 a la primera componente, 0.2 a la segunda y 0.3 a la tercera, para conseguir anular algunas de las cargas. Interprete los resultados obtenidos.Ahora es necesario cambiar el argumento `sparse`, para indicarle que en este caso se penalizará mediante un factor de regularización las cargas de cada componente. En el argumento `para` se indica ahora el factor de penalización para cada componente:<jupyter_code>spca2 = spca(cor(mbi),
             K = 3,
             type = "Gram",
             sparse = "penalty",
             trace = TRUE,
             para = c(0.15,0.2,0.3))
spca2<jupyter_output>iterations 10
iterations 20
iterations 30<jupyter_text>La estructura factorial obtenida es similar y siguen identificándose las tres componentes sparse.Ahora, modificando el factor de penalización de cada una de las componentes y se analizan las diferencias que encuentra en los resultados. Hay que tomar en cuenta que el factor de penalización siempre debe ser positivo: una penalización de `0` equivaldrá a un Análisis de Componentes Principales clásico y un factor de penalización muy alto hará que todas las cargas sean nulas.<jupyter_code>library(rCUR)<jupyter_output>Loading required package: MASS
Loading required package: Matrix
Loading required package: lattice<jupyter_text>La función CUR trabaja sobre la matriz de datos, cuya clase debe ser `matrix` y no `data.frame`. El número de componentes sobre las que va a calcular la variabilidad de cada variable se indica mediante el argumento `k`. El argumento `c` indica el número de columnas a seleccionar (debe ser siempre, como máximo, (no de variables - 1)) y el argumento `weighted` permite ponderar las componentes calculadas por los valores propios de cada componente. Por último, el argumento `method` permite determinar el método para seleccionar las columnas y/o filas en la descomposición. Se selecciona en esta ocasión el método `"top.scores"`: se seleccionan las filas y/o columnas con mayor *leverage*.<jupyter_code>cur1 = CUR(as.matrix(mbi),
           k = 3,
           c = 21,
           method = "top.scores",
           weighted = TRUE)<jupyter_output><empty_output><jupyter_text>Podemos acceder a los leverage de cada ítem mediante la función:<jupyter_code><EMAIL><jupyter_output><empty_output><jupyter_text>Graficarlos también con `plotLeverage`<jupyter_code>plotLeverage(cur1, ylim = c(0, 150))
text(1:22, <EMAIL> * 1000, labels = colnames(mbi))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07179527069072807, 'fraction_numerical': 0.01734598630989421, 'mean_word_length': 3.6364947710061304, 'pattern_counts': {'":': 0, '<': 76, '<?xml version=': 0, '>': 76, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '19', 'dir': 'jupyter-structured-clean-dedup', 'id': '595495', 'license': 'MIT', 'n_tokens_mistral': 4309, 'n_tokens_neox': 4132, 'n_words': 1527, 'path': 'M8/SparcePCA/practicaSPARSEPCA.ipynb', 'repo_name': 'MiguelHeCa/master_big_data', 'size': '12884'}