Este artículo está dirigido a practicantes de psicometría que están interesados en realizar sus análisis usando R, pero que no necesariamente son expertos en este lenguaje de programación.

En esta ocación revisaremos como obtener e interpretar el coeficiente Alfa de Cronbach usando el paquete psych de R. Para ello usaremos un conjunto de datos abierto, correspondiente a un test de inteligencia aplicado en línea.

¿Qué es el Alfa de Cronbach?

El coeficiente Alfa de Cronbach es el indicador de confiabilidad de escalas psicométricas más usado en ciencias sociales.

El Alfa de Cronbach nos da una medida de la consistencia interna que tienen los reactivos que forman una escala. Si esta medida es alta, suponemos tener evidencia de la homogeneidad de dicha escala, es decir, que los ítems están “apuntando” en la misma dirección.

Por esta razón, el Alfa de Cronbach suele interpretarse como una medida de unidimensionalidad de una escala, por tanto, de que estamos midiendo de manera consistente algo con ella. Esto es, asumimos que nuestra escala es Tau equivalente o esencialmente Tau equivalente.

Sin embargo, para poder hacer cualquier afirmación con respecto a la dimensionalidad de una escala, primero necesitamos evidencia de su validez, lo cual es importante tenerlo en mente para evitar interpretaciones erróneas del alfa de Cronbach.

El Alfa de Cronbach se obtiene a partir de la covarianza (intercorrelaciones) entre ítems de una escala, la varianza total de la escala, y el número de reactivos que conforman la escala.

La fórmula para calcular el Alfa de Cronbach usando varianzas es la siguiente: \[ \alpha = \frac{K}{K-1}( \frac{\sum_{i=1}^{K} \sigma^2_{Y_i}} {\sigma^2_X} ) \] Donde:

Como podrás ver, dividimos la sumatoria de las varianzas de los ítems entre la varianza de las puntuaciones observadas de los individuos, ponderada por el número de ítems. Por esta razón, el Alfa de Cronbach tiende a mejorar si aumentamos el número de ítems en una escala, aunque teóricamente su confiabilidad no cambie.

Puedes leer más sobre el Alfa de Cronbach en este artículo de Cortina (1993):

Y puedes leer sobre las limitaciones y usos no apropiados de este coeficiente en este artículo de Sijtsma (2009):

Pasemos a iniciar nuestro análisis de ejemplo.

Obteniendo nuestros datos: Escala IQ1 para medir inteligencia

Los datos que usaremos corresponden a un test de inteligencia aplicado en linea como parte del repositorio Open Source Psychometrics Project.

Este es un conjunto de datos abierto para usos educativos que consiste en las respuesta de 400 personas a 25 ítems. Cada ítem consistía en una secuencia de figuras que la persona debía completar correctamente, eligiendo una de 8 opciones posibles.

Descargamos el archivo con los datos de esta escala usando la función download.file.Los datos se descargaran a tu carpeta de trabajo de R (puedes ver cuál es tu carpeta de trabajo usando la función getwd()).

download.file(url = "http://openpsychometrics.org/_rawdata/IQ1.zip", 
              destfile = "IQ1.zip")

Extraemos el contenido del archivo .zip que hemos descargado con unzip().

unzip("IQ1.zip")

Con esto, obtenemos una carpeta con los imágenes usadas en los ítems de la escala (IQ1), un archivo detallando las características de la escala (codebook.txt), y una tabla de datos (data.csv). Este último es el achivo que usaremos,

Procesando los datos

Necesitamos que nuestros datos tengan una estructura apropiada para el análisis siguiente estructura:

A esto se le conoce como una estructura rectangular o tabular limpia (tidy en inglés). Al trabajar con tus propios datos es recomendable capturarlos usando esta estructura, pero en nuestro caso tenemos que procesar los datos antes de analizarlos.

Comenzamos leyendo nuestros datos con la función read.csv() y asignamos el resultado al objeto iq1.

iq1 <- read.csv("IQ1/data.csv")

Veamos las primeras líneas de nuestros datos.

head(iq1)
## # A tibble: 6 x 28
##      Q1    Q2    Q3    Q4    Q5    Q6    Q7    Q8    Q9   Q10   Q11   Q12
## * <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
## 1    10    10    10     2     3     2     3    10    10    10    10    10
## 2    10    10    10    10    10    10     3    10    10    10    10    10
## 3    10    10    10     3    10    10     2     5    10     1    10     5
## 4    10    10     7     3     2     7     3     6    10    10     3     4
## 5    10    10    10     3     3    10     1    10    10     2    10     5
## 6    10    10     4     3    10     6     3     2    10     0     7     5
## # ... with 16 more variables: Q13 <int>, Q14 <int>, Q15 <int>, Q16 <int>,
## #   Q17 <int>, Q18 <int>, Q19 <int>, Q20 <int>, Q21 <int>, Q22 <int>,
## #   Q23 <int>, Q24 <int>, Q25 <int>, score <int>, gender <int>, age <int>

Tenemos tres variables con información de identificación de las personas participantes: score, gender y age. Las quitamos de nuestro conjunto de datos pues no son de nuestro interés en este momento.

iq1[c("score", "gender", "age")] <- NULL

La documentación de nuestros datos indica que una respuesta coficicada con un 10 es un acierto, mientras que valores del 1 al 7 son fallos. También podemos observar que tenemos datos iguales a 0, que podemos corresponden a una respuesta omitida.

Recodificamos los datos para que en todas las columnas tengamos: * 0 = Fallo * 1 = Acierto * NA = Perdido

Usamos ifelse() en una función anónima dentro de lapply() recodificar.

iq1 <- data.frame(
  lapply(iq1,function(x) { 
    ifelse(x == 10, 1, ifelse(x == 0, NA, 0))
  })
)  

Vemos el resultado.

head(iq1)
## # A tibble: 6 x 25
##      Q1    Q2    Q3    Q4    Q5    Q6    Q7    Q8    Q9   Q10   Q11   Q12
## * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1    1.    1.    1.    0.    0.    0.    0.    1.    1.    1.    1.    1.
## 2    1.    1.    1.    1.    1.    1.    0.    1.    1.    1.    1.    1.
## 3    1.    1.    1.    0.    1.    1.    0.    0.    1.    0.    1.    0.
## 4    1.    1.    0.    0.    0.    0.    0.    0.    1.    1.    0.    0.
## 5    1.    1.    1.    0.    0.    1.    0.    1.    1.    0.    1.    0.
## 6    1.    1.    0.    0.    1.    0.    0.    0.    1.   NA     0.    0.
## # ... with 13 more variables: Q13 <dbl>, Q14 <dbl>, Q15 <dbl>, Q16 <dbl>,
## #   Q17 <dbl>, Q18 <dbl>, Q19 <dbl>, Q20 <dbl>, Q21 <dbl>, Q22 <dbl>,
## #   Q23 <dbl>, Q24 <dbl>, Q25 <dbl>

Hecho esto, podemos continuar.

Usando la función alpha()

Con los datos preparados, usamos la función alpha() del paquete psych para calcular el coeficiente Alfa de Cronbach y algunos otros indicadores de confiabilidad psicométrica.

Si no tenemos instalado el paquete psych, que es lo usual en una instalación regular de R, usamos install.packages(") para obtenerlo. Necesitamos estar conectados a internet para realizar la instalación.

install.packages("psych")

Pedimos a R que llame a psych para usar sus funciones.

library(psych)

Ahora, llamamos a la función alpha() con iq1 como único argumento y guardamos los resultados en el objeto alfa para consultarlos después.

alfa <- alpha(iq1)

En algunas ocasiones recibiremos un mensaje similar al siguiente. Some items XXX were negatively correlated with the total scale and probably should be reversed. To do this, run the function again with the 'check.keys=TRUE' option

El mensaje indica que tenemos ítems que “apuntan” en dirección opuesta a la mayoría. Esto puede ocurrir por problemas de codificación o por diseño de la escala. En general no cambiará los resultados obtenidos con alpha(), pero vale la pena verificar la codificación de los datos para asegurarnos que son lógicos.

Veamos ahora los resultados más importantes y cómo interpretarlos

¿Cómo interpretar los resultados de alpha()?

Llamamos al objeto alfa que hemos creado para ver los resultados de alpha(),

alfa
## 
## Reliability analysis   
## Call: alpha(x = iq1)
## 
##   raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd
##       0.84      0.83    0.85      0.16 4.9 0.011 0.53 0.21
## 
##  lower alpha upper     95% confidence boundaries
## 0.82 0.84 0.86 
## 
##  Reliability if an item is dropped:
##     raw_alpha std.alpha G6(smc) average_r S/N alpha se     NA
## Q1       0.83      0.82    0.84      0.16 4.7    0.012 0.0097
## Q2       0.83      0.83    0.84      0.17 4.8    0.012 0.0093
## Q3       0.83      0.83    0.84      0.16 4.7    0.012 0.0105
## Q4       0.83      0.83    0.84      0.16 4.7    0.012 0.0106
## Q5       0.84      0.83    0.85      0.17 4.9    0.012 0.0104
## Q6       0.83      0.82    0.84      0.16 4.7    0.012 0.0106
## Q7       0.83      0.83    0.85      0.17 4.8    0.012 0.0107
## Q8       0.83      0.82    0.84      0.16 4.7    0.012 0.0106
## Q9       0.84      0.83    0.85      0.17 4.8    0.012 0.0102
## Q10      0.83      0.82    0.84      0.16 4.5    0.012 0.0101
## Q11      0.83      0.82    0.84      0.16 4.7    0.012 0.0105
## Q12      0.83      0.82    0.84      0.16 4.7    0.012 0.0104
## Q13      0.83      0.83    0.85      0.17 4.8    0.012 0.0105
## Q14      0.83      0.82    0.84      0.16 4.5    0.012 0.0100
## Q15      0.83      0.82    0.84      0.16 4.5    0.012 0.0097
## Q16      0.83      0.82    0.84      0.16 4.5    0.012 0.0097
## Q17      0.83      0.83    0.84      0.17 4.8    0.012 0.0103
## Q18      0.83      0.82    0.84      0.16 4.6    0.012 0.0103
## Q19      0.83      0.82    0.84      0.16 4.6    0.012 0.0102
## Q20      0.83      0.82    0.84      0.16 4.7    0.012 0.0106
## Q21      0.84      0.84    0.85      0.18 5.1    0.011 0.0091
## Q22      0.84      0.84    0.85      0.18 5.1    0.011 0.0088
## Q23      0.83      0.82    0.84      0.16 4.7    0.012 0.0106
## Q24      0.83      0.82    0.84      0.16 4.6    0.012 0.0103
## Q25      0.83      0.83    0.84      0.16 4.7    0.012 0.0105
## 
##  Item statistics 
##       n raw.r std.r r.cor r.drop  mean   sd
## Q1  394  0.43  0.48 0.466  0.390 0.893 0.31
## Q2  396  0.36  0.41 0.387  0.319 0.912 0.28
## Q3  394  0.42  0.44 0.394  0.350 0.766 0.42
## Q4  397  0.45  0.43 0.391  0.356 0.401 0.49
## Q5  398  0.34  0.34 0.289  0.265 0.709 0.46
## Q6  392  0.48  0.48 0.445  0.400 0.643 0.48
## Q7  352  0.41  0.39 0.335  0.309 0.250 0.43
## Q8  396  0.49  0.49 0.451  0.415 0.535 0.50
## Q9  396  0.31  0.35 0.299  0.253 0.831 0.38
## Q10 376  0.58  0.58 0.567  0.516 0.553 0.50
## Q11 388  0.48  0.47 0.436  0.402 0.657 0.48
## Q12 393  0.50  0.48 0.451  0.417 0.351 0.48
## Q13 361  0.40  0.38 0.337  0.313 0.313 0.46
## Q14 379  0.59  0.58 0.561  0.522 0.517 0.50
## Q15 390  0.60  0.60 0.586  0.542 0.662 0.47
## Q16 393  0.61  0.62 0.617  0.558 0.738 0.44
## Q17 338  0.43  0.40 0.365  0.336 0.275 0.45
## Q18 358  0.52  0.50 0.469  0.435 0.263 0.44
## Q19 381  0.55  0.54 0.516  0.475 0.520 0.50
## Q20 345  0.47  0.46 0.422  0.380 0.304 0.46
## Q21 332  0.13  0.14 0.066  0.059 0.117 0.32
## Q22 367  0.13  0.14 0.061  0.057 0.087 0.28
## Q23 386  0.47  0.46 0.419  0.380 0.404 0.49
## Q24 383  0.54  0.53 0.505  0.462 0.420 0.49
## Q25 389  0.45  0.45 0.407  0.368 0.645 0.48
## 
## Non missing response frequency for each item
##        0    1 miss
## Q1  0.11 0.89 0.02
## Q2  0.09 0.91 0.01
## Q3  0.23 0.77 0.02
## Q4  0.60 0.40 0.01
## Q5  0.29 0.71 0.01
## Q6  0.36 0.64 0.02
## Q7  0.75 0.25 0.12
## Q8  0.46 0.54 0.01
## Q9  0.17 0.83 0.01
## Q10 0.45 0.55 0.06
## Q11 0.34 0.66 0.03
## Q12 0.65 0.35 0.02
## Q13 0.69 0.31 0.10
## Q14 0.48 0.52 0.05
## Q15 0.34 0.66 0.03
## Q16 0.26 0.74 0.02
## Q17 0.72 0.28 0.16
## Q18 0.74 0.26 0.10
## Q19 0.48 0.52 0.05
## Q20 0.70 0.30 0.14
## Q21 0.88 0.12 0.17
## Q22 0.91 0.09 0.08
## Q23 0.60 0.40 0.04
## Q24 0.58 0.42 0.04
## Q25 0.35 0.65 0.03

Los resultados estan divididos por secciones. Revisemos lo más relevante de cada una de ellas.

Reliabilty analysis (análisis de confiabilidad)

Aquí encontramos el análisis de confiabilidad propiamente dicho. Se nos devuelve el valor del coeficiente Alfa de Cronbach, así como otros estadísticos.

raw_alpha: Coeficiente Alfa con las puntuaciones observadas. Esta es el valor de Alfa generalmente usado para evaluar la confiabilidad de una escala. Es también el que se reporta en publicaciones y reportes técnicos.

El valor de Alfa puede asumir valores entre 0 y 1. Valores cercanos a 1 son mejores, pues indican mayor consistencia interna. Por convención y para fines prácticos, valores de Alfa iguales o mayores a 0.7 se consideran aceptables, mayores a 0.8 son buenos, y mayores a 0.9 son excelentes.

Valores por debajo de 0.5 y cercanos a 0 indican que una escala tiene una pobre confiabilidad.

En este ejemplo hemos obtenido 0.84, la cual es bueno.

std.alpha: Coeficiente alfa con las puntuaciones estandarizadas.

Este valor se obtiene estandarizando las puntuaciones de la escala antes de calcular Alfa. Es útil cuando nuestros ítems no tienen el mismo rango de valores posibles, pues así evitamos sesgar los resultados.

Por lo general, obtenemos valores que son poco diferentes a los obtenidos con las puntuaciones observadas. En este caso, obtuvimos 0.83.

G6(smc): Lambda 6 de Guttman (\(\lambda6\)).

Esta es otra medida de confiabilidad, obtenida a partir del coeficiente de determinación de cada ítem con respecto a todos los demás, es decir, de correlaciones múltiples al cuadrado. Lambda 6 tiende a ser menos sensible al número de ítems en la escala.

Al igual que Alfa, asume valores de 0 a 1 y para fines prácticos lo interpretamos de la misma manera. Obtuvimos 0.8, el cual es un valor bueno

average_r: Correlación promedio entre los ítems.

Es el valor promedio de correlación entre los ítems Entre más cercano sea este valor a 1, los ítems han tenido más asociación entre ellos.

Hemos obtenido 0.16, lo cual indica que los ítems de la escala. en promedio, tienen una baja aociación entre ellos.

Este resultado nos ilustra que es posible obtener valores altos de Alfa, aunque los reactivos no tengan correlaciones fuertes entre ellos. Por lo tanto, no podemos asumir que tenemos ítems con una fuerte asociación entre ellos únicamente a partir del valor de Alfa, necesitamos explorar estos resultados primero.

95% confidence boundaries

Es el intervalo de confianza al 95% del valor de Alfa calculado. Se nos muestra el valor del límite inferior (lower) y superior (upper) del intervalo.

Intervalos amplios nos indican que el valor de Alfa tiene un mayor error de medida, por lo que debemos ser cuidadosos en las interpretaciones que hagamos y las decisiones que tomemos.

Reliability if an item is dropped (Confiabilidad si un ítem es quitado)

Esta tabla nos muestra cómo cambiaría Alfa y los demás indicadores de confiabilidad si un ítem se quita de la escala analizada.

Por ejemplo, si quitamos el ítem Q1, el valor de Alfa se reduce de 0.84 a 0.83,la confiabilidad de nuestra escala empeora si quitamos este ítem.

Habrá casos en los que Alfa mejora al quitar un ítem. La decisión de efectivamente quitar un ítem depende de que tanto mejora la confiabilidad y en qué medida se afecta la validez de la escala.

Este puede convertirse en un proceso iterativo, en el que después de quitar ítems, volvemos a calcular el Alfa de Cronbach, y nos encontramos que aún puede mejorar nuestra confiabilidad quitando un ítem distinto.

Es necesario considerar las características particulares de cada escala para encontrar un balance entre ganancias o perdidas en confiabilidad y la integridad de la escala. También es necesario tomar en cuenta los demás resultados reportados en este análisis con respecto a cada ítem.

Supongamos que tomamos la decisión de quitar el ítem Q21 de la escala. Lo que hacemos es crear una copia de nuestra escala sin ese ítem y volver a usar alpha() para obtener nuevos resultados.

iq1_sin_Q21 <- iq1
iq1_sin_Q21["Q21"] <- NULL
alfa_sin_Q21 <- alpha(iq1_sin_Q21)

Item satistics (estadisticas de item)

Esta tabla nos presenta las correlaciones (r) de los ítems con la puntuación total de la escala. Valores más cercanos a 1 indican una asociación más fuerte entre ítem y puntuación.

Esta es una tabla útil para tomar decisiones sobre los reactivos. Por ejemplo, los ítems Q21 y Q22 tiene correlaciones bajas (0.13) con la puntuación de la escala, por lo que valdría la pena analizarlos con mayor detalle. Idealmente, esperamos que los ítems tengan una buena asociación con la puntuación de la escala a la que pertenecen.

Non missing response frequency for each item (Frecuencia de respuesta no perdida para cada ítem)

Por último, tenemos la proporción de respuesta para cada opción posible para cada uno de los ítems, incluidas las respuestas perdidas.

Por ejemeplo, para el ítem Q1, 11% de las respuestas fueron 0, 89% fueron 1 y 2% fueron perdidas.

Esta información es útil para el análisis de resultados inusuales. En nuestro caso, el ítem Q21, que tuvo baja correlación con la puntuación de la escala, tuvo también la tasa de respuestas perdidas más alta de todas, 17%. Lo anterior nos llama la atención a analizar con cuidado a este ítem en particular.

Para concluir

En este artículo hemos revisado obtener el coeficiente Alfa de Cronbach usando R y el paquete psych, así como la manera de interpretar este coeficiente y los resultados asociados a él más relevantes. También pudimos vimos de manera general como los resultados obtenidos de la función alpha() nos pueden ayudar a un mejor análisis de la confiabilidad e una escala.

Es importante recordar qué puede y qué no puede decirnos el coeficiente Alfa de Cronbach con respecto a una escala psicométrica, para evitar malas interpretaciones. El Alfa de Cronbach nos da una medida de la consistencia interna de una escala, que sus ítems apuntan en la misma dirección, pero no nos dice nada sobre su validez o la calidad de sus reactivos. Estas son características diferentes de las escalas que requieren de análisis diferentes.

Referencias


Consultas, dudas, comentarios y correcciones son bienvenidas:

El código y los datos usados en este documento se encuentran en Github: