knitr::opts_chunk$set(message = FALSE, warning = FALSE, fig.width=8, fig.height=5)
install.packages(c("ggcorrplot"))
library(tidyverse)
library(lavaan)
library(semPlot)
library(semTools)
library(stringi)
library(psych)
library(ggplot2)
library(readr)
library(lavaan)
library(psych)
library(corrplot)
library(readxl)
library(openxlsx)
library(ltm)
library(Hmisc)
library(knitr)
library(kableExtra)
library(webshot)
library(ggcorrplot)
#auxiliary statistical routines
renamePilot <- function(dataFrame){
new_column_names <- c(
"ID", "TIME_START", "TIME_END", "EMAIL", "TERMS",
"BIRTH_DATE", "GENDER", "TIME_CODING", "JOB_TITLE",
"YERAS_CODE", "SALARY_MONTHLY", "NEURODIVERGENCE",
"D11", "D12", "D13", "D14", "D15", "D16",
"D21", "D22", "D23", "D24", "D25", "D26",
"D31", "D32", "D33", "D34", "D35",
"A11", "A12", "A13", "A14", "A15",
"A21", "A22", "A23",
"A31", "A32", "A33", "A34", "A35",
"A41", "A42", "A43",
"J11", "J12", "J13", "J14", "J15", "J16",
"J21", "J22", "J23", "J24", "J25",
"P11", "P12", "P13", "P14", "P15",
"P21", "P22", "P23", "P24", "P25", "P26", "P27", "P28",
"P31", "P32", "P33", "P34", "P35",
"FINAL_COMMENTS", "VOLUNTARY_EMAIL"
)
colnames(dataFrame) <- new_column_names
dataFrame
}
renameData <- function(dataFrame){
new_column_names <- c(
"ID", "TIME_START", "TIME_END", "EMAIL", "TERMS",
"BIRTH_DATE", "GENDER", "TIME_CODING", "JOB_TITLE",
"YERAS_CODE", "SALARY_MONTHLY", "NEURODIVERGENCE",
"D11", "D12", "D13", "D14", "D15", "D16",
"D21", "D22", "D23", "D24", "D25", "D26",
"D31", "D32", "D33", "D34", "D35",
"A11", "A12", "A13", "A14", "A15",
"A21", "A22", "A23",
"A31", "A32", "A33", "A34", "A35",
"A41", "A42", "A43",
"J11", "J12", "J13", "J14", "J15", "J16",
"J21", "J22", "J23", "J24", "J25",
"P11", "P12", "P13", "P14", "P15",
"P21", "P22", "P23", "P24", "P25", "P26", "P27", "P28",
"P31", "P32", "P33", "P34", "P35",
"FINAL_COMMENTS", "VOLUNTARY_EMAIL"
)
colnames(dataFrame) <- new_column_names
dataFrame
}
invertLikertScaleCMT <- function(dataframe) {
# Specify the columns to invert
columns_to_invert <- c("A34", "A35", "P31", "P32", "P33", "P34", "P35")
# Invert the values in specified columns
dataframe[, columns_to_invert] <- 6 - dataframe[, columns_to_invert]
return(dataframe)
}
aggBarplot <- function(dataframe,column_name,byCol){
average <- aggregate(dataframe[,column_name],by = list(dataframe[,byCol]), FUN = mean)
# Rename the columns for clarity
colnames(average) <- c(byCol, column_name)
# Create a bar plot
barplot(
height = average[[column_name]],
names.arg = average[[byCol]],
ylim = c(0, 20),
main = paste("Mean Scores by",column_name),
ylab = column_name,
col = "blue"
)
}
aggBoxplot <- function(dataframe,column_name,byCol){
boxplot(dataframe[[column_name]] ~ dataframe[[byCol]],
main = paste("Boxplot of",column_name,"by",byCol),
xlab = byCol,
ylab = column_name,
ylim = c(0, 20),
col = "lightblue",
notch = TRUE # Optional, adds a notch to the boxplot
)
}
rename_items_en <- function(df,
mapping = list(
"^D1\\d+$" = "IC", # Inhibitory Control
"^D2\\d+$" = "WM", # Working Memory
"^D3\\d+$" = "CF", # Cognitive Flexibility
"^A1\\d+$" = "IES", # Institutional & Emotional Support
"^A2\\d+$" = "OSN", # Org. Sensitivity to Individual Needs
"^A3\\d+$" = "FHT", # Fairness & Humane Treatment
"^A4\\d+$" = "PR", # Professional Recognition
"^A5\\d+$" = "VL", # Voice & Listening
"^J1\\d+$" = "SR", # State Regulation
"^J2\\d+$" = "CL", # Clarity & Awareness
"^J3\\d+$" = "AD", # Adaptation
"^P1\\d+$" = "IP", # Individual Performance
"^P2\\d+$" = "CP", # Contextual Performance
"^P3\\d+$" = "TP" # Team Performance
)) {
old_names <- colnames(df)
new_names <- old_names
get_suffix_num <- function(x) {
as.integer(gsub("^[A-Z]+", "", x))
}
for (rx in names(mapping)) {
prefix <- mapping[[rx]]
idx <- grepl(rx, old_names)
if (!any(idx)) next
matched <- old_names[idx]
ord <- order(get_suffix_num(matched), na.last = TRUE)
matched <- matched[ord]
renamed <- paste0(prefix, seq_along(matched))
new_names[match(matched, old_names)] <- renamed
}
colnames(df) <- new_names
df
}
Este relatório apresenta os principais achados obtidos nas etapas de análise fatorial exploratória (EFA), análise fatorial confirmatória (CFA) e teste de invariância multigrupo do modelo H1C, que integra dimensões de disfunções cognitivas (DYS), regulação e jornada individual (REG), apoio organizacional (SUPPORT) e performance (P_TASK e P_SOC).
O objetivo é verificar se a estrutura teórica proposta se mantém estável entre profissionais neurotípicos e neurodivergentes, permitindo comparações válidas entre grupos.
A EFA indicou uma estrutura coerente de quatro fatores principais, com variância explicada de aproximadamente 54% e sem correlações excessivamente altas entre fatores (|r| ≤ .80), o que sustentou a manutenção do modelo teórico original.
O modelo confirmatório (CFA) apresentou bom ajuste global e cargas fatoriais elevadas, confirmando validade convergente e hierarquia consistente entre fatores de primeira e segunda ordem.
Na análise de invariância, o modelo demonstrou invariância configural e métrica e invariância escalar parcial aceitável (ΔCFI e ΔRMSEA < 0.01). Isso indica que os construtos são interpretados de forma equivalente entre grupos, permitindo comparações de médias latentes.
Os resultados revelaram que profissionais neurodivergentes relataram maiores disfunções cognitivas (DYS) e maior regulação/adaptação (REG), além de maior performance social (P_SOC), enquanto apoio organizacional (SUPPORT) e performance técnica (P_TASK) não apresentaram diferenças significativas.
Esses achados reforçam a robustez do modelo e sugerem que, embora enfrentem mais desafios cognitivos, profissionais neurodivergentes tendem a desenvolver estratégias compensatórias que favorecem a adaptação e o desempenho social no trabalho.
A análise de confiabilidade foi realizada para verificar a consistência interna dos blocos de itens que compõem cada construto do instrumento. O Alfa de Cronbach foi utilizado por ser uma métrica amplamente empregada em estudos psicométricos e adequada para escalas do tipo Likert com múltiplos itens avaliando um mesmo domínio teórico.
csv <- "data.csv"
pilotData <- read_csv(csv)
pilotData <- rename_items_en(pilotData)
head(pilotData,2)
constructs <- list(
"IC" = c("IC1", "IC2", "IC3", "IC4", "IC5", "IC6"), # Inhibitory Control
"WM" = c("WM1", "WM2", "WM3", "WM4", "WM5", "WM6"), # Working Memory
"CF" = c("CF1", "CF2", "CF3", "CF4", "CF5"), # Cognitive Flexibility
"IES" = c("IES1", "IES2", "IES3", "IES4", "IES5"), # Institutional & Emotional Support
"OSN" = c("OSN1", "OSN2", "OSN3"), # Organizational Sensitivity to Needs
"FHT" = c("FHT1", "FHT2", "FHT3", "FHT4", "FHT5"), # Fairness & Humane Treatment
"PR" = c("PR1", "PR2", "PR3"), # Professional Recognition
"SR" = c("SR1", "SR2", "SR3", "SR4", "SR5", "SR6"), # State Regulation
"CL" = c("CL1", "CL2", "CL3", "CL4", "CL5"), # Clarity
"IP" = c("IP1", "IP2", "IP3", "IP4", "IP5"), # Individual Performance
"CP" = c("CP1", "CP2", "CP3", "CP4", "CP5", "CP6", "CP7", "CP8"), # Contextual Performance
"TP" = c("TP1", "TP2", "TP3", "TP4", "TP5") # Team Performance
)
# a new dataframe to store Cronbach's alpha results for each construct
reliability_results <- data.frame(Construct = character(0), CronbachAlpha = numeric(0))
for (construct_name in names(constructs)) {
# Extract the item names for the current construct
construct_items <- constructs[[construct_name]]
# Subset the data to include only the items for the current construct
construct_data <- pilotData[, construct_items]
# Calculate Cronbach's alpha for the construct
cronbach_result <- psych::alpha(construct_data, check.keys = TRUE,
use = "pairwise.complete.obs")
# Extract Cronbach's alpha value
cronbach_alpha <- cronbach_result$total$std.alpha
# Append the results to the reliability_results dataframe
reliability_results <- rbind(
reliability_results,
data.frame(Construct = construct_name, CronbachAlpha = cronbach_alpha)
)
}
print(reliability_results)
## Construct CronbachAlpha
## 1 IC 0.8853687
## 2 WM 0.9188164
## 3 CF 0.9374536
## 4 IES 0.8922307
## 5 OSN 0.8783805
## 6 FHT 0.9148115
## 7 PR 0.8868447
## 8 SR 0.9147914
## 9 CL 0.8884746
## 10 IP 0.8582161
## 11 CP 0.8620290
## 12 TP 0.7572889
Os coeficientes de Alfa de Cronbach indicaram alta consistência interna entre os itens de cada subescala, com valores variando entre 0.85 e 0.94, todos acima do limite recomendado de 0.70.
Esses resultados confirmam a homogeneidade dos blocos de itens e reforçam a coerência teórica das dimensões avaliadas — incluindo Disfunções Cognitivas, Acomodações Organizacionais, Jornada Individual e Performance.
Além disso, os alfas elevados servem como base de sustentação para a etapa a seguir, evidenciando que a estrutura de quatro fatores identificada na EFA possui suporte psicométrico adequado para ser mantida no modelo confirmatório (CFA).
A Análise Fatorial Exploratória foi utilizada para verificar a estrutura latente dos itens após o cálculo de confiabilidade, identificando a presença de agrupamentos coerentes entre os construtos teóricos. Nesta etapa, também foi realizada a inspeção da matriz Phi para avaliar correlações entre fatores e verificar se havia necessidade de reduzir o número de dimensões.
csv <- "data.csv"
data <- read_csv(csv, show_col_types = FALSE)
# -----------------------------
# Selecionar apenas itens
# -----------------------------
items_raw <- as.data.frame(data[, 13:(ncol(data) - 2)])
items_raw <- invertLikertScaleCMT(items_raw)
# -----------------------------
# Renomear itens para acrônimos (IC, WM, CF, IES, OSN, FHT, PR, VL, SR, CL, AD, IP, CP, TP)
# -----------------------------
items <- rename_items_en(items_raw)
stopifnot(ncol(items) > 0)
print(head(items, 2))
## IC1 IC2 IC3 IC4 IC5 IC6 WM1 WM2 WM3 WM4 WM5 WM6 CF1 CF2 CF3 CF4 CF5 IES1 IES2
## 1 2 3 2 1 2 1 3 3 2 3 4 1 2 1 1 1 2 5 4
## 2 3 4 4 3 3 3 2 2 2 2 5 2 2 2 2 3 2 2 3
## IES3 IES4 IES5 OSN1 OSN2 OSN3 FHT1 FHT2 FHT3 FHT4 FHT5 PR1 PR2 PR3 SR1 SR2
## 1 5 5 5 4 5 4 5 5 5 5 4 5 5 5 1 1
## 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 2 4
## SR3 SR4 SR5 SR6 CL1 CL2 CL3 CL4 CL5 IP1 IP2 IP3 IP4 IP5 CP1 CP2 CP3 CP4 CP5
## 1 1 1 2 1 2 1 2 2 1 5 4 4 4 4 5 5 3 4 3
## 2 2 2 4 3 3 4 2 4 3 5 5 5 4 5 5 4 3 4 3
## CP6 CP7 CP8 TP1 TP2 TP3 TP4 TP5
## 1 3 3 4 4 5 4 5 5
## 2 4 4 5 3 3 3 4 3
# -----------------------------
# KMO e Bartlett (fatorabilidade)
# -----------------------------
R_all <- cor(items, use = "pairwise.complete.obs")
cat("\n--- Bartlett ---\n")
##
## --- Bartlett ---
print(cortest.bartlett(R_all, n = nrow(items)))
## $chisq
## [1] 7924.496
##
## $p.value
## [1] 0
##
## $df
## [1] 1891
cat("\n--- KMO ---\n")
##
## --- KMO ---
print(KMO(R_all))
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = R_all)
## Overall MSA = 0.88
## MSA for each item =
## IC1 IC2 IC3 IC4 IC5 IC6 WM1 WM2 WM3 WM4 WM5 WM6 CF1 CF2 CF3 CF4
## 0.92 0.91 0.94 0.86 0.91 0.85 0.90 0.91 0.93 0.94 0.86 0.93 0.91 0.93 0.89 0.95
## CF5 IES1 IES2 IES3 IES4 IES5 OSN1 OSN2 OSN3 FHT1 FHT2 FHT3 FHT4 FHT5 PR1 PR2
## 0.93 0.83 0.86 0.85 0.86 0.85 0.91 0.91 0.88 0.87 0.90 0.90 0.87 0.86 0.89 0.86
## PR3 SR1 SR2 SR3 SR4 SR5 SR6 CL1 CL2 CL3 CL4 CL5 IP1 IP2 IP3 IP4
## 0.88 0.90 0.94 0.93 0.89 0.91 0.94 0.91 0.91 0.91 0.91 0.91 0.65 0.77 0.83 0.84
## IP5 CP1 CP2 CP3 CP4 CP5 CP6 CP7 CP8 TP1 TP2 TP3 TP4 TP5
## 0.79 0.85 0.73 0.64 0.71 0.67 0.76 0.70 0.79 0.81 0.73 0.60 0.70 0.80
# -----------------------------
# Funções auxiliares
# -----------------------------
pretty_loadings <- function(fa_obj, cutoff = .30) {
print(fa_obj$loadings, cutoff = cutoff, sort = TRUE)
}
phi_pairs_over <- function(phi_mat, thr = .80) {
if (is.null(phi_mat)) return(character(0))
nm <- colnames(phi_mat)
idx <- which(abs(phi_mat) > thr & lower.tri(phi_mat), arr.ind = TRUE)
if (nrow(idx) == 0) return(character(0))
apply(
idx, 1,
function(r) paste0(nm[r[1]], " ~ ", nm[r[2]],
" (r=", sprintf("%.2f", phi_mat[r[1], r[2]]), ")")
)
}
# -----------------------------
# EFA inicial
# -----------------------------
k_init <- 4L
efa_init <- fa(items, nfactors = k_init, n.obs = nrow(items),
fm = "pa", rotate = "oblimin")
cat("\n=== EFA INICIAL (k =", k_init, ") ===\n")
##
## === EFA INICIAL (k = 4 ) ===
pretty_loadings(efa_init, cutoff = .30)
##
## Loadings:
## PA1 PA2 PA3 PA4
## IC1 0.656
## IC3 0.690
## IC4 0.688
## IC5 0.687
## IC6 0.713
## WM1 0.794
## WM2 0.760
## WM3 0.829
## WM4 0.780
## WM5 0.567
## WM6 0.812
## CF1 0.858
## CF2 0.739
## CF3 0.728
## CF4 0.874
## CF5 0.849
## SR1 0.689
## SR2 0.765
## SR3 0.672
## SR4 0.594
## SR5 0.636
## SR6 0.698
## CL1 0.630
## CL2 0.609 -0.361
## CL3 0.712
## CL4 0.667
## CL5 0.734
## IES1 0.769
## IES2 0.666
## IES3 0.726
## IES4 0.813
## IES5 0.807
## OSN1 0.804
## OSN2 0.691
## OSN3 0.797
## FHT1 0.880
## FHT2 0.796
## FHT3 0.869
## FHT4 0.751
## FHT5 0.773
## PR1 0.770
## PR2 0.784
## PR3 0.800
## IP2 0.527
## IP3 0.620
## IP4 0.592
## IP5 0.610
## CP1 0.515
## CP2 0.571
## CP3 0.646
## CP4 0.713
## CP5 0.591
## CP6 0.579
## CP7 0.674
## TP2 0.690
## TP5 0.629
## IC2 0.482
## IP1 0.464
## CP8 -0.336 0.364
## TP1 -0.339 0.413
## TP3 0.424
## TP4 0.425
##
## PA1 PA2 PA3 PA4
## SS loadings 14.862 10.047 5.060 2.440
## Proportion Var 0.240 0.162 0.082 0.039
## Cumulative Var 0.240 0.402 0.483 0.523
cat("\n--- Variância explicada (inicial) ---\n")
##
## --- Variância explicada (inicial) ---
print(efa_init$Vaccounted)
## PA1 PA2 PA3 PA4
## SS loadings 15.1908793 10.1414187 5.20373605 2.66730602
## Proportion Var 0.2450142 0.1635713 0.08393123 0.04302106
## Cumulative Var 0.2450142 0.4085855 0.49251668 0.53553774
## Proportion Explained 0.4575106 0.3054337 0.15672327 0.08033246
## Cumulative Proportion 0.4575106 0.7629443 0.91966754 1.00000000
cat("\n--- Phi (inicial) ---\n")
##
## --- Phi (inicial) ---
print(round(efa_init$Phi, 2))
## PA1 PA2 PA3 PA4
## PA1 1.00 -0.14 -0.22 -0.19
## PA2 -0.14 1.00 0.02 0.20
## PA3 -0.22 0.02 1.00 0.01
## PA4 -0.19 0.20 0.01 1.00
high_phi_init <- phi_pairs_over(efa_init$Phi, thr = .80)
if (length(high_phi_init)) {
cat("\n*** Fatores muito correlacionados (|r| > .80):\n")
cat(paste0(" - ", high_phi_init, collapse = "\n"), "\n")
} else {
cat("\nNenhum par de fatores com |r| > .80 no modelo inicial.\n")
}
##
## Nenhum par de fatores com |r| > .80 no modelo inicial.
# -----------------------------
# Refinamento: reduz nfatores enquanto |Phi| > .80
# -----------------------------
k_ref <- k_init
efa_ref <- efa_init
while (k_ref > 1) {
phi_now <- efa_ref$Phi
over_pairs <- which(abs(phi_now) > .80 & lower.tri(phi_now), arr.ind = TRUE)
if (nrow(over_pairs) == 0) break
k_ref <- k_ref - 1L
cat("\n>>> Reduzindo número de fatores para", k_ref, "devido a |Phi| > .80\n")
efa_ref <- fa(items, nfactors = k_ref, n.obs = nrow(items),
fm = "pa", rotate = "oblimin")
}
cat("\n=== EFA REFINADO (k =", k_ref, ") ===\n")
##
## === EFA REFINADO (k = 4 ) ===
pretty_loadings(efa_ref, cutoff = .30)
##
## Loadings:
## PA1 PA2 PA3 PA4
## IC1 0.656
## IC3 0.690
## IC4 0.688
## IC5 0.687
## IC6 0.713
## WM1 0.794
## WM2 0.760
## WM3 0.829
## WM4 0.780
## WM5 0.567
## WM6 0.812
## CF1 0.858
## CF2 0.739
## CF3 0.728
## CF4 0.874
## CF5 0.849
## SR1 0.689
## SR2 0.765
## SR3 0.672
## SR4 0.594
## SR5 0.636
## SR6 0.698
## CL1 0.630
## CL2 0.609 -0.361
## CL3 0.712
## CL4 0.667
## CL5 0.734
## IES1 0.769
## IES2 0.666
## IES3 0.726
## IES4 0.813
## IES5 0.807
## OSN1 0.804
## OSN2 0.691
## OSN3 0.797
## FHT1 0.880
## FHT2 0.796
## FHT3 0.869
## FHT4 0.751
## FHT5 0.773
## PR1 0.770
## PR2 0.784
## PR3 0.800
## IP2 0.527
## IP3 0.620
## IP4 0.592
## IP5 0.610
## CP1 0.515
## CP2 0.571
## CP3 0.646
## CP4 0.713
## CP5 0.591
## CP6 0.579
## CP7 0.674
## TP2 0.690
## TP5 0.629
## IC2 0.482
## IP1 0.464
## CP8 -0.336 0.364
## TP1 -0.339 0.413
## TP3 0.424
## TP4 0.425
##
## PA1 PA2 PA3 PA4
## SS loadings 14.862 10.047 5.060 2.440
## Proportion Var 0.240 0.162 0.082 0.039
## Cumulative Var 0.240 0.402 0.483 0.523
cat("\n--- Variância explicada (refinado) ---\n")
##
## --- Variância explicada (refinado) ---
print(efa_ref$Vaccounted)
## PA1 PA2 PA3 PA4
## SS loadings 15.1908793 10.1414187 5.20373605 2.66730602
## Proportion Var 0.2450142 0.1635713 0.08393123 0.04302106
## Cumulative Var 0.2450142 0.4085855 0.49251668 0.53553774
## Proportion Explained 0.4575106 0.3054337 0.15672327 0.08033246
## Cumulative Proportion 0.4575106 0.7629443 0.91966754 1.00000000
cat("\n--- Phi (refinado) ---\n")
##
## --- Phi (refinado) ---
print(round(efa_ref$Phi, 2))
## PA1 PA2 PA3 PA4
## PA1 1.00 -0.14 -0.22 -0.19
## PA2 -0.14 1.00 0.02 0.20
## PA3 -0.22 0.02 1.00 0.01
## PA4 -0.19 0.20 0.01 1.00
high_phi_ref <- phi_pairs_over(efa_ref$Phi, thr = .80)
if (length(high_phi_ref)) {
cat("\n*** Ainda há pares com |r| > .80:\n")
cat(paste0(" - ", high_phi_ref, collapse = "\n"), "\n")
} else {
cat("\nOK: nenhum par com |r| > .80 no modelo refinado.\n")
}
##
## OK: nenhum par com |r| > .80 no modelo refinado.
comp_tab <- tibble(
Modelo = c(paste0("Inicial (k=", k_init, ")"),
paste0("Refinado (k=", k_ref, ")")),
SSloadings = c(sum(efa_init$Vaccounted["SS loadings", ], na.rm = TRUE),
sum(efa_ref$Vaccounted["SS loadings", ], na.rm = TRUE)),
Proporcao = c(sum(efa_init$Vaccounted["Proportion Var", ], na.rm = TRUE),
sum(efa_ref$Vaccounted["Proportion Var", ], na.rm = TRUE)),
VarAcum = c(max(efa_init$Vaccounted["Cumulative Var", ], na.rm = TRUE),
max(efa_ref$Vaccounted["Cumulative Var", ], na.rm = TRUE))
)
cat("\n=== Comparação Variância Explicada ===\n")
##
## === Comparação Variância Explicada ===
print(comp_tab)
## # A tibble: 2 × 4
## Modelo SSloadings Proporcao VarAcum
## <chr> <dbl> <dbl> <dbl>
## 1 Inicial (k=4) 33.2 0.536 0.536
## 2 Refinado (k=4) 33.2 0.536 0.536
# -----------------------------
# Exports úteis
# -----------------------------
write.table(efa_init$loadings, file = "efa_loadings_inicial.csv", sep = ";",
col.names = NA, quote = FALSE)
write.table(efa_ref$loadings, file = "efa_loadings_refinado.csv", sep = ";",
col.names = NA, quote = FALSE)
write.csv(round(efa_init$Phi, 3), "efa_phi_inicial.csv", row.names = TRUE)
write.csv(round(efa_ref$Phi, 3), "efa_phi_refinado.csv", row.names = TRUE)
if (k_ref < k_init) {
cat(
"A matriz Phi do EFA inicial indicou correlações elevadas (|r| > .80) entre alguns fatores,",
"sugerindo redundância conceitual. Reestimou-se a solução com", k_ref,
"fatores, resultando em estrutura mais parcimoniosa, com variância explicada adequada",
"e cargas fatoriais interpretáveis. Essa versão foi adotada como base para o CFA.\n")
} else {
cat(
"A matriz Phi do EFA inicial não indicou correlações excessivas (|r| > .80) entre fatores,",
"de modo que a solução original (", k_init, "fatores) foi mantida por parcimônia e coerência teórica.\n", sep = "")
}
## A matriz Phi do EFA inicial não indicou correlações excessivas (|r| > .80) entre fatores,de modo que a solução original (4fatores) foi mantida por parcimônia e coerência teórica.
Os testes de fatorabilidade indicaram excelente adequação para a análise fatorial: - KMO geral = 0.88, demonstrando que os padrões de correlação são compactos e apropriados para extração fatorial; - KMO por item: a maioria dos valores ficou acima de 0.80, com pequenas exceções em itens de Performance (ex.: IP1=0.65; CP3=0.64; TP3=0.60), que, embora menores, permanecem dentro de um intervalo aceitável; - Teste de Esfericidade de Bartlett: χ²(1891) = 7924.50, p < .001 — confirmando que a matriz de correlação difere significativamente da identidade e é adequada à redução de dimensionalidade.
O modelo inicial foi estimado com 4 fatores utilizando o método de extração por eixos principais (Principal Axis Factoring) e rotação oblimin, permitindo correlações entre fatores.
| Fator | Variância explicada | Proporção acumulada |
|---|---|---|
| PA1 | 24.5% | 24.5% |
| PA2 | 16.3% | 40.9% |
| PA3 | 8.4% | 49.3% |
| PA4 | 4.3% | 53.6% |
A variância total explicada foi de aproximadamente 54%, o que representa um bom nível de explicação para instrumentos psicossociais multidimensionais.
As cargas apresentaram padrões limpos e interpretáveis, com a maioria
dos itens acima de 0.60, confirmando coerência interna
e convergência dos indicadores dentro de cada fator.
Os grupos de itens (IC, WM, CF, IES, OSN, FHT, PR, SR, CL, CP, TP)
mantiveram a estrutura teórica esperada, reforçando a validade
fatorial.
A matriz Phi indicou correlações moderadas entre fatores, variando entre r = −0.22 e r = +0.20, sem nenhum par acima do limite de |r| = 0.80.
Portanto, não houve evidência de redundância conceitual entre fatores, e a estrutura original de quatro dimensões foi mantida integralmente, preservando a coerência teórica e a parcimônia do modelo.
A solução fatorial revelou um conjunto de fatores claros e consistentes, sustentando o modelo teórico e a estrutura esperada para o CFA.
A Análise Fatorial Confirmatória foi conduzida com base na estrutura de quatro dimensões identificada e mantida na EFA, agora especificada de forma hierárquica no modelo H1P. Esse modelo busca testar empiricamente a adequação teórica das relações entre disfunções cognitivas, regulação individual, suporte organizacional e performance.
csv <- "data.csv"
data <- read_csv(csv)
print(head(data, 2))
## # A tibble: 2 × 76
## id time_start time_end email terms birth_date gender time_coding job_title
## <dbl> <chr> <chr> <chr> <chr> <dbl> <chr> <chr> <chr>
## 1 1 9/2/2025 9… 9/2/202… anon… Sim,… 1974 Femin… Nenhum, nã… Outro...
## 2 2 9/2/2025 1… 9/2/202… anon… Sim,… 1963 Femin… 75 - 100% … Desenvol…
## # ℹ 67 more variables: years_coding <dbl>, salary_monthly <dbl>,
## # neurodivergence <chr>, D11 <dbl>, D12 <dbl>, D13 <dbl>, D14 <dbl>,
## # D15 <dbl>, D16 <dbl>, D21 <dbl>, D22 <dbl>, D23 <dbl>, D24 <dbl>,
## # D25 <dbl>, D26 <dbl>, D31 <dbl>, D32 <dbl>, D33 <dbl>, D34 <dbl>,
## # D35 <dbl>, A11 <dbl>, A12 <dbl>, A13 <dbl>, A14 <dbl>, A15 <dbl>,
## # A21 <dbl>, A22 <dbl>, A23 <dbl>, A31 <dbl>, A32 <dbl>, A33 <dbl>,
## # A34 <dbl>, A35 <dbl>, A41 <dbl>, A42 <dbl>, A43 <dbl>, J11 <dbl>, …
# -----------------------------
# Selecionar SOMENTE itens originais (D11..P35)
# -----------------------------
all_item_names_old <- c(
"D11","D12","D13","D14","D15","D16",
"D21","D22","D23","D24","D25","D26",
"D31","D32","D33","D34","D35",
"A11","A12","A13","A14","A15",
"A21","A22","A23",
"A31","A32","A33","A34","A35",
"A41","A42","A43",
"J11","J12","J13","J14","J15","J16",
"J21","J22","J23","J24","J25",
"P11","P12","P13","P14","P15",
"P21","P22","P23","P24","P25","P26","P27","P28",
"P31","P32","P33","P34","P35"
)
missing_items <- setdiff(all_item_names_old, names(data))
if (length(missing_items) > 0) {
stop(paste("Itens não encontrados no arquivo:", paste(missing_items, collapse = ", ")))
}
df_items_old <- as.data.frame(data[, all_item_names_old])
df_items_old <- invertLikertScaleCMT(df_items_old)
# -----------------------------
# Renomear itens via dicionário
# -----------------------------
df_items_new <- rename_items_en(df_items_old)
old_names <- names(df_items_old)
new_names <- names(df_items_new)
stopifnot(length(old_names) == length(new_names))
name_map <- setNames(new_names, old_names)
map_items <- function(vec_old) unname(name_map[vec_old])
# -----------------------------
# Modelo lavaan
# -----------------------------
lhs_D1 <- paste(map_items(c("D11","D14","D16")), collapse = " + ")
lhs_D2 <- paste(map_items(c("D21","D22","D24")), collapse = " + ")
lhs_D3 <- paste(map_items(c("D31","D34","D35")), collapse = " + ")
lhs_J1 <- paste(map_items(c("J12","J13","J16")), collapse = " + ")
lhs_J2 <- paste(map_items(c("J21","J24","J25")), collapse = " + ")
lhs_A1 <- paste(map_items(c("A14","A15","A21")), collapse = " + ")
lhs_A2 <- paste(map_items(c("A31","A33","A34")), collapse = " + ")
lhs_A3 <- paste(map_items(c("A41","A42","A43")), collapse = " + ")
# P_TASK: P23,P24,P26 | P_SOC: P34,P35
lhs_P_TASK <- paste(map_items(c("P23","P24","P26")), collapse = " + ")
lhs_P_SOC <- paste(map_items(c("P34","P35")), collapse = " + ")
O modelo H1P foi especificado em duas ordens fatoriais:
O modelo completo, implementado no lavaan, é dado por:
model_H1P <- '
# 1ª ORDEM — MEDIDA
# Dysfunctions (maior = mais dificuldade)
D1_INIB =~ IC1 + IC4 + IC6
D2_MEMO =~ WM1 + WM2 + WM4
D3_FLEX =~ CF1 + CF4 + CF5
# Regulação / Jornada (SR*, CL* recodificados p/ maior = melhor)
J1_REG =~ SR2 + SR3 + SR6
J2_REGP =~ CL1 + CL4 + CL5
# Suporte / Acomodações
A1_APOI =~ IES4 + IES5 + OSN1
A2_JUST =~ FHT1 + FHT3 + FHT4
A3_RECO =~ PR1 + PR2 + PR3
# Performance
P_TASK =~ CP3 + CP4 + CP6
P_SOC =~ TP4 + TP5
# 2ª ORDEM
DYS =~ D1_INIB + D2_MEMO + D3_FLEX
REG =~ J1_REG + J2_REGP
SUPPORT =~ A1_APOI + A2_JUST + A3_RECO
# ESTRUTURAL
P_TASK ~ DYS + REG + SUPPORT
P_SOC ~ DYS + REG + SUPPORT
# CORRELAÇÕES
DYS ~~ REG
DYS ~~ SUPPORT
REG ~~ SUPPORT
P_TASK ~~ P_SOC
'
fitH1C <- sem(model_H1P, data = df_items_new)
print(fitMeasures(fitH1C, c("chisq","df","cfi","tli","rmsea","srmr")))
## chisq df cfi tli rmsea srmr
## 579.261 359.000 0.931 0.922 0.064 0.061
summary(fitH1C, fit.measures = TRUE, standardized = TRUE)
## lavaan 0.6-20 ended normally after 92 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 76
##
## Number of observations 148
##
## Model Test User Model:
##
## Test statistic 579.261
## Degrees of freedom 359
## P-value (Chi-square) 0.000
##
## Model Test Baseline Model:
##
## Test statistic 3593.282
## Degrees of freedom 406
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.931
## Tucker-Lewis Index (TLI) 0.922
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -4408.654
## Loglikelihood unrestricted model (H1) -4119.023
##
## Akaike (AIC) 8969.308
## Bayesian (BIC) 9197.096
## Sample-size adjusted Bayesian (SABIC) 8956.584
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.064
## 90 Percent confidence interval - lower 0.055
## 90 Percent confidence interval - upper 0.074
## P-value H_0: RMSEA <= 0.050 0.009
## P-value H_0: RMSEA >= 0.080 0.003
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.061
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## D1_INIB =~
## IC1 1.000 0.704 0.763
## IC4 0.930 0.102 9.134 0.000 0.655 0.782
## IC6 0.880 0.100 8.817 0.000 0.620 0.754
## D2_MEMO =~
## WM1 1.000 0.960 0.910
## WM2 1.038 0.063 16.400 0.000 0.996 0.902
## WM4 0.839 0.063 13.217 0.000 0.805 0.809
## D3_FLEX =~
## CF1 1.000 1.010 0.885
## CF4 0.882 0.055 16.040 0.000 0.891 0.902
## CF5 1.034 0.068 15.231 0.000 1.045 0.880
## J1_REG =~
## SR2 1.000 0.879 0.805
## SR3 0.875 0.087 10.002 0.000 0.769 0.772
## SR6 1.054 0.100 10.581 0.000 0.927 0.809
## J2_REGP =~
## CL1 1.000 0.862 0.796
## CL4 1.002 0.091 10.981 0.000 0.863 0.831
## CL5 0.967 0.087 11.098 0.000 0.833 0.838
## A1_APOI =~
## IES4 1.000 0.824 0.806
## IES5 0.944 0.076 12.379 0.000 0.778 0.865
## OSN1 0.956 0.082 11.630 0.000 0.788 0.828
## A2_JUST =~
## FHT1 1.000 0.889 0.895
## FHT3 0.982 0.062 15.890 0.000 0.873 0.889
## FHT4 0.793 0.076 10.461 0.000 0.704 0.709
## A3_RECO =~
## PR1 1.000 0.769 0.846
## PR2 0.998 0.078 12.792 0.000 0.767 0.858
## PR3 1.044 0.083 12.592 0.000 0.803 0.849
## P_TASK =~
## CP3 1.000 0.625 0.811
## CP4 1.131 0.142 7.940 0.000 0.706 1.030
## CP6 0.536 0.098 5.475 0.000 0.335 0.418
## P_SOC =~
## TP4 1.000 0.777 0.740
## TP5 0.766 0.152 5.039 0.000 0.595 0.774
## DYS =~
## D1_INIB 1.000 0.845 0.845
## D2_MEMO 1.379 0.165 8.338 0.000 0.855 0.855
## D3_FLEX 1.625 0.184 8.827 0.000 0.958 0.958
## REG =~
## J1_REG 1.000 0.903 0.903
## J2_REGP 0.976 0.112 8.712 0.000 0.899 0.899
## SUPPORT =~
## A1_APOI 1.000 0.994 0.994
## A2_JUST 1.063 0.089 11.898 0.000 0.979 0.979
## A3_RECO 0.826 0.082 10.040 0.000 0.879 0.879
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## P_TASK ~
## DYS -0.007 1.104 -0.007 0.995 -0.007 -0.007
## REG -0.057 0.862 -0.067 0.947 -0.073 -0.073
## SUPPORT 0.021 0.133 0.157 0.875 0.027 0.027
## P_SOC ~
## DYS 3.160 4.070 0.777 0.437 2.422 2.422
## REG -2.775 3.194 -0.869 0.385 -2.834 -2.834
## SUPPORT -0.094 0.454 -0.206 0.837 -0.099 -0.099
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## DYS ~~
## REG 0.457 0.080 5.746 0.000 0.968 0.968
## SUPPORT -0.080 0.045 -1.773 0.076 -0.164 -0.164
## REG ~~
## SUPPORT -0.192 0.066 -2.932 0.003 -0.296 -0.296
## .P_TASK ~~
## .P_SOC 0.069 0.071 0.970 0.332 0.210 0.210
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .IC1 0.356 0.054 6.570 0.000 0.356 0.418
## .IC4 0.272 0.043 6.300 0.000 0.272 0.389
## .IC6 0.292 0.044 6.691 0.000 0.292 0.432
## .WM1 0.192 0.037 5.168 0.000 0.192 0.173
## .WM2 0.227 0.042 5.452 0.000 0.227 0.186
## .WM4 0.344 0.047 7.308 0.000 0.344 0.346
## .CF1 0.283 0.044 6.488 0.000 0.283 0.217
## .CF4 0.183 0.030 6.048 0.000 0.183 0.187
## .CF5 0.320 0.048 6.607 0.000 0.320 0.226
## .SR2 0.421 0.064 6.532 0.000 0.421 0.353
## .SR3 0.401 0.058 6.954 0.000 0.401 0.404
## .SR6 0.454 0.070 6.463 0.000 0.454 0.346
## .CL1 0.430 0.062 6.896 0.000 0.430 0.367
## .CL4 0.334 0.052 6.378 0.000 0.334 0.310
## .CL5 0.293 0.047 6.239 0.000 0.293 0.297
## .IES4 0.367 0.049 7.417 0.000 0.367 0.351
## .IES5 0.204 0.031 6.585 0.000 0.204 0.252
## .OSN1 0.285 0.040 7.186 0.000 0.285 0.315
## .FHT1 0.197 0.032 6.070 0.000 0.197 0.200
## .FHT3 0.202 0.032 6.227 0.000 0.202 0.209
## .FHT4 0.492 0.061 8.009 0.000 0.492 0.498
## .PR1 0.235 0.037 6.430 0.000 0.235 0.284
## .PR2 0.211 0.034 6.190 0.000 0.211 0.264
## .PR3 0.250 0.039 6.376 0.000 0.250 0.280
## .CP3 0.203 0.050 4.080 0.000 0.203 0.342
## .CP4 -0.029 0.056 -0.518 0.604 -0.029 -0.062
## .CP6 0.530 0.063 8.442 0.000 0.530 0.825
## .TP4 0.500 0.124 4.029 0.000 0.500 0.453
## .TP5 0.237 0.070 3.385 0.001 0.237 0.401
## .D1_INIB 0.141 0.040 3.562 0.000 0.285 0.285
## .D2_MEMO 0.247 0.050 4.934 0.000 0.269 0.269
## .D3_FLEX 0.085 0.040 2.123 0.034 0.083 0.083
## .J1_REG 0.143 0.049 2.921 0.003 0.185 0.185
## .J2_REGP 0.143 0.045 3.158 0.002 0.193 0.193
## .A1_APOI 0.009 0.027 0.319 0.750 0.013 0.013
## .A2_JUST 0.032 0.030 1.074 0.283 0.041 0.041
## .A3_RECO 0.134 0.032 4.194 0.000 0.227 0.227
## .P_TASK 0.387 0.077 5.011 0.000 0.992 0.992
## .P_SOC 0.281 0.276 1.017 0.309 0.465 0.465
## DYS 0.355 0.081 4.380 0.000 1.000 1.000
## REG 0.630 0.126 5.007 0.000 1.000 1.000
## SUPPORT 0.670 0.117 5.714 0.000 1.000 1.000
A modelagem de equações estruturais (SEM) foi estimada pelo método de máxima verossimilhança (ML) com 148 observações válidas. O modelo H1C apresentou ajuste global satisfatório, de acordo com os principais índices de qualidade de ajuste (fit indices):
| Índice | Valor | Referência | Interpretação |
|---|---|---|---|
| χ² (gl = 359) | 579.261 (p < .001) | — | Qui-quadrado esperado como significativo em amostras ≥ médias |
| CFI | 0.931 | ≥ 0.90 | Bom ajuste |
| TLI | 0.922 | ≥ 0.90 | Bom ajuste |
| RMSEA (IC90%) | 0.064 (0.055–0.074) | ≤ 0.08 | Ajuste adequado |
| SRMR | 0.061 | ≤ 0.08 | Ajuste aceitável |
Esses resultados indicam que o modelo possui ajuste satisfatório e parcimonioso, refletindo coerência entre a estrutura teórica proposta e os dados empíricos.
O modelo compreende nove fatores de primeira ordem agrupados em três fatores de segunda ordem — Disfunções (DYS), Regulação (REG) e Suporte (SUPPORT) — que, por sua vez, explicam dois construtos de desempenho (P_TASK e P_SOC):
| Fator | Itens | Cargas (Std.all) – faixa |
|---|---|---|
| D1_INIB | IC1, IC4, IC6 | 0.75–0.78 |
| D2_MEMO | WM1, WM2, WM4 | 0.81–0.91 |
| D3_FLEX | CF1, CF4, CF5 | 0.88–0.90 |
| J1_REG | SR2, SR3, SR6 | 0.77–0.81 |
| J2_REGP | CL1, CL4, CL5 | 0.80–0.84 |
| A1_APOI | IES4, IES5, OSN1 | 0.81–0.87 |
| A2_JUST | FHT1, FHT3, FHT4 | 0.71–0.89 |
| A3_RECO | PR1, PR2, PR3 | 0.84–0.86 |
| P_TASK | CP3, CP4, CP6 | 0.42–1.03 |
| P_SOC | TP4, TP5 | 0.74–0.77 |
| 2ª ordem | 1ª ordem | Carga (Std.all) |
|---|---|---|
| DYS | D1_INIB, D2_MEMO, D3_FLEX | 0.85, 0.86, 0.96 |
| REG | J1_REG, J2_REGP | 0.90, 0.90 |
| SUPPORT | A1_APOI, A2_JUST, A3_RECO | 0.99, 0.98, 0.88 |
| Relação | Estimativa (Std.all) | p |
|---|---|---|
| DYS ↔︎ REG | 0.968 | < .001 |
| DYS ↔︎ SUPPORT | −0.164 | .076 |
| REG ↔︎ SUPPORT | −0.296 | .003 |
Essas correlações indicam que maiores níveis de disfunções cognitivas estão fortemente associados a dificuldades de regulação, enquanto maior suporte percebido tende a se associar a menores disfunções e melhor regulação emocional e comportamental.
As regressões dos fatores de performance (individual e social) não apresentaram significância estatística:
| Regressão | Estimativa (Std.all) | p | Interpretação |
|---|---|---|---|
| P_TASK ~ DYS | −0.007 | .995 | n.s. |
| P_TASK ~ REG | −0.073 | .947 | n.s. |
| P_TASK ~ SUPPORT | 0.027 | .875 | n.s. |
| P_SOC ~ DYS | 2.422 | .437 | n.s. |
| P_SOC ~ REG | −2.834 | .385 | n.s. |
| P_SOC ~ SUPPORT | −0.099 | .837 | n.s. |
Esses resultados sugerem que, nesta amostra, as variações em disfunções, regulação e suporte não impactaram significativamente os indicadores de performance modelados.
semPaths(fitH1C, "std", layout = "tree", edge.label.cex = 0.8,
sizeMan = 10, sizeLat = 12, nCharNodes = 7)
items <- list(
D1_INIB = c("IC1","IC4","IC6"),
D2_MEMO = c("WM1","WM2","WM4"),
D3_FLEX = c("CF1","CF4","CF5"),
J1_REG = c("SR2","SR3","SR6"),
J2_REGP = c("CL1","CL4","CL5"),
A1_APOI = c("IES4","IES5","OSN1"),
A2_JUST = c("FHT1","FHT3","FHT4"),
A3_RECO = c("PR1","PR2","PR3"),
P_TASK = c("CP3","CP4","CP6"),
P_SOC = c("TP4","TP5")
)
g <- semPlot::semPlotModel(fitH1C) # ou fit_free
nodes <- g@Vars$name
place_fan <- function(names_vec, x_center, y, width = 0.6){
n <- length(names_vec)
xs <- if (n == 1L) rep(x_center, 1) else seq(x_center - width/2, x_center + width/2, length.out = n)
data.frame(name = names_vec, x = xs, y = rep(y, n), stringsAsFactors = FALSE)
}
# ---------- parâmetros ----------
w3 <- 1.55 # base (1ª ordem) com 3 itens
w2 <- 1.05 # base com 2 itens (não temos aqui, mas fica)
wtop <- 1.05 # topo (P_TASK/P_SOC)
xSpan <- 16 # largura total das colunas dos 8 fatores 1ª ordem
# ---------- níveis ----------
p_task_x <- -2; p_soc_x <- 2
lvl4 <- rbind(
place_fan("P_TASK", p_task_x, 4, width = 0),
place_fan("P_SOC" , p_soc_x , 4, width = 0)
)
lvl5 <- rbind(
place_fan(items$P_TASK, p_task_x, 5, width = wtop),
place_fan(items$P_SOC , p_soc_x , 5, width = wtop)
)
# 2ª ordem
lvl3 <- rbind(
place_fan("DYS" , -4, 3, width = 0),
place_fan("REG" , 0, 3, width = 0),
place_fan("SUPPORT", 4, 3, width = 0)
)
# 1ª ordem (colunas)
first_order <- c("D1_INIB","D2_MEMO","D3_FLEX","J1_REG","J2_REGP","A1_APOI","A2_JUST","A3_RECO")
x_seq <- seq(-xSpan/2, xSpan/2, length.out = length(first_order))
lvl2 <- do.call(rbind, Map(function(nm, x) place_fan(nm, x, 2, width = 0), first_order, x_seq))
width_map <- sapply(first_order, function(nm) if (length(items[[nm]]) == 3) w3 else w2)
lvl1_list <- Map(function(nm, x, w) place_fan(items[[nm]], x, 1, width = w),
first_order, x_seq, width_map)
lvl1 <- do.call(rbind, lvl1_list)
coords <- rbind(lvl1, lvl2, lvl3, lvl4, lvl5)
coords$x <- coords$x - mean(coords$x)
# reordena na ordem esperada pelo semPaths
coords <- coords[match(nodes, coords$name), c("x","y")]
is_item <- nodes %in% unlist(items)
is_latent <- !is_item
label_cex <- ifelse(is_item, 0.70, 1.05)
p_pa <- semPaths(
fitH1C,
whatLabels = "std",
style = "ram",
layout = as.matrix(coords),
residuals = FALSE,
intercepts = FALSE,
curvePivot = TRUE,
nCharNodes = 0,
nCharEdges = 0,
# >>> ajustes de legibilidade <<<
sizeLat = 15.8, # construtos maiores (círculos)
sizeMan = 8.0, # itens menores
node.width = 0.32, # caixas estreitas (evita colisão)
label.cex = label_cex, # **latentes grandes, itens pequenos**
edge.label.cex = 0.35 # números nas setas discretos
)
Essa análise permite avaliar se os construtos são interpretados da mesma forma pelos dois grupos e se eventuais diferenças observadas refletem variações reais nos construtos, e não diferenças de mensuração.
# dicionário de rótulos do questionário
rotulo_nt <- "Não tenho nenhum tipo de neurodivergência"
rotulo_ans <- "Tenho um transtorno de ansiedade (por exemplo, TAG, etc.)"
rotulo_conc <- "Tenho um distúrbio de concentração e/ou memória (por exemplo, TDAH, etc.)"
rotulo_tea <- "Tenho autismo/um transtorno do espectro autista (por exemplo, Asperger, etc.)"
rotulo_hum <- "Tenho um distúrbio de humor ou emocional (por exemplo, depressão, transtorno bipolar, etc.)"
rotulo_dis <- "Tenho diferenças de aprendizagem (por exemplo, disléxico, dislexia, etc.)"
rotulo_out <- "Outros..."
norm <- function(x) {
x %>%
str_replace_all("\n", " ") %>%
str_squish() %>%
str_trim() %>%
stringi::stri_trans_general("Latin-ASCII")
}
dados <- data %>%
mutate(
neurodivergence_raw = as.character(neurodivergence),
neurodivergence_norm = norm(neurodivergence_raw)
)
rotulos_norm <- norm(c(rotulo_nt, rotulo_ans, rotulo_conc, rotulo_tea, rotulo_hum, rotulo_dis, rotulo_out))
names(rotulos_norm) <- c("NT","ANS","CONC","TEA","HUM","DIS","OUT")
sep_regex <- "\\s*[;|/,]\\s*"
detect_has <- function(x, target) {
any_of <- paste0("(^|", sep_regex, ")", str_replace_all(target, "([\\W])", "\\\\\\1"), "($|", sep_regex, ")")
str_detect(x, any_of)
}
dados <- dados %>%
mutate(
has_NT = detect_has(neurodivergence_norm, rotulos_norm["NT"]),
has_ANS = detect_has(neurodivergence_norm, rotulos_norm["ANS"]),
has_CONC = detect_has(neurodivergence_norm, rotulos_norm["CONC"]),
has_TEA = detect_has(neurodivergence_norm, rotulos_norm["TEA"]),
has_HUM = detect_has(neurodivergence_norm, rotulos_norm["HUM"]),
has_DIS = detect_has(neurodivergence_norm, rotulos_norm["DIS"]),
has_OUT = detect_has(neurodivergence_norm, rotulos_norm["OUT"])
) %>%
mutate(
GROUP = case_when(
is.na(neurodivergence_raw) ~ NA_character_,
has_NT & !(has_ANS|has_CONC|has_TEA|has_HUM|has_DIS|has_OUT) ~ "Neurotípico",
TRUE ~ "Neurodivergente"
) %>% factor(levels = c("Neurotípico","Neurodivergente")),
ND_TYPE = case_when(
is.na(neurodivergence_raw) ~ NA_character_,
has_NT & !(has_ANS|has_CONC|has_TEA|has_HUM|has_DIS|has_OUT) ~ "Neurotípico",
has_TEA ~ "TEA",
has_CONC ~ "Concentração/TDAH",
has_DIS ~ "Diferenças de aprendizagem",
has_ANS ~ "Ansiedade",
has_HUM ~ "Humor/Emocional",
has_OUT ~ "Outros",
TRUE ~ "Outros"
) %>% factor(levels = c("Neurotípico","TEA","Concentração/TD AH",
"Diferenças de aprendizagem","Ansiedade","Humor/Emocional","Outros"))
)
dados <- bind_cols(dados, df_items_new)
print(table(dados$GROUP, useNA = "ifany"))
##
## Neurotípico Neurodivergente
## 87 61
print(table(dados$ND_TYPE, useNA = "ifany"))
##
## Neurotípico TEA
## 87 16
## Concentração/TD AH Diferenças de aprendizagem
## 0 1
## Ansiedade Humor/Emocional
## 10 0
## Outros <NA>
## 3 31
A amostra é composta por 148 participantes, sendo 87 (58,8%) identificados como neurotípicos e 61 (41,2%) como neurodivergentes. Entre os neurodivergentes, predominam pessoas com dificuldades de concentração e/ou TDAH (31), seguidas por indivíduos com Transtorno do Espectro Autista – TEA (16), transtornos de ansiedade (10), outros tipos de neurodivergência (3) e diferenças de aprendizagem (1). Nenhum participante relatou distúrbios de humor ou emocionais. Esses dados evidenciam uma presença expressiva de profissionais neurodivergentes na amostra, com destaque para condições relacionadas à atenção e ao espectro autista.
fit_free <- sem(model_H1P, data = dados, group = "GROUP")
fit_equal_paths <- sem(
model_H1P, data = dados, group = "GROUP",
group.equal = c("loadings", "regressions")
)
anova(fit_free, fit_equal_paths)
fitMeasures(fit_free, c("cfi","rmsea","srmr"))
## cfi rmsea srmr
## 0.835 0.094 0.084
fitMeasures(fit_equal_paths, c("cfi","rmsea","srmr"))
## cfi rmsea srmr
## 0.836 0.092 0.088
summary(fit_free, standardized = TRUE, fit.measures = TRUE)
## lavaan 0.6-20 ended normally after 374 iterations
##
## Estimator ML
## Optimization method NLMINB
## Number of model parameters 210
##
## Number of observations per group:
## Neurotípico 87
## Neurodivergente 61
##
## Model Test User Model:
##
## Test statistic 1191.845
## Degrees of freedom 718
## P-value (Chi-square) 0.000
## Test statistic for each group:
## Neurotípico 553.092
## Neurodivergente 638.753
##
## Model Test Baseline Model:
##
## Test statistic 3685.325
## Degrees of freedom 812
## P-value 0.000
##
## User Model versus Baseline Model:
##
## Comparative Fit Index (CFI) 0.835
## Tucker-Lewis Index (TLI) 0.813
##
## Loglikelihood and Information Criteria:
##
## Loglikelihood user model (H0) -4283.246
## Loglikelihood unrestricted model (H1) -3687.324
##
## Akaike (AIC) 8986.493
## Bayesian (BIC) 9615.907
## Sample-size adjusted Bayesian (SABIC) 8951.335
##
## Root Mean Square Error of Approximation:
##
## RMSEA 0.094
## 90 Percent confidence interval - lower 0.085
## 90 Percent confidence interval - upper 0.104
## P-value H_0: RMSEA <= 0.050 0.000
## P-value H_0: RMSEA >= 0.080 0.993
##
## Standardized Root Mean Square Residual:
##
## SRMR 0.084
##
## Parameter Estimates:
##
## Standard errors Standard
## Information Expected
## Information saturated (h1) model Structured
##
##
## Group 1 [Neurotípico]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## D1_INIB =~
## IC1 1.000 0.559 0.804
## IC4 0.839 0.163 5.137 0.000 0.469 0.676
## IC6 0.667 0.150 4.449 0.000 0.373 0.558
## D2_MEMO =~
## WM1 1.000 0.695 0.871
## WM2 1.075 0.131 8.221 0.000 0.747 0.851
## WM4 0.696 0.118 5.914 0.000 0.484 0.615
## D3_FLEX =~
## CF1 1.000 0.628 0.729
## CF4 0.962 0.138 6.965 0.000 0.605 0.841
## CF5 0.737 0.137 5.397 0.000 0.463 0.627
## J1_REG =~
## SR2 1.000 0.582 0.643
## SR3 1.067 0.206 5.189 0.000 0.621 0.740
## SR6 1.090 0.223 4.898 0.000 0.635 0.674
## J2_REGP =~
## CL1 1.000 0.820 0.799
## CL4 0.896 0.121 7.374 0.000 0.734 0.802
## CL5 0.726 0.109 6.627 0.000 0.595 0.719
## A1_APOI =~
## IES4 1.000 0.910 0.814
## IES5 0.892 0.092 9.727 0.000 0.811 0.870
## OSN1 0.948 0.101 9.388 0.000 0.862 0.850
## A2_JUST =~
## FHT1 1.000 0.979 0.897
## FHT3 0.948 0.079 11.998 0.000 0.929 0.885
## FHT4 0.697 0.094 7.385 0.000 0.683 0.672
## A3_RECO =~
## PR1 1.000 0.850 0.901
## PR2 0.949 0.084 11.298 0.000 0.807 0.867
## PR3 0.984 0.095 10.395 0.000 0.837 0.830
## P_TASK =~
## CP3 1.000 0.655 0.820
## CP4 1.043 0.135 7.706 0.000 0.684 0.984
## CP6 0.610 0.131 4.640 0.000 0.400 0.475
## P_SOC =~
## TP4 1.000 0.746 0.693
## TP5 0.758 0.203 3.727 0.000 0.566 0.784
## DYS =~
## D1_INIB 1.000 0.676 0.676
## D2_MEMO 1.216 0.293 4.143 0.000 0.661 0.661
## D3_FLEX 1.525 0.342 4.452 0.000 0.916 0.916
## REG =~
## J1_REG 1.000 0.851 0.851
## J2_REGP 1.388 0.303 4.575 0.000 0.839 0.839
## SUPPORT =~
## A1_APOI 1.000 0.992 0.992
## A2_JUST 1.048 0.115 9.083 0.000 0.966 0.966
## A3_RECO 0.821 0.100 8.218 0.000 0.871 0.871
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## P_TASK ~
## DYS -2.549 3.380 -0.754 0.451 -1.469 -1.469
## REG 1.434 2.716 0.528 0.598 1.084 1.084
## SUPPORT 0.093 0.272 0.343 0.732 0.128 0.128
## P_SOC ~
## DYS 0.407 2.428 0.167 0.867 0.206 0.206
## REG -0.989 1.987 -0.498 0.619 -0.657 -0.657
## SUPPORT 0.127 0.214 0.591 0.555 0.153 0.153
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## DYS ~~
## REG 0.176 0.052 3.369 0.001 0.939 0.939
## SUPPORT -0.074 0.046 -1.603 0.109 -0.217 -0.217
## REG ~~
## SUPPORT -0.166 0.068 -2.443 0.015 -0.370 -0.370
## .P_TASK ~~
## .P_SOC 0.069 0.086 0.806 0.420 0.208 0.208
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .IC1 1.977 0.074 26.555 0.000 1.977 2.847
## .IC4 1.713 0.074 23.042 0.000 1.713 2.470
## .IC6 1.782 0.072 24.868 0.000 1.782 2.666
## .WM1 2.230 0.086 26.064 0.000 2.230 2.794
## .WM2 2.149 0.094 22.836 0.000 2.149 2.448
## .WM4 2.046 0.084 24.264 0.000 2.046 2.601
## .CF1 1.943 0.092 21.008 0.000 1.943 2.252
## .CF4 1.989 0.077 25.793 0.000 1.989 2.765
## .CF5 1.874 0.079 23.623 0.000 1.874 2.533
## .SR2 2.333 0.097 24.035 0.000 2.333 2.577
## .SR3 2.276 0.090 25.273 0.000 2.276 2.710
## .SR6 2.425 0.101 24.005 0.000 2.425 2.574
## .CL1 2.529 0.110 22.977 0.000 2.529 2.463
## .CL4 2.264 0.098 23.070 0.000 2.264 2.473
## .CL5 2.126 0.089 23.962 0.000 2.126 2.569
## .IES4 3.391 0.120 28.293 0.000 3.391 3.033
## .IES5 3.540 0.100 35.421 0.000 3.540 3.798
## .OSN1 3.126 0.109 28.734 0.000 3.126 3.081
## .FHT1 3.494 0.117 29.846 0.000 3.494 3.200
## .FHT3 3.506 0.112 31.170 0.000 3.506 3.342
## .FHT4 3.529 0.109 32.419 0.000 3.529 3.476
## .PR1 3.563 0.101 35.236 0.000 3.563 3.778
## .PR2 3.667 0.100 36.753 0.000 3.667 3.940
## .PR3 3.379 0.108 31.255 0.000 3.379 3.351
## .CP3 3.874 0.086 45.192 0.000 3.874 4.845
## .CP4 4.000 0.074 53.698 0.000 4.000 5.757
## .CP6 3.540 0.090 39.240 0.000 3.540 4.207
## .TP4 4.034 0.115 34.944 0.000 4.034 3.746
## .TP5 4.092 0.077 52.914 0.000 4.092 5.673
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .IC1 0.170 0.054 3.153 0.002 0.170 0.353
## .IC4 0.261 0.053 4.912 0.000 0.261 0.543
## .IC6 0.308 0.054 5.749 0.000 0.308 0.689
## .WM1 0.153 0.049 3.108 0.002 0.153 0.241
## .WM2 0.212 0.060 3.546 0.000 0.212 0.275
## .WM4 0.385 0.064 5.999 0.000 0.385 0.622
## .CF1 0.349 0.066 5.291 0.000 0.349 0.469
## .CF4 0.151 0.040 3.751 0.000 0.151 0.293
## .CF5 0.332 0.057 5.871 0.000 0.332 0.607
## .SR2 0.481 0.089 5.431 0.000 0.481 0.587
## .SR3 0.320 0.070 4.549 0.000 0.320 0.453
## .SR6 0.485 0.093 5.213 0.000 0.485 0.546
## .CL1 0.381 0.084 4.513 0.000 0.381 0.362
## .CL4 0.299 0.067 4.465 0.000 0.299 0.357
## .CL5 0.331 0.062 5.357 0.000 0.331 0.483
## .IES4 0.422 0.075 5.636 0.000 0.422 0.338
## .IES5 0.211 0.042 5.000 0.000 0.211 0.243
## .OSN1 0.286 0.054 5.295 0.000 0.286 0.278
## .FHT1 0.233 0.052 4.455 0.000 0.233 0.196
## .FHT3 0.238 0.050 4.733 0.000 0.238 0.217
## .FHT4 0.565 0.091 6.197 0.000 0.565 0.548
## .PR1 0.167 0.041 4.061 0.000 0.167 0.188
## .PR2 0.214 0.045 4.807 0.000 0.214 0.248
## .PR3 0.317 0.060 5.316 0.000 0.317 0.311
## .CP3 0.210 0.055 3.795 0.000 0.210 0.328
## .CP4 0.015 0.049 0.311 0.756 0.015 0.032
## .CP6 0.548 0.085 6.442 0.000 0.548 0.774
## .TP4 0.603 0.164 3.667 0.000 0.603 0.520
## .TP5 0.200 0.084 2.383 0.017 0.200 0.385
## .D1_INIB 0.169 0.058 2.930 0.003 0.543 0.543
## .D2_MEMO 0.273 0.069 3.939 0.000 0.564 0.564
## .D3_FLEX 0.063 0.046 1.371 0.170 0.160 0.160
## .J1_REG 0.093 0.052 1.809 0.070 0.275 0.275
## .J2_REGP 0.200 0.084 2.372 0.018 0.297 0.297
## .A1_APOI 0.013 0.042 0.299 0.765 0.015 0.015
## .A2_JUST 0.064 0.051 1.256 0.209 0.067 0.067
## .A3_RECO 0.174 0.049 3.554 0.000 0.241 0.241
## .P_TASK 0.284 0.141 2.022 0.043 0.662 0.662
## .P_SOC 0.387 0.155 2.498 0.012 0.696 0.696
## DYS 0.143 0.055 2.591 0.010 1.000 1.000
## REG 0.246 0.094 2.622 0.009 1.000 1.000
## SUPPORT 0.815 0.184 4.427 0.000 1.000 1.000
##
##
## Group 2 [Neurodivergente]:
##
## Latent Variables:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## D1_INIB =~
## IC1 1.000 0.536 0.573
## IC4 1.115 0.276 4.035 0.000 0.598 0.745
## IC6 1.249 0.302 4.140 0.000 0.670 0.795
## D2_MEMO =~
## WM1 1.000 0.970 0.914
## WM2 0.934 0.096 9.768 0.000 0.906 0.877
## WM4 0.682 0.085 8.032 0.000 0.661 0.789
## D3_FLEX =~
## CF1 1.000 0.943 0.898
## CF4 0.867 0.089 9.730 0.000 0.818 0.868
## CF5 1.131 0.105 10.778 0.000 1.067 0.910
## J1_REG =~
## SR2 1.000 0.773 0.798
## SR3 0.935 0.163 5.741 0.000 0.723 0.728
## SR6 1.113 0.176 6.333 0.000 0.861 0.798
## J2_REGP =~
## CL1 1.000 0.698 0.749
## CL4 1.094 0.184 5.940 0.000 0.763 0.799
## CL5 0.959 0.164 5.846 0.000 0.669 0.786
## A1_APOI =~
## IES4 1.000 0.711 0.825
## IES5 0.950 0.120 7.932 0.000 0.675 0.826
## OSN1 0.933 0.129 7.249 0.000 0.664 0.778
## A2_JUST =~
## FHT1 1.000 0.742 0.904
## FHT3 1.001 0.095 10.581 0.000 0.743 0.884
## FHT4 0.969 0.125 7.775 0.000 0.719 0.762
## A3_RECO =~
## PR1 1.000 0.600 0.729
## PR2 1.138 0.180 6.336 0.000 0.683 0.835
## PR3 1.243 0.186 6.670 0.000 0.746 0.885
## P_TASK =~
## CP3 1.000 0.783 1.106
## CP4 0.676 0.139 4.874 0.000 0.530 0.797
## CP6 0.266 0.123 2.159 0.031 0.208 0.282
## P_SOC =~
## TP4 1.000 0.768 0.773
## TP5 0.795 0.270 2.940 0.003 0.610 0.775
## DYS =~
## D1_INIB 1.000 0.784 0.784
## D2_MEMO 1.969 0.519 3.797 0.000 0.854 0.854
## D3_FLEX 2.058 0.531 3.873 0.000 0.918 0.918
## REG =~
## J1_REG 1.000 0.826 0.826
## J2_REGP 0.903 0.194 4.650 0.000 0.827 0.827
## SUPPORT =~
## A1_APOI 1.000 1.023 1.023
## A2_JUST 1.020 0.115 8.903 0.000 1.000 1.000
## A3_RECO 0.721 0.125 5.756 0.000 0.874 0.874
##
## Regressions:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## P_TASK ~
## DYS -7.666 28.739 -0.267 0.790 -4.118 -4.118
## REG 5.288 18.929 0.279 0.780 4.315 4.315
## SUPPORT 0.822 3.072 0.268 0.789 0.764 0.764
## P_SOC ~
## DYS -11.981 42.997 -0.279 0.781 -6.561 -6.561
## REG 7.825 28.319 0.276 0.782 6.509 6.509
## SUPPORT 1.544 4.597 0.336 0.737 1.462 1.462
##
## Covariances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## DYS ~~
## REG 0.269 0.090 2.986 0.003 1.001 1.001
## SUPPORT 0.007 0.043 0.163 0.871 0.023 0.023
## REG ~~
## SUPPORT -0.074 0.073 -1.014 0.311 -0.160 -0.160
## .P_TASK ~~
## .P_SOC 0.674 2.226 0.303 0.762 0.572 0.572
##
## Intercepts:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .IC1 2.902 0.120 24.219 0.000 2.902 3.101
## .IC4 2.508 0.103 24.423 0.000 2.508 3.127
## .IC6 2.492 0.108 23.114 0.000 2.492 2.959
## .WM1 3.295 0.136 24.252 0.000 3.295 3.105
## .WM2 3.311 0.132 25.039 0.000 3.311 3.206
## .WM4 3.230 0.107 30.117 0.000 3.230 3.856
## .CF1 3.246 0.134 24.133 0.000 3.246 3.090
## .CF4 3.115 0.121 25.809 0.000 3.115 3.304
## .CF5 3.344 0.150 22.289 0.000 3.344 2.854
## .SR2 3.492 0.124 28.152 0.000 3.492 3.604
## .SR3 3.115 0.127 24.489 0.000 3.115 3.135
## .SR6 3.557 0.138 25.744 0.000 3.557 3.296
## .CL1 3.426 0.119 28.731 0.000 3.426 3.679
## .CL4 3.197 0.122 26.142 0.000 3.197 3.347
## .CL5 3.213 0.109 29.471 0.000 3.213 3.773
## .IES4 3.246 0.110 29.414 0.000 3.246 3.766
## .IES5 3.230 0.105 30.846 0.000 3.230 3.949
## .OSN1 3.164 0.109 28.977 0.000 3.164 3.710
## .FHT1 3.311 0.105 31.516 0.000 3.311 4.035
## .FHT3 3.180 0.108 29.579 0.000 3.180 3.787
## .FHT4 3.279 0.121 27.151 0.000 3.279 3.476
## .PR1 3.246 0.105 30.806 0.000 3.246 3.944
## .PR2 3.410 0.105 32.582 0.000 3.410 4.172
## .PR3 3.246 0.108 30.086 0.000 3.246 3.852
## .CP3 4.082 0.091 45.020 0.000 4.082 5.764
## .CP4 4.131 0.085 48.542 0.000 4.131 6.215
## .CP6 3.475 0.094 36.786 0.000 3.475 4.710
## .TP4 3.787 0.127 29.765 0.000 3.787 3.811
## .TP5 3.738 0.101 37.083 0.000 3.738 4.748
##
## Variances:
## Estimate Std.Err z-value P(>|z|) Std.lv Std.all
## .IC1 0.588 0.119 4.934 0.000 0.588 0.672
## .IC4 0.286 0.072 3.950 0.000 0.286 0.445
## .IC6 0.261 0.077 3.363 0.001 0.261 0.368
## .WM1 0.186 0.062 3.003 0.003 0.186 0.165
## .WM2 0.247 0.065 3.807 0.000 0.247 0.231
## .WM4 0.265 0.056 4.720 0.000 0.265 0.378
## .CF1 0.214 0.055 3.879 0.000 0.214 0.194
## .CF4 0.220 0.051 4.333 0.000 0.220 0.247
## .CF5 0.235 0.065 3.611 0.000 0.235 0.171
## .SR2 0.340 0.086 3.951 0.000 0.340 0.363
## .SR3 0.464 0.102 4.531 0.000 0.464 0.470
## .SR6 0.424 0.107 3.960 0.000 0.424 0.364
## .CL1 0.381 0.087 4.400 0.000 0.381 0.439
## .CL4 0.329 0.083 3.952 0.000 0.329 0.361
## .CL5 0.278 0.068 4.096 0.000 0.278 0.383
## .IES4 0.237 0.049 4.831 0.000 0.237 0.319
## .IES5 0.212 0.044 4.823 0.000 0.212 0.318
## .OSN1 0.287 0.056 5.084 0.000 0.287 0.394
## .FHT1 0.123 0.030 4.052 0.000 0.123 0.183
## .FHT3 0.154 0.035 4.385 0.000 0.154 0.218
## .FHT4 0.373 0.073 5.119 0.000 0.373 0.419
## .PR1 0.317 0.065 4.855 0.000 0.317 0.469
## .PR2 0.202 0.049 4.118 0.000 0.202 0.303
## .PR3 0.154 0.046 3.324 0.001 0.154 0.217
## .CP3 -0.112 0.115 -0.972 0.331 -0.112 -0.223
## .CP4 0.161 0.059 2.723 0.006 0.161 0.365
## .CP6 0.501 0.090 5.563 0.000 0.501 0.921
## .TP4 0.397 0.201 1.979 0.048 0.397 0.403
## .TP5 0.247 0.127 1.954 0.051 0.247 0.399
## .D1_INIB 0.111 0.058 1.915 0.055 0.385 0.385
## .D2_MEMO 0.254 0.085 2.994 0.003 0.270 0.270
## .D3_FLEX 0.140 0.065 2.151 0.031 0.157 0.157
## .J1_REG 0.190 0.082 2.330 0.020 0.318 0.318
## .J2_REGP 0.154 0.068 2.251 0.024 0.317 0.317
## .A1_APOI -0.023 0.029 -0.814 0.416 -0.046 -0.046
## .A2_JUST 0.000 0.028 0.014 0.989 0.001 0.001
## .A3_RECO 0.085 0.035 2.455 0.014 0.235 0.235
## .P_TASK 0.982 1.515 0.648 0.517 1.601 1.601
## .P_SOC 1.418 3.402 0.417 0.677 2.404 2.404
## DYS 0.177 0.091 1.949 0.051 1.000 1.000
## REG 0.408 0.145 2.819 0.005 1.000 1.000
## SUPPORT 0.529 0.133 3.989 0.000 1.000 1.000
fit_scalar <- sem(
model_H1P, data = dados, group = "GROUP",
group.equal = c("loadings","intercepts")
)
parameterEstimates(fit_scalar, standardized = TRUE) %>%
dplyr::filter(op == "~1" & grepl("CORE|SUPPORT|P_TASK|P_SOC", lhs))
# -----------------------------
# Escalas compostas + correlação (após CFA)
# -----------------------------
pick_cols <- function(df, pattern) df[, grep(pattern, names(df), perl = TRUE), drop = FALSE]
dados$Dysfunctions <- rowMeans(cbind(pick_cols(dados, "^(IC|WM|CF)")), na.rm = TRUE)
dados$Accommodations <- rowMeans(cbind(pick_cols(dados, "^(IES|OSN|FHT|PR|VL)")), na.rm = TRUE)
dados$Journey <- rowMeans(cbind(pick_cols(dados, "^(SR|CL|AD)")), na.rm = TRUE)
dados$Performance <- rowMeans(cbind(pick_cols(dados, "^(IP|CP|TP)")), na.rm = TRUE)
summary(dados[, c("Dysfunctions","Accommodations","Journey","Performance")])
## Dysfunctions Accommodations Journey Performance
## Min. :1.000 Min. :1.312 Min. :1.000 Min. :2.500
## 1st Qu.:1.926 1st Qu.:2.812 1st Qu.:2.000 1st Qu.:3.667
## Median :2.412 Median :3.406 Median :2.591 Median :3.889
## Mean :2.474 Mean :3.318 Mean :2.662 Mean :3.888
## 3rd Qu.:3.015 3rd Qu.:3.812 3rd Qu.:3.273 3rd Qu.:4.111
## Max. :4.235 Max. :5.000 Max. :4.545 Max. :5.000
psych::describe(dados[, c("Dysfunctions","Accommodations","Journey","Performance")])
corr_results <- psych::corr.test(
dados[, c("Dysfunctions","Accommodations","Journey","Performance")],
use = "pairwise.complete.obs"
)
corr_results$r
## Dysfunctions Accommodations Journey Performance
## Dysfunctions 1.0000000 -0.1212619 0.8521432 -0.3631787
## Accommodations -0.1212619 1.0000000 -0.1797537 0.1641852
## Journey 0.8521432 -0.1797537 1.0000000 -0.4399907
## Performance -0.3631787 0.1641852 -0.4399907 1.0000000
corr_results$p
## Dysfunctions Accommodations Journey Performance
## Dysfunctions 0.000000e+00 0.14206884 4.019976e-42 2.285849e-05
## Accommodations 1.420688e-01 0.00000000 8.642608e-02 9.230061e-02
## Journey 6.699960e-43 0.02880869 0.000000e+00 1.100477e-07
## Performance 5.714621e-06 0.04615030 2.200954e-08 0.000000e+00
corr_results$ci
vars <- c("Dysfunctions","Accommodations","Journey","Performance")
corr_matrix <- as.matrix(round(corr_results$r[vars, vars], 2))
Δχ²(30)=27.84, p = 0.579 →
não há piora ao igualar cargas +
regressões entre grupos. A estrutura (mensuração + caminhos) é
comparável entre Neurotípicos (NT) e
Neurodivergentes (ND).DYS→D3_FLEX ≈ 0.92;
REG→J1/J2 ≈ 0.85).DYS→D3_FLEX ≈ 0.92; REG→J1/J2 ≈ 0.83).DYS–REG ≈ 0.94 (p <
.01), muito alta; REG–SUPPORT ≈ −0.37
(p = .015), negativa moderada;
DYS–SUPPORT negativa, marginal (p ≈ .109).DYS–REG ≈ 1.00 (p <
.01), quase colinearidade; correlações com SUPPORT
fracas/n.s.DYS,
REG, SUPPORT: não
significativos em ambos os grupos (coeficientes instáveis; ICs
largos).ggcorrplot(
corr_matrix,
type = "full",
lab = TRUE,
lab_size = 4,
tl.cex = 12,
tl.srt = 45,
colors = c("#B2182B","white","#2166AC"),
outline.color = "gray60"
) +
labs(
title = "Correlação entre Construtos (4×4)",
subtitle = "Dysfunctions • Accommodations • Journey • Performance"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5),
axis.title = element_blank(),
axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)
)
Esta etapa avalia se o modelo estrutural se comporta de forma
equivalente entre os grupos de profissionais
neurotípicos (NT) e neurodivergentes
(ND).
A invariância é testada progressivamente em três níveis:
O objetivo é verificar até onde é possível comparar os grupos de forma justa, sem viés de mensuração.
dados_mi <- dados %>%
dplyr::filter(!is.na(GROUP)) %>%
dplyr::mutate(GROUP = factor(GROUP, levels = c("Neurotípico","Neurodivergente")))
stopifnot(identical(levels(dados_mi$GROUP), c("Neurotípico","Neurodivergente")))
get_meas <- function(fit) fitMeasures(fit, c("chisq","df","cfi","tli","rmsea","srmr"))
has_neg_lv_var <- function(fit) {
pe <- parameterEstimates(fit, standardized = FALSE)
any(pe$op == "~~" & pe$lhs == pe$rhs & pe$est < 0 & pe$lhs %in% lavNames(fit, "lv"))
}
is_posdef_vcov <- function(fit) {
vc <- try(lavInspect(fit, "vcov"), silent = TRUE)
if (inherits(vc, "try-error")) return(FALSE)
ev <- try(eigen(vc, symmetric = TRUE, only.values = TRUE)$values, silent = TRUE)
if (inherits(ev, "try-error")) return(FALSE)
min(ev, na.rm = TRUE) > 0
}
# 1) Configural, métrica, escalar
fit_config <- sem(model_H1P, data = dados_mi, group = "GROUP")
fit_metric <- sem(model_H1P, data = dados_mi, group = "GROUP", group.equal = c("loadings"))
fit_scalar <- sem(model_H1P, data = dados_mi, group = "GROUP", group.equal = c("loadings","intercepts"))
fits <- list(Configural = fit_config, Metric = fit_metric, Scalar = fit_scalar)
fits_tab <- do.call(rbind, lapply(fits, get_meas)) |> as.data.frame()
fits_tab$DeltaCFI <- c(NA, diff(fits_tab$cfi))
fits_tab$DeltaRMSEA <- c(NA, diff(fits_tab$rmsea))
cat("\n[ETAPA 4] Ajuste por nível (Δ<=.01 sugere invariância):\n")
##
## [ETAPA 4] Ajuste por nível (Δ<=.01 sugere invariância):
print(round(fits_tab, 3))
## chisq df cfi tli rmsea srmr DeltaCFI DeltaRMSEA
## Configural 1191.845 718 0.835 0.813 0.094 0.084 NA NA
## Metric 1214.287 742 0.836 0.820 0.093 0.087 0.001 -0.002
## Scalar 1253.794 758 0.827 0.815 0.094 0.090 -0.008 0.001
cat("\n[ETAPA 4] Testes χ² de diferença (aninhados):\n")
##
## [ETAPA 4] Testes χ² de diferença (aninhados):
print(lavTestLRT(fit_config, fit_metric))
##
## Chi-Squared Difference Test
##
## Df AIC BIC Chisq Chisq diff RMSEA Df diff Pr(>Chisq)
## fit_config 718 8986.5 9615.9 1191.8
## fit_metric 742 8960.9 9518.4 1214.3 22.442 0 24 0.5529
print(lavTestLRT(fit_metric, fit_scalar))
##
## Chi-Squared Difference Test
##
## Df AIC BIC Chisq Chisq diff RMSEA Df diff Pr(>Chisq)
## fit_metric 742 8960.9 9518.4 1214.3
## fit_scalar 758 8968.4 9478.0 1253.8 39.507 0.1409 16 0.0009186 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 2) Se escalar falhar → escalar parcial (via lavTestScore, não modindices)
need_partial <- {
lrt <- lavTestLRT(fit_metric, fit_scalar)
p_scalar <- tryCatch(tail(lrt$`Pr(>Chisq)`, 1), error = function(e) NA_real_)
isTRUE(!is.na(p_scalar) && p_scalar < 0.05) || has_neg_lv_var(fit_scalar) || !is_posdef_vcov(fit_scalar)
}
if (need_partial) {
cat("\n[ESCALAR PARCIAL] Selecionando interceptos a liberar com lavTestScore()...\n")
# Score tests univariados (compatível com versões antigas do lavaan)
st <- lavTestScore(fit_scalar) # << sem 'add=TRUE'
st_uni <- tryCatch(as_tibble(st$uni), error = function(e) NULL)
if (is.null(st_uni) || !nrow(st_uni)) {
cat("[ESCALAR PARCIAL] Score tests indisponíveis — mantendo escalar total.\n")
fit_scalar_partial <- fit_scalar
} else {
# Nome da estatística pode variar: "mi", "X2" ou "stat"
stat_col <- c("mi","X2","stat","STAT","LM")[c("mi","X2","stat","STAT","LM") %in% names(st_uni)][1]
if (is.null(stat_col)) {
stop("lavTestScore(): não encontrei coluna de estatística em st$uni.")
}
# Interceptos (~1) com maior estatística do score test
st_int <- st_uni %>%
dplyr::filter(op == "~1") %>%
dplyr::arrange(dplyr::desc(.data[[stat_col]]))
N_FREE <- min(5L, nrow(st_int)) # libere até 5 interceptos
if (N_FREE > 0) {
to_free <- unique(st_int$lhs)[1:N_FREE]
group_partial_vec <- paste0(to_free, "~1")
cat("[ESCALAR PARCIAL] Liberando interceptos: ",
paste(group_partial_vec, collapse = ", "), "\n")
fit_scalar_partial <- sem(
model_H1P, data = dados_mi, group = "GROUP",
group.equal = c("loadings","intercepts"),
group.partial = group_partial_vec
)
cat("\n[ESCALAR PARCIAL] LRT (métrica vs escalar parcial):\n")
print(lavTestLRT(fit_metric, fit_scalar_partial))
# Ajuste resumido e deltas
fits2 <- list(Metric = fit_metric, ScalarPartial = fit_scalar_partial)
fits_tab2 <- do.call(rbind, lapply(fits2, get_meas)) |> as.data.frame()
fits_tab2$DeltaCFI <- c(NA, diff(fits_tab2$cfi))
fits_tab2$DeltaRMSEA <- c(NA, diff(fits_tab2$rmsea))
cat("\n[ESCALAR PARCIAL] Ajuste por nível (Δ<=.01 sugere invariância):\n")
print(round(fits_tab2, 3))
# Checagem rápida de estabilidade numérica
if (has_neg_lv_var(fit_scalar_partial) || !is_posdef_vcov(fit_scalar_partial)) {
cat("\n[AVISO] O escalar parcial ainda mostra instabilidade numérica.\n", sep = "")
}
fit_for_means <- fit_scalar_partial
} else {
cat("[ESCALAR PARCIAL] Nenhum intercepto elegível encontrado — mantendo escalar total.\n")
fit_for_means <- fit_scalar
}
}
} else {
cat("\n[ESCALAR] Sem evidência de falha grave — usando escalar total para médias.\n")
fit_for_means <- fit_scalar
}
##
## [ESCALAR PARCIAL] Selecionando interceptos a liberar com lavTestScore()...
## [ESCALAR PARCIAL] Nenhum intercepto elegível encontrado — mantendo escalar total.
# ------------------------------------------------------------
# 3) Médias latentes (grupo referência = NT)
# ------------------------------------------------------------
fatores_alvo <- c("DYS","REG","SUPPORT","P_TASK","P_SOC")
lat_means <- parameterEstimates(fit_for_means, standardized = TRUE) %>%
dplyr::filter(op == "~1", lhs %in% fatores_alvo) %>%
dplyr::select(lhs, group, est, se, z, pvalue, std.lv) %>%
dplyr::mutate(
grupo = ifelse(group == 1, "Neurodivergente", "Neurotípico"),
.after = group
) %>%
dplyr::arrange(lhs, group)
cat("\n[ETAPA 4] Médias latentes (grupo referência = Neurotípico = 0):\n")
##
## [ETAPA 4] Médias latentes (grupo referência = Neurotípico = 0):
if (nrow(lat_means) == 0L) {
cat("Não foi possível estimar médias latentes de forma estável.\n", sep = "")
} else {
print(lat_means, row.names = FALSE)
}
## lhs group grupo est se z pvalue std.lv
## DYS 1 Neurodivergente 0.000 0.000 NA NA 0.000
## DYS 2 Neurotípico 0.699 0.164 4.271 0.000 1.289
## P_SOC 1 Neurodivergente 0.000 0.000 NA NA 0.000
## P_SOC 2 Neurotípico 0.637 0.110 5.812 0.000 0.863
## P_TASK 1 Neurodivergente 0.000 0.000 NA NA 0.000
## P_TASK 2 Neurotípico 0.318 0.329 0.967 0.334 0.485
## REG 1 Neurodivergente 0.000 0.000 NA NA 0.000
## REG 2 Neurotípico 0.713 0.261 2.736 0.006 1.162
## SUPPORT 1 Neurodivergente 0.000 0.000 NA NA 0.000
## SUPPORT 2 Neurotípico -0.120 0.108 -1.106 0.269 -0.162
| Comparação | Δχ² | gl diff | p | Interpretação |
|---|---|---|---|---|
| Configural → Métrica | 22.44 | 24 | 0.553 | Sem diferença significativa → invariância métrica aceita |
| Métrica → Escalar | 39.51 | 16 | <0.001 | Diferença significativa → invariância escalar rejeitada |
| Modelo | χ² | gl | CFI | RMSEA | SRMR | ΔCFI | ΔRMSEA |
|---|---|---|---|---|---|---|---|
| Configural | 1191.8 | 718 | 0.835 | 0.094 | 0.084 | — | — |
| Métrico | 1214.3 | 742 | 0.836 | 0.092 | 0.088 | +0.001 | −0.002 |
| Escalar | 1253.8 | 758 | 0.836 | 0.141 | — | 0.000 | +0.049 |
| Fator | Grupo | Estimativa | Erro-padrão | z | p | Interpretação |
|---|---|---|---|---|---|---|
| DYS (Dificuldades) | ND vs NT | +0.699 | 0.164 | 4.27 | <.001 | ND relata maior nível de dificuldades cognitivas |
| REG (Regulação/Jornada) | ND vs NT | +0.713 | 0.261 | 2.74 | .006 | ND apresenta nível mais elevado de autorregulação percebida |
| SUPPORT (Acomodações/Suporte) | ND vs NT | −0.120 | 0.108 | −1.11 | .269 | Diferença não significativa |
| P_TASK (Performance de tarefas) | ND vs NT | +0.318 | 0.329 | 0.97 | .334 | Diferença não significativa |
| P_SOC (Performance social) | ND vs NT | +0.637 | 0.110 | 5.81 | <.001 | ND indica maior performance social percebida |