CAPÍTULO 4 ANÁLISIS DE LA CORRESPONDENCIA

4.1 INTRODUCCIÓN

El Análisis de Correspondencia (CA) es un método estadístico para analizar las relaciones entre variables categóricas. Extiende el Análisis de Componentes Principales (PCA) para resumir y visualizar datos cualitativos en gráficos bidimensionales. El CA ayuda a explorar asociaciones en tablas de contingencia, que representan las frecuencias de variables categóricas. Calcula puntuaciones de factores para filas y columnas, facilitando la representación gráfica de las asociaciones. El objetivo principal es obtener una visión global de los datos y ayudar en la interpretación. Los paquetes FactoMineR y factoextra de R se utilizan comúnmente para calcular, interpretar y visualizar el CA. El CA puede incorporar filas y columnas suplementarias para análisis predictivos. Es crucial identificar variables importantes que expliquen las variaciones en el conjunto de datos. Los resultados del CA se pueden filtrar para enfocarse en variables significativas y manejar valores atípicos. En general, el análisis de correspondencia es una herramienta poderosa para analizar datos categóricos, proporcionando información a través de la visualización y el resumen en un espacio de menor dimensión.

4.2 INFORMÁTICA

4.2.1 R PAQUETES

Entre las funciones para computar correspondencia de análisis en R están: - CA() [paquete FactoMineR] - ca() [paquete ca] - dudi.coa() [paquete ade4] - corresp() [paquete MASS] - epCA() [paquete ExPosition]

#install.packages(c("FactoMineR", "factoextra"))
library("FactoMineR")
## Warning: package 'FactoMineR' was built under R version 4.3.2
library("factoextra")
## Warning: package 'factoextra' was built under R version 4.3.2
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library("gplots")
## Warning: package 'gplots' was built under R version 4.3.2
## 
## Attaching package: 'gplots'
## The following object is masked from 'package:stats':
## 
##     lowess
library("corrplot")
## Warning: package 'corrplot' was built under R version 4.3.2
## corrplot 0.92 loaded
library("ggpubr")
## Warning: package 'ggpubr' was built under R version 4.3.2
library("ade4")
## Warning: package 'ade4' was built under R version 4.3.2
## 
## Attaching package: 'ade4'
## The following object is masked from 'package:FactoMineR':
## 
##     reconst
library("ExPosition")
## Loading required package: prettyGraphs

4.2.2 DATA FORMAT

Los datos deberían estar en una tabla de contingencia. Para esta tarea usaremos "housetasks". Esta tabla contendrá 13 quehaceres; cada fila es un quehacer distinto, y los valores son la frecuencia de las tareas hechas por diferentes miembros del hogar.

data("housetasks")
#head(housetasks)

4.2.3 GRÁFICO DE TABLAS DE CONTINGENCIA Y PRUEBA CHI-CUADRADO

La visualización de las tablas de contingencia puede darse mediante funciones como "balloonplot" y "mosaicplot".

# 1 convertimos el dataframe a una tabla
dt <- as.table(as.matrix(housetasks))

#2 graficamos
balloonplot(t(dt), main = "housetasks", xlab = "", ylab = "", label = FALSE, show.margins = FALSE)

Para una tabla pequeña, se puede usar la prueba de chi-cuadrado para evaluar si hay una dependencia significativa entre las categorías de las filas y las columnas.

chisq <- chisq.test(housetasks)
chisq
## 
##  Pearson's Chi-squared test
## 
## data:  housetasks
## X-squared = 1944.5, df = 36, p-value < 2.2e-16

4.2.4 CÓDIGO R PARA CALCULAR CA

La función CA() puede ser utilizada. - X: un marco de datos (tabla de contingencia) - ncp: Numero de dimensiones mantenidas en el resultado final. - graph: un valor lógico. Si "TRUE", la gráfica será mostrada.

res.ca <- CA(housetasks, graph = FALSE)

La salida de la función CA() es una lista que incluye:

print(res.ca)
## **Results of the Correspondence Analysis (CA)**
## The row variable has  13  categories; the column variable has 4 categories
## The chi square of independence between the two variables is equal to 1944.456 (p-value =  0 ).
## *The results are available in the following objects:
## 
##    name              description                   
## 1  "$eig"            "eigenvalues"                 
## 2  "$col"            "results for the columns"     
## 3  "$col$coord"      "coord. for the columns"      
## 4  "$col$cos2"       "cos2 for the columns"        
## 5  "$col$contrib"    "contributions of the columns"
## 6  "$row"            "results for the rows"        
## 7  "$row$coord"      "coord. for the rows"         
## 8  "$row$cos2"       "cos2 for the rows"           
## 9  "$row$contrib"    "contributions of the rows"   
## 10 "$call"           "summary called parameters"   
## 11 "$call$marge.col" "weights of the columns"      
## 12 "$call$marge.row" "weights of the rows"

4.3 VISUALIZACIÓN E INTERPRETACIÓN

Las siguientes funciones ayudan en la visualización e interpretación del análisis de correspondencia: - get_eigenvalue(res.ca): extrae los autovalores/varianzas retenidas en cada dimensión (ejes). - fviz_eig(res.ca): visualiza los autovalores. - get_ca_row(res.ca), get_ca_col(res.ca): Extrae los resultados de las filas y columnas. - fviz_ca_row(res.ca), fviz_ca_col(res.ca): Visualiza los resultados de las filas y columnas. - fviz_ca_biplot(res.ca): hace una gráfica doble de filas y columnas.

4.3.1 SIGNIFICACIÓN ESTADÍSTICA

Para poder interpretar correspondencia de análisis, el primer paso es evaluar si hay una dependencia significativa entre filas y columna. Se utiliza chi-cuadrado. Un alto chi-cuadrado significa que hay una fuerte conexión entre filas y columnas.

# estadisticas de chi-square
chi2 <- 1944.456

#grado de libertad
df <- (nrow(housetasks) - 1) * (ncol(housetasks) - 1)

#p-value
pval <- pchisq(chi2, df = df, lower.tail = FALSE)
pval
## [1] 0

4.3.2 VALORES PROPIOS/VARIANZA

Los autovalores y la proporción de varianzas contenidas por los diferentes ejes pueden ser extraídos usando la función "get_eigenvalue".

eig.val <- get_eigenvalue(res.ca)
eig.val
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  0.5428893         48.69222                    48.69222
## Dim.2  0.4450028         39.91269                    88.60491
## Dim.3  0.1270484         11.39509                   100.00000

Los autovalores indican la información retenida por cada eje en el análisis. Las dimensiones se ordenan por varianza explicada. La Dimensión 1 tiene la mayor varianza, seguida por la Dimensión 2 y así sucesivamente. El porcentaje acumulativo se obtiene sumando las proporciones de varianza explicada. Por ejemplo, 48.69% + 39.91% = 88.6%. Las primeras dos dimensiones explican alrededor del 88.6% de la variación. El número de dimensiones a retener depende de la investigación y necesidades del investigador. No hay una regla fija. Una buena reducción de dimensiones ocurre cuando las primeras dimensiones explican una proporción significativa de la variabilidad. En nuestro análisis, las dos primeras dimensiones explican el 88.6% de la variación, un porcentaje aceptablemente alto. El Gráfico de Codo es una forma adicional de determinar el número de dimensiones.

La gráfica puede ser producida usando la función "fviz_eig" o la función "fvis_screeplot".

fviz_screeplot(res.ca, addlabels = TRUE, ylim = c(0, 50))

La tabla contiene 13 filas y 4 columnas.

El código a continuación dibuja la gráfica con una línea bordeada roja especificando los autovalores promedio.

fviz_screeplot(res.ca) + geom_hline(yintercept = 33.33, linetype = 2, color = "red")

Según el gráfico, solo las dimensiones 1 y 2 deben utilizarse en la solución. La dimensión 3 explica solo el 11.4% de la inercia total, por debajo del promedio del autovalor (33.33%) y no aporta lo suficiente para su inclusión en el análisis.

Es posible utilizar más de 2 dimensiones, pero es poco probable que las dimensiones suplementarias contribuyan significativamente a la interpretación de la asociación entre filas y columnas. Las dimensiones 1 y 2 explican aproximadamente el 48.7% y el 39.9% de la inercia total, respectivamente. Esto representa un total acumulativo del 88.6% de la inercia total retenida por las 2 dimensiones. Cuanto mayor sea la retención, más se conservará la sutileza de los datos originales en la solución de baja dimensión (Bendixen, 2003).

4.3.3 BIPLOT

La función fviz_ca_biplot puede ser usada para dibujar la gráfica doble de columnas y filas.

# repel = TRUE para evitar la sobreposicion de texto(lento en varios puntos)
fviz_ca_biplot(res.ca, repel = TRUE)

El gráfico anterior es un gráfico simétrico que muestra un patrón global en los datos. Las filas están representadas por puntos azules y las columnas por triángulos rojos. La distancia entre los puntos de las filas o las columnas refleja su similitud o disimilitud. Los puntos de las filas con perfiles similares están cerca en el mapa factorial, al igual que los puntos de las columnas.

En el gráfico observamos que las tareas del hogar como la cena, el desayuno y la lavandería son realizadas con mayor frecuencia por la esposa. El manejo y las reparaciones son realizados por el esposo. El gráfico simétrico representa simultáneamente los perfiles de las filas y las columnas en un espacio común. Sin embargo, la distancia entre los elementos de las filas y las columnas no tiene un significado concreto, solo se pueden hacer afirmaciones generales sobre el patrón observado.

Para interpretar la distancia entre los puntos de las columnas y las filas, se debe presentar los perfiles de las columnas en el espacio de las filas o viceversa, en un gráfico llamado biplot asimétrico.

El siguiente paso para la interpretación es determinar qué variables de filas y columnas contribuyen más en la definición de las diferentes dimensiones retenidas en el modelo.

4.3.4 GRÁFICO DE VARIABLES DE FILA

4.3.4.1 RESULTADOS

La función get_ca_row devuelve una lista donde están almacenadas las coordinadas, los cos2, la contribución y la inercia de las variables de las filas.

row <- get_ca_row(res.ca)
row
## Correspondence Analysis - Results for rows
##  ===================================================
##   Name       Description                
## 1 "$coord"   "Coordinates for the rows" 
## 2 "$cos2"    "Cos2 for the rows"        
## 3 "$contrib" "contributions of the rows"
## 4 "$inertia" "Inertia of the rows"

Los componentes de esta función pueden ser usados en la graficación de filas como vemos a continuación: - rowcoord:coordenadasdecadapuntoenlafilaencadadimensión(1,2,3).-rowcoord:coordenadasdecadapuntoenlafilaencadadimension(1,2,3). -r-cos2: calidad de de la representación de las filas. - var$contrib: contribución de las filas (en %) para la definición de las dimensiones.

4.3.4.2 COORDENADAS DE LOS PUNTOS DE FILA

Los diferentes componentes pueden ser accedidos de la siguiente manera:

# coordenadas
head(row$coord)
##                 Dim 1      Dim 2       Dim 3
## Laundry    -0.9918368  0.4953220 -0.31672897
## Main_meal  -0.8755855  0.4901092 -0.16406487
## Dinner     -0.6925740  0.3081043 -0.20741377
## Breakfeast -0.5086002  0.4528038  0.22040453
## Tidying    -0.3938084 -0.4343444 -0.09421375
## Dishes     -0.1889641 -0.4419662  0.26694926
#cos2: calidad de el mapa factor
head(row$cos2)
##                Dim 1     Dim 2      Dim 3
## Laundry    0.7399874 0.1845521 0.07546047
## Main_meal  0.7416028 0.2323593 0.02603787
## Dinner     0.7766401 0.1537032 0.06965666
## Breakfeast 0.5049433 0.4002300 0.09482670
## Tidying    0.4398124 0.5350151 0.02517249
## Dishes     0.1181178 0.6461525 0.23572969
# contribucion de los componentes principales
head(row$contrib)
##                 Dim 1    Dim 2    Dim 3
## Laundry    18.2867003 5.563891 7.968424
## Main_meal  12.3888433 4.735523 1.858689
## Dinner      5.4713982 1.321022 2.096926
## Breakfeast  3.8249284 3.698613 3.069399
## Tidying     1.9983518 2.965644 0.488734
## Dishes      0.4261663 2.844117 3.634294
fviz_ca_row(res.ca, repel = TRUE)

fviz_ca_row(res.ca, col.row = "steelblue", shape.row = 15)

La gráfica muestra la relación entre los puntos de las filas: - filas con un perfil similar se agrupan. - filas negativamente correlacionadas son posicionadas en lados opuestos de la gráfica. - la distancia entre los puntos de las filas y el origen mide la calidad de los puntos de la fila en el mapa de factores. Los puntos de las filas que están lejos del origen son bien representadas en el mapa de factores.

4.3.4.3 CALIDAD DE LA PRESENTACIÓN DE LAS FILAS

El análisis de correspondencia logró representar la tabla de contingencia en un espacio de baja dimensión. Las dimensiones 1 y 2 retienen el 88.6% de la variación total en los datos. Sin embargo, no todos los puntos se muestran igual de bien en estas dos dimensiones. La calidad de representación de las filas en el mapa factorial se evalúa mediante el coseno al cuadrado (cos2). Los valores de cos2 van de 0 a 1, y la suma de los cos2 para las filas en todas las dimensiones del análisis es igual a uno. Para resaltar estas diferencias, se puede utilizar una gradación de colores basada en los valores de cos2. En resumen, el análisis de correspondencia logró una representación satisfactoria de la tabla de contingencia en un espacio de baja dimensión, y se puede evaluar la calidad de representación utilizando el cos2 y colores graduados.

# color para los valores de cos2: calidad del mapa factor
fviz_ca_row(res.ca, col.row = "cos2", gradient.cols = c("#00AFBB", "#E7B800","#FC4E07"), repel = TRUE)

#cambio en la transparencia de los valores de cos2 también es posible
fviz_ca_row(res.ca, alpha.row = "cos2")

Se puede visualizar co2 de las filas en todas las dimensiones usando el paquete corrplot.

corrplot(row$cos2, is.corr = FALSE)

también es posible crear un gráfico de barras con los mismos datos.

#cos2 en rondas de la dim.1 y dim.2
fviz_cos2(res.ca, choice = "row", axes = 1:2)

Todos los puntos de las filas excepto "oficial" son representadas correctamente en las primeras dos dimensiones.

4.3.4.4 CONTRIBUCIONES DE LAS FILAS A LAS DIMENSIONES

Es posible usar la función corrplot para resaltar las filas más contribuyentes de cada dimensión.

corrplot(row$contrib, is.corr = FALSE)

La función fviz_contrib puede ser usada para dibujar un gráfico de barra de las contribuciones de las filas.

#contribuciones de filas para la dimension 1
fviz_contrib(res.ca, choice = "row", axes = 1, top = 10)

#contribuciones de filas para la dimension 2
fviz_contrib(res.ca, choice = "row", axes = 2, top = 10)

#contribucion total entre las dimenciones 1 y 2
fviz_contrib(res.ca, choice = "row", axes = 1:2, top = 10)

Se puede observar que: - Repairs, Laundry, Main_meal y Driving son las definiciones más importantes en la primera dimensión. - Holidays y Repairs son las más comunes de la dimensión 2.

Las filas más contribuyentes pueden ser resaltadas individualmente.

fviz_ca_row(res.ca, col.row = "contrib", gradient.cols = c("#00AFBB", "#E7B800","#FC4E07"), repel = TRUE)

Es también posible controlar la transparencia de las filas usando "alpha.row = contrib".

#cambios en la transperencia de los valores de contrib
fviz_ca_row(res.ca, alpha.row = "contrib", repel = TRUE)

4.3.5 GRÁFICO DE VARIABLES DE COLUMNA

4.3.5.1 RESULTADOS

get_ca_col es una función utilizada para extraer los resultados de las columnas. En consecuencia, devuelve las coordenadas, cos2, contribución e inercia.

col <- get_ca_col(res.ca)
col
## Correspondence Analysis - Results for columns
##  ===================================================
##   Name       Description                   
## 1 "$coord"   "Coordinates for the columns" 
## 2 "$cos2"    "Cos2 for the columns"        
## 3 "$contrib" "contributions of the columns"
## 4 "$inertia" "Inertia of the columns"

Para acceder a los diferentes componentes de la función se utiliza:

#cordenadas de los puntos de la columna
head(col$coord)
##                   Dim 1      Dim 2       Dim 3
## Wife        -0.83762154  0.3652207 -0.19991139
## Alternating -0.06218462  0.2915938  0.84858939
## Husband      1.16091847  0.6019199 -0.18885924
## Jointly      0.14942609 -1.0265791 -0.04644302
# calidad de la representacion
head(col$cos2)
##                   Dim 1     Dim 2       Dim 3
## Wife        0.801875947 0.1524482 0.045675847
## Alternating 0.004779897 0.1051016 0.890118521
## Husband     0.772026244 0.2075420 0.020431728
## Jointly     0.020705858 0.9772939 0.002000236
#contribuciones
head(col$contrib)
##                 Dim 1     Dim 2      Dim 3
## Wife        44.462018 10.312237 10.8220753
## Alternating  0.103739  2.782794 82.5492464
## Husband     54.233879 17.786612  6.1331792
## Jointly      1.200364 69.118357  0.4954991

4.3.5.2 PLOTS: CALIDAD Y CONTRIBUCIÓN

fviz_ca_col es utilizada para producir gráficas de datos de columna. Para crear una gráfica se escribe lo siguiente.

fviz_ca_col(res.ca)

También puede añadírsele color.

fviz_ca_col(res.ca, col.col = "cos2", gradient.cols = c("#00AFBB", "#E7B800","#FC4E07"), repel = TRUE)

El siguiente código crea un gráfico de barras con columnas co2.

fviz_cos2(res.ca, choice = "col", axes = 1:2)

La columna Alternating no se muestra bien en las primeras dos dimensiones. La posición de este debe ser interpretada con cuidado en el espacio formado entre las dimensiones 1 y 2.

Para ver la contribución de filas en las primeras dos dimensiones se tiene lo siguiente.

fviz_contrib(res.ca, choice = "col", axes = 1:2)

4.3.6 BIPLOT OPCIONES

La doble gráfica muestra filas y columnas en 2 o 3 dimensiones.

4.3.6.1 BIPLOT SIMÉTRICO

En esta gráfica se usan las coordenadas principales. Estas coordenadas representan los perfiles de columnas o filas. En este caso en específico, solo la distancia entre los puntos de fila o la distancia entre los puntos de columna puede ser interpretada.

fviz_ca_biplot(res.ca, repel = TRUE)

4.3.6.2 BIPLOT ASIMÉTRICO

Para hacer una gráfica doble asimétrica, las filas o columnas son graficadas en las coordenadas estandar (S) y los perfiles de las columnas o filas son graficadas en las coordenadas principales (P).

Las opciones de "map" en la función "fviz_ca_biplot()" del paquete "factoextra", permiten establecer diferentes tipos de visualización según las coordenadas principales y los eigenvalores del eje dado. Las opciones son las siguientes:

  1. "rowprincipal" o "colprincipal": Biplots asimétricos donde las filas o columnas se representan en coordenadas principales o estándar, respectivamente.

  2. "symbiplot": Biplots simétricos donde tanto filas como columnas se escalan para tener varianzas iguales a los valores singulares.

  3. "rowgab" o "colgab": Mapas asimétricos propuestos por Gabriel & Odoroff, donde las filas o columnas se representan en coordenadas principales y estándar multiplicadas por la masa.

  4. "rowgreen" o "colgreen": Biplots de contribución que muestran visualmente los puntos más relevantes, donde las filas o columnas se representan en coordenadas principales y estándar multiplicadas por la raíz cuadrada de la masa.

Estas opciones brindan distintas formas de visualizar los datos según las coordenadas principales y los eigenvalores del eje dado. Dependiendo de la situación o requisitos del análisis, puedes elegir la opción adecuada para el argumento "map" en la función "fviz_ca_biplot()".

La función asimétrica se muestra a continuación.

fviz_ca_biplot(res.ca, map = "rowprincipal", arrows = c(TRUE, TRUE), repel = TRUE)

Se usó el argumento "arrows", el cual es un vector de dos lógicas que especifica si la gráfica debería contener puntos (FALSE, default) o flechas (TRUE). El primer valor coloca filas, el segundo columnas.

Para interpretar la distancia entre filas y una columna se debe proyectar perpendicularmente puntos de filas en la columna de flechas.

4.3.6.3 BIPLOT CONTRIBUCIÓN

En un biplot simétrico estándar, es difícil identificar los puntos que más contribuyen a la solución del Análisis de Correspondencia (CA, por sus siglas en inglés). Michael Greenacre propuso una nueva escala de visualización llamada biplot de contribución, que incorpora la contribución de los puntos (Greenacre, 2013). En esta representación, los puntos que contribuyen poco se encuentran cerca del centro del biplot y tienen una importancia relativa menor para la interpretación.

Para crear un biplot de contribución, se puede utilizar el argumento "map = 'rowgreen'" o "map = 'colgreen'". En el caso de "map = 'colgreen'", se interpreta la contribución de las filas a los ejes. En esta configuración, es importante recordar que las columnas están en coordenadas principales y las filas en coordenadas estándar multiplicadas por la raíz cuadrada de la masa. El cuadrado de la nueva coordenada de una fila en un eje específico representa exactamente la contribución de esa fila a la inercia del eje.

fviz_ca_biplot(res.ca, map = "colgreen", arrows = c(TRUE, FALSE), repel = TRUE)

En un biplot convencional, las distancias de los puntos de fila desde el origen del gráfico están relacionadas con sus contribuciones al mapa de factores bidimensional. Cuanto más cerca esté una flecha (que representa una categoría de fila) de un eje, mayor será su contribución a ese eje en comparación con el otro eje. Si la flecha está posicionada a mitad de camino entre los dos ejes, significa que la categoría de fila contribuye por igual a ambos ejes.

Según la información proporcionada, se pueden hacer las siguientes observaciones:

  • La categoría de fila "Repairs" tiene una importante contribución al polo positivo de la primera dimensión, mientras que las categorías "Laundry" y "Main meal" tienen una contribución significativa al polo negativo de la primera dimensión.

  • La dimensión 2 está principalmente definida por la categoría de fila "Holidays".

  • La categoría de fila "Driving" contribuye en igual medida a los dos ejes.

4.3.7 DIMENSIÓN DESCRIPCIÓN

Para la fácil identificación de puntos de filas y columnas que son más asociados con las dimensiones principales, se puede usar la función dimdesc(). Las variables de filas/columnas son ordenadas por sus coordenadas en dismdesc().

#descripcion dimensional
res.desc <- dimdesc(res.ca, axes = c(1,2))

Descripción de la dimensión 1:

#descripcion de la dimension 1 en las filas
head(res.desc[[1]]$row, 4)
##                 coord
## Laundry    -0.9918368
## Main_meal  -0.8755855
## Dinner     -0.6925740
## Breakfeast -0.5086002
#descripcion de la dimension 1 en las columnas
head(res.desc[[1]]$col, 4)
##                   coord
## Wife        -0.83762154
## Alternating -0.06218462
## Jointly      0.14942609
## Husband      1.16091847

Descripción de la dimensión 2:

#descripcion de la dimension 2 en las filas
res.desc[[2]]$row
##                 coord
## Holidays   -1.4350066
## Finances   -0.6178684
## Insurance  -0.4737832
## Dishes     -0.4419662
## Tidying    -0.4343444
## Shopping   -0.4033171
## Official    0.2536132
## Dinner      0.3081043
## Breakfeast  0.4528038
## Main_meal   0.4901092
## Laundry     0.4953220
## Driving     0.6534143
## Repairs     0.8642647
#descripcion de la dimension 2 en las filas
res.desc[[2]]$col
##                  coord
## Jointly     -1.0265791
## Alternating  0.2915938
## Wife         0.3652207
## Husband      0.6019199

4.4 ELEMENTOS SUPLEMENTARIOS

4.4.1 FORMATO DE LOS DATOS

Usaremos el data set "children". Contiene 18 filas y 8 columnas:

data(children)
#head(children)

El uso de una tabla de contingencia describe las respuestas dadas por diferentes categorías de personas a la pregunta: ¿Cuáles son las razones que pueden hacer que una mujer o una pareja duden en tener hijos?

En el análisis de correspondencia (CA) se utilizarán solo algunas de las filas y columnas de la tabla. Las coordenadas de las filas/columnas restantes (suplementarias) en el mapa de factores serán predichas después del CA.

En la terminología del CA, los datos se componen de:

  • Filas activas (filas 1:14): Son las filas utilizadas durante el análisis de correspondencia.

  • Filas suplementarias (filas.sup 15:18): Las coordenadas de estas filas serán predichas utilizando la información y parámetros del CA obtenidos con las filas/columnas activas.

  • Columnas activas (columnas 1:5): Son las columnas utilizadas en el análisis de correspondencia.

  • Columnas suplementarias (col.sup 6:8): Al igual que las filas suplementarias, las coordenadas de estas columnas también serán predichas.

4.4.2 ESPECIFICACIÓN EN CA

Estos son los parámetros utilizados en el contexto del análisis de correspondencia (CA):

  • X: Un marco de datos (tabla de contingencia) que contiene los datos para el análisis de correspondencia.

  • row.sup: Un vector numérico que especifica los índices de las filas suplementarias.

  • col.sup: Un vector numérico que especifica los índices de las columnas suplementarias.

  • ncp: El número de dimensiones que se mantienen en los resultados finales del CA.

  • graph: Un valor lógico. Si es TRUE, se muestra un gráfico.

Por ejemplo:

res.ca <- CA(children, row.sup = 15:18, col.sup = 6:8, graph = FALSE)

4.4.3 BIPLOT DE FILAS Y COLUMNAS

fviz_ca_biplot(res.ca, repel = TRUE)

  • Las filas activas están en azul

  • Las filas suplementarias están en azul oscuro

  • Columnas están en rojo

  • Las columnas suplementarias están en rojo oscuro

También es posible ocultar lo suplementario mediante el argumento "invisible".

fviz_ca_biplot(res.ca, repel = TRUE, invisible = c("row.sup","col.sup"))

4.4.4 FILAS SUPLEMENTARIAS

Los resultados esperados por las filas suplementarias:

res.ca$row.sup
## $coord
##                  Dim 1     Dim 2      Dim 3      Dim 4
## comfort      0.2096705 0.7031677 0.07111168  0.3071354
## disagreement 0.1462777 0.1190106 0.17108916 -0.3132169
## world        0.5233045 0.1429707 0.08399269 -0.1063597
## to_live      0.3083067 0.5020193 0.52093397  0.2557357
## 
## $cos2
##                   Dim 1      Dim 2       Dim 3      Dim 4
## comfort      0.06892759 0.77524032 0.007928672 0.14790342
## disagreement 0.13132177 0.08692632 0.179649183 0.60210272
## world        0.87587685 0.06537746 0.022564054 0.03618163
## to_live      0.13899699 0.36853645 0.396830367 0.09563620

Gráfica de los puntos de fila activos y suplementarios:

fviz_ca_row(res.ca, repel = TRUE)

4.4.5 COLUMNAS SUPLEMENTARIAS

Los resultados esperados por las filas suplementarias:

res.ca$col.sup
## $coord
##                  Dim 1       Dim 2       Dim 3       Dim 4
## thirty      0.10541339 -0.05969594 -0.10322613  0.06977996
## fifty      -0.01706444  0.04907657 -0.01568923 -0.01306117
## more_fifty -0.17706810 -0.04813788  0.10077299 -0.08517528
## 
## $cos2
##                Dim 1      Dim 2       Dim 3       Dim 4
## thirty     0.1375601 0.04411543 0.131910759 0.060278490
## fifty      0.0108695 0.08990298 0.009188167 0.006367804
## more_fifty 0.2860989 0.02114509 0.092666735 0.066200714

Gráfica de los puntos de fila activos y suplementarios:

fviz_ca_biplot(res.ca, repel = TRUE)

4.5 FILTRADO DE RESULTADOS

Los argumentos "select.col" y "select.row" se pueden utilizar para visualizar solo algunas de las variables de fila/columna cuando se tienen muchas.

select.col: Permite seleccionar columnas específicas para ser dibujadas. Los valores permitidos son NULL o una lista que contiene los argumentos "name", "cos2" o "contrib".

select.row: Permite seleccionar filas específicas para ser dibujadas. Los valores permitidos son NULL o una lista que contiene los mismos argumentos ("name", "cos2" o "contrib") que se mencionaron anteriormente para "select.col".

"name": Un vector de caracteres que contiene los nombres de columna a dibujar.

"cos2": Si "cos2" está en el rango [0, 1], por ejemplo, 0.6, entonces se dibujarán las columnas con un "cos2" > 0.6.

"if cos2 > 1, ex": 5, entonces se dibujarán las 5 columnas activas y 5 columnas suplementarias con el "cos2" más alto.

"contrib": Si "contrib" > 1, por ejemplo, 5, entonces se dibujarán las 5 columnas con las contribuciones más altas.

#visualizar las filas en cos2 que tengan los datos matores o iguales a 0.8
fviz_ca_biplot(res.ca, select.row = list(cos2 = 0.8))

#top 5 filas activas y 5 filas suplentes con los mayores datos en cos2
fviz_ca_biplot(res.ca, select.row = list(cos2 = 5))

#seleccionar los nombres
name <- list(name = c("employment", "fear", "future"))
fviz_ca_row(res.ca, select.row = name)

#top 5 filas y columnas contribuidoras
fviz_ca_biplot(res.ca, select.row = list(contrib = 5), select.col = list(contrib = 5))

theme_minimal()
## List of 97
##  $ line                      :List of 6
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                      :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                      :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                     : NULL
##  $ aspect.ratio              : NULL
##  $ axis.title                : NULL
##  $ axis.title.x              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top          :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom       : NULL
##  $ axis.title.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left         : NULL
##  $ axis.title.y.right        :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top           :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom        : NULL
##  $ axis.text.y               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left          : NULL
##  $ axis.text.y.right         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.ticks.x              : NULL
##  $ axis.ticks.x.top          : NULL
##  $ axis.ticks.x.bottom       : NULL
##  $ axis.ticks.y              : NULL
##  $ axis.ticks.y.left         : NULL
##  $ axis.ticks.y.right        : NULL
##  $ axis.ticks.length         : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x       : NULL
##  $ axis.ticks.length.x.top   : NULL
##  $ axis.ticks.length.x.bottom: NULL
##  $ axis.ticks.length.y       : NULL
##  $ axis.ticks.length.y.left  : NULL
##  $ axis.ticks.length.y.right : NULL
##  $ axis.line                 : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x               : NULL
##  $ axis.line.x.top           : NULL
##  $ axis.line.x.bottom        : NULL
##  $ axis.line.y               : NULL
##  $ axis.line.y.left          : NULL
##  $ axis.line.y.right         : NULL
##  $ legend.background         : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.margin             : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing            : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x          : NULL
##  $ legend.spacing.y          : NULL
##  $ legend.key                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.key.size           : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height         : NULL
##  $ legend.key.width          : NULL
##  $ legend.text               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.align         : NULL
##  $ legend.title              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.align        : NULL
##  $ legend.position           : chr "right"
##  $ legend.direction          : NULL
##  $ legend.justification      : chr "center"
##  $ legend.box                : NULL
##  $ legend.box.just           : NULL
##  $ legend.box.margin         : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background     : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing        : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ panel.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.border              : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.spacing             : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ panel.spacing.x           : NULL
##  $ panel.spacing.y           : NULL
##  $ panel.grid                :List of 6
##   ..$ colour       : chr "grey92"
##   ..$ linewidth    : NULL
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major          : NULL
##  $ panel.grid.minor          :List of 6
##   ..$ colour       : NULL
##   ..$ linewidth    : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major.x        : NULL
##  $ panel.grid.major.y        : NULL
##  $ panel.grid.minor.x        : NULL
##  $ panel.grid.minor.y        : NULL
##  $ panel.ontop               : logi FALSE
##  $ plot.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ plot.title                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.title.position       : chr "panel"
##  $ plot.subtitle             :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : num 1
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 5.5points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption.position     : chr "panel"
##  $ plot.tag                  :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.tag.position         : chr "topleft"
##  $ plot.margin               : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ strip.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ strip.background.x        : NULL
##  $ strip.background.y        : NULL
##  $ strip.clip                : chr "inherit"
##  $ strip.placement           : chr "inside"
##  $ strip.text                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey10"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.x              : NULL
##  $ strip.text.x.bottom       : NULL
##  $ strip.text.x.top          : NULL
##  $ strip.text.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.y.left         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.y.right        : NULL
##  $ strip.switch.pad.grid     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.switch.pad.wrap     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

4.6 SALIDAS

Si hay uno o más "valores atípicos" presentes en la tabla de contingencia, estos pueden dominar la interpretación de los ejes en el análisis de correspondencia (CA) (Bendixen, 2003). Los valores atípicos son puntos que tienen valores de coordenadas absolutas altas y contribuciones altas. En el gráfico, se representan muy lejos del centroide. En este caso, los demás puntos de fila/columna tienden a estar agrupados de manera muy estrecha en el gráfico, lo que dificulta su interpretación.

En la salida del CA, las coordenadas de los puntos de fila/columna representan el número de desviaciones estándar por las que la fila/columna se encuentra alejada del baricentro (Bendixen, 2003).

Según Bendixen (2003):

Los valores atípicos son puntos que se encuentran al menos a una desviación estándar del baricentro. También contribuyen significativamente a la interpretación de un polo de un eje.

En nuestros datos no se observan valores atípicos aparentes. Si hubiera valores atípicos en los datos, se deben suprimir o tratar como puntos suplementarios al volver a ejecutar el análisis de correspondencia.

4.7 EXPORTACIÓN DE RESULTADOS

4.7.1 EXPORTAR GRÁFICOS A ARCHIVOS PDF/PNG

Para guardar las gráficas en formato pdf o png, primero creamos la gráfica de interes y la guardamos como objeto R:

#graficas scree
scree.plot <- fviz_eig(res.ca)

# biplot de las variables de las filas y columnas
biplot.ca <- fviz_ca_biplot(res.ca)

Ahora las gráficas pueden ser exportadas a un solo pdf.

ggexport(plotlist = list(scree.plot, biplot.ca), filename = "CA.pdf")
## file saved to CA.pdf

4.7.2 EXPORTAR RESULTADOS A ARCHIVOS TXT/CVS

Una función de R muy fácil de usar: write.infile()

#exportar como archivo TXT
write.infile(res.ca, "ca.txt", sep = "\t")

#exportar como un archivo CSV
write.infile(res.ca,"ca.csv", sep = ";")

4.8 CONCLUSIÓN

En conclusión, se describió cómo utilizar análisis de correspondencia. Computamos CA usando la función CA() del paquete FactoMineR. Luego usamos el paquete factoextra para producir ggplot2, el cual está basado en la visualización de los datos CA.

Otras funciones para computar CA en R son:

  1. Usar dudi.coa() [ade4]
res.ca <- dudi.coa(housetasks, scannf = FALSE, nf = 5)
  1. Usar ca() [ca]
library(ca)
## Warning: package 'ca' was built under R version 4.3.2
res.ca <- ca(housetasks)
  1. Usar corresp() [MASS]
library(MASS)
res.ca <- corresp(housetasks, nf = 3)
  1. Usar epCA() [ExPosition]
res.ca <- epCA(housetasks, graphs = FALSE)

No importa qué función decida usarse en la lista recién mencionada, el paquete factoextra podrá manejar la salida de estos.

#grafica scree
fviz_eig(res.ca)

#biplot de filas y columnas
fviz_ca_biplot(res.ca)