Introducción

Objetivos

  • Objetivo primario: Desarrollar baremos de calidad para el instrumento de autoreporte de personalidad Banco Internacional de Ítems de Personalidad – Neuroticismo, Extraversión, Apertura – versión 120 ítems (IPIP-NEO-120). Instrumento desarrollado por J.A. Johnson (2014) (Frez-Puente et al., Trad.). El instrumento posee 5 dimensiones con 6 sub-dimensiones cada una:
    1. Evaluar calidad de la traducción de los ítems y hacer una adaptación al español completa.
    2. Crear un protocolo de aplicación en papel y digital.
    3. Criterios de captura de datos para baremos: Criterios de Inclusión-Exclusión, muestreo estratificado basado en datos demográficos de INEGI.
    4. Análisis psicométrico: CFA, varianza estratificada, confiabilidad interna.
    5. Crear baremos y manual de calificación.
  • Objetivos secundarios: Desarrollar y validar escalas e indices globales de validez de respuesta, con el fin de analizar:
    1. Respuesta aleatoria o inatenta.
    2. Respuesta socialmente deseable.
    3. Respuesta Extrema o central (Extreme and Midpoint response styles)
    4. Person-Fit al modelo de 5 factores.

Proceso piloto

Sem 30 - 19:25-07-26

Agenda de objetivos

  • Integrar base de datos de Tarigan & Fadillah, (2022); analizar su la confiabilidad interna e inter-correlaciones para compararlas con las reportadas en literatura.
  • Analizar ítems correlacionados positiva y negativamente para trazar cuales podrían ser útiles para formar un índice de respuesta inconsistente.

Resultados

  • Se encontraron problemas de validez interna dentro de la base de datos.

  • Se codificaron varios ítems en negativo post hoc debido a que correlacionaban negativamente con el factor de mayor orden inmediato que pretendían representar.

Importar y mapear datos

# Importar archivo desde original

setwd("~/RProyects/IPIPNeo")
suppressWarnings(library(readxl))

RawDS <- read_excel("RawNuevo.xlsx", sheet = 1)
# Archivo RawNuevo.xlsx es la base de datos cruda sin las sumas que Tarigan-Fadilla agregaron dentro de las columnas.

# Importar números de ÍTemS y etiquetas
suppressWarnings(library(labelled)) #supressed para que deje de molestar q la versión está mala 
itemLabelsAndDesc <- read_excel("RawNuevo.xlsx", sheet = 2)
espLabels <- itemLabelsAndDesc$Español #cambiar a "Inglés" si gustan, estoy usando la traducción de Frez-Puente et al.
var_label(RawDS) <- espLabels

reverseItems <- c(19,21,30,39,54,81,82,84,92,107,118)## IMPORTANTE - Se encontró que los siguientes ítems cargan negativamente al factor superior que intentaban representar, es muy posible que se hayan codificado erroneamente desde la base de datos cruda. Los ítems 54, 84, 82 se agregaron tras sugerencia del warning de la función de alpha() del paquete de psych. A futuro sería mejor importar una base de datos SIN REVERSO para luego reversearlos en RStudio para tenerlo documentado.

RawDS[, as.character(reverseItems)] <-
  6 - RawDS[, as.character(reverseItems)]
# Es mucho mejor seleccionar los nombres de las columnas para no tener confusiones entre diferentes transformaciones ni órdenes diferentes.
getItems <- function(x) {
  RawDS[, match(as.character(x), names(RawDS)), drop = FALSE]
}

# Chatgepete hazme una lísta de todos los ítems por faceta y todas las facetas por factor Zzz.
N1 <- c(1,31,61,91)
N2 <- c(6,36,66,96)
N3 <- c(11,41,71,101)
N4 <- c(16,46,76,106)
N5 <- c(21,51,81,111)
N6 <- c(26,56,86,116)

# Extraversion
E1 <- c(2,32,62,92)
E2 <- c(7,37,67,97)
E3 <- c(12,42,72,102)
E4 <- c(17,47,77,107)
E5 <- c(22,52,82,112)
E6 <- c(27,57,87,117)

# Openness
O1 <- c(3,33,63,93)
O2 <- c(8,38,68,98)
O3 <- c(13,43,73,103)
O4 <- c(18,48,78,108)
O5 <- c(23,53,83,113)
O6 <- c(28,58,88,118)

# Agreeableness
A1 <- c(4,34,64,94)
A2 <- c(9,39,69,99)
A3 <- c(14,44,74,104)
A4 <- c(19,49,79,109)
A5 <- c(24,54,84,114)
A6 <- c(29,59,89,119)

# Conscientiousness
C1 <- c(5,35,65,95)
C2 <- c(10,40,70,100)
C3 <- c(15,45,75,105)
C4 <- c(20,50,80,110)
C5 <- c(25,55,85,115)
C6 <- c(30,60,90,120)


# Crear sumas de facetas usando nombres de ítems
sumaFacetas <- data.frame(
  N1 = rowSums(getItems(N1)),
  N2 = rowSums(getItems(N2)),
  N3 = rowSums(getItems(N3)),
  N4 = rowSums(getItems(N4)),
  N5 = rowSums(getItems(N5)),
  N6 = rowSums(getItems(N6)),

  E1 = rowSums(getItems(E1)),
  E2 = rowSums(getItems(E2)),
  E3 = rowSums(getItems(E3)),
  E4 = rowSums(getItems(E4)),
  E5 = rowSums(getItems(E5)),
  E6 = rowSums(getItems(E6)),

  O1 = rowSums(getItems(O1)),
  O2 = rowSums(getItems(O2)),
  O3 = rowSums(getItems(O3)),
  O4 = rowSums(getItems(O4)),
  O5 = rowSums(getItems(O5)),
  O6 = rowSums(getItems(O6)),

  A1 = rowSums(getItems(A1)),
  A2 = rowSums(getItems(A2)),
  A3 = rowSums(getItems(A3)),
  A4 = rowSums(getItems(A4)),
  A5 = rowSums(getItems(A5)),
  A6 = rowSums(getItems(A6)),

  C1 = rowSums(getItems(C1)),
  C2 = rowSums(getItems(C2)),
  C3 = rowSums(getItems(C3)),
  C4 = rowSums(getItems(C4)),
  C5 = rowSums(getItems(C5)),
  C6 = rowSums(getItems(C6))
)

# Sumas de factores
sumaFactores <- data.frame(
  N = rowSums(sumaFacetas[1:6]),
  E = rowSums(sumaFacetas[7:12]),
  O = rowSums(sumaFacetas[13:18]),
  A = rowSums(sumaFacetas[19:24]),
  C = rowSums(sumaFacetas[25:30])
)

Descriptivos y correlaciones intra-factores

# plots de pairs panels para cada faceta.
# En teoría por default si se pone a `ci = TRUE` como setting se hace una normalización Z de Fisher como en el paper original de MaplesGuanCarterMiller.

  psych::pairs.panels(sumaFactores, ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE)

  psych::pairs.panels(sumaFacetas[1:6], ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE)

  psych::pairs.panels(sumaFacetas[7:12], ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE)

  psych::pairs.panels(sumaFacetas[13:18], ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE)

  psych::pairs.panels(sumaFacetas[19:24], ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE)

  psych::pairs.panels(sumaFacetas[25:30], ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE)

Correlciónes inter-ítems

library(labelled)

# Correlación entre todos los ítems
corItems <- cor(RawDS, use = "pairwise.complete.obs")

# Etiquetas de ítems
itemDesc <- unlist(var_label(RawDS))

# Extraer triángulo superior
idx <- which(upper.tri(corItems), arr.ind = TRUE)

# Tabla completa de correlaciones
tablaCor <- data.frame(
  Item1 = itemDesc[idx[,1]],
  Item2 = itemDesc[idx[,2]],
  Correlacion = corItems[idx]
)

# Crear dos dataframes independientes
correlacionesPositivas <- head(
  tablaCor[order(-tablaCor$Correlacion), ],
  20
)

correlacionesNegativas <- head(
  tablaCor[order(tablaCor$Correlacion), ],
  20
)

# Mostrar ambos dataframes
correlacionesPositivas
correlacionesNegativas

El coeficiente de correlación se puede interpretar como una medida proxy de similitud semántica entre ítems. Ítem 17. Siempre estoy ocupado que tiene una correlación positiva con 47. Siempre estoy activo son ambos ítems de la faceta de E4 - Nivel de actividad, por lo que se espera que estén correlacionados positivamente. Se encuentran otras correlaciones positivas que son semánticamente contrarias (ej. 6 . Me enojo fácilmente corr +.63 con 96. No me molestan fácilmente), esto se debe a que uno de los ítems usado en la correlación es un ítem reverso del la faceta que representan.

Se muestra un código de correlaciones inter-ítem pero dentro de cada factor. Únicamente usé la información que imprimió para detectar cuáles son los ítems que contra-cargaban al factor superior que pretendían representar.

Confiabilidad interna

cat("\n=Coeficientes alpha de Cronbach para por factor=\n")
## 
## =Coeficientes alpha de Cronbach para por factor=
c(
  N = psych::alpha(getItems(c(N1,N2,N3,N4,N5,N6)))$total$raw_alpha,
  E = psych::alpha(getItems(c(E1,E2,E3,E4,E5,E6)))$total$raw_alpha,
  O = psych::alpha(getItems(c(O1,O2,O3,O4,O5,O6)))$total$raw_alpha,
  A = psych::alpha(getItems(c(A1,A2,A3,A4,A5,A6)))$total$raw_alpha,
  C = psych::alpha(getItems(c(C1,C2,C3,C4,C5,C6)))$total$raw_alpha
)
##         N         E         O         A         C 
## 0.9067028 0.8452370 0.7280562 0.7668047 0.9029529
# Es útil el concatenar para que todo se imprima como una única línea de código.

El instrumento posee una confiabilidad interna aceptable a excelente para cada factor. Dada la pobre correlación inter-ítem en algúnos sub-factores de openness( en psych::pairs.panels(sumaFacetas[13:18], ci = TRUE, alpha = .0001, smoother = TRUE, stars = TRUE) no tengo la confianza para hacer un buen análisis psicométrico usando esa base de datos y leeré el análisis que publicaron Tarigan & Fadilah (2024) en su paper. Aún así usaré esta base de datos para comparar muestras.