Digital self efficacy scale validation analysis: ICILS & PISA

Advances

Author

Tomás Urzúa e Ismael Aguayo

Published

June 24, 2025

1 ICILS

1.1 Descriptives

Code
a <- icils %>% 
  select(IS3G24A, IS3G24B, IS3G24C, IS3G24E, IS3G24F,
         IS3G24G, IS3G24H, IS3G24I, IS3G24J, IS3G24M) %>% 
  sjPlot::plot_likert(geom.colors = "Reds",
                      title = c("General (n = 135.615)"),
                      sort.frq = "pos.desc",
                      geom.size = 0.8,
                      axis.labels = c("edit_photos", "edit_text", "search_info", 
                                      "change_settings", "create_pres", "upload_media", "insert_image", "install_app", "eval_info", "find_source"),
                      catcount = 4,
                      values  =  "sum.outside",
                      reverse.colors = F,
                      reverse.scale = T,
                      show.n = FALSE,
                      show.prc.sign = T
  ) +
  ggplot2::theme(legend.position = "none")

b <- icils %>% 
  select(IS3G24D, IS3G24K, IS3G24L) %>% 
  sjPlot::plot_likert(geom.colors = "Reds",
                      title = c("Specialized"),
                      sort.frq = "pos.desc",
                      geom.size = 0.8,
                      axis.labels = c("build_page", "write_code", "devel_program"),
                      catcount = 4,
                      values  =  "sum.outside",
                      reverse.colors = F,
                      reverse.scale = T,
                      show.n = FALSE,
                      show.prc.sign = T
  ) +
  ggplot2::theme(legend.position = "bottom")

liker_icils <- a/b

liker_icils 
Figure 1: Digital self-efficacy ICILS

1.2 Bivariates

Code
M <- psych::polychoric(icils[c(3:15)])

P <- cor(icils[c(3:15)], method = "pearson")

diag(M$rho) <- NA

diag(P) <- NA

rownames(M$rho) <- c("edit_photos (A)",
                     "edit_text (B)",
                     "search_info (C)",
                     "build_page (D)",
                     "change_settings (E)",
                     "create_pres (F)",
                     "upload_media (G)",
                     "insert_image (H)",
                     "install_app (I)",
                     "eval_info (J)",
                     "write_code (K)",
                     "devel_program (L)",
                     "find_source (M)")

#set Column names of the matrix
colnames(M$rho) <-c("(A)", "(B)","(C)","(D)","(E)","(F)","(G)",
                    "(H)","(I)", "(J)", "(K)", "(L)", "(M)")

rownames(P) <- c("edit_photos (A)",
                 "edit_text (B)",
                 "search_info (C)",
                 "build_page (D)",
                 "change_settings (E)",
                 "create_pres (F)",
                 "upload_media (G)",
                 "insert_image (H)",
                 "install_app (I)",
                 "eval_info (J)",
                 "write_code (K)",
                 "devel_program (L)",
                 "find_source (M)")

#set Column names of the matrix
colnames(P) <-c("(A)", "(B)","(C)","(D)","(E)","(F)","(G)",
                "(H)","(I)", "(J)", "(K)", "(L)", "(M)")

testp <- cor.mtest(M$rho, conf.level = 0.95)

#Plot the matrix using corrplot
corrplot::corrplot(M$rho,
                   method = "color",
                   addCoef.col = "black",
                   type = "upper",
                   tl.col = "black",
                   col = colorRampPalette(c("#B42012", "white", "#E16462"))(12),
                   bg = "white",
                   na.label = "-")
Figure 2: ICILS correlations

1.3 Confirmatory factorial analysis

2 PISA

2.1 Descriptives

Code
c <- pisa %>% 
  select(search_info, asses_info, share_info, pair_collab, how_to_share, 
         edit_text, collect_data, create_pres, page_web, change_settings, 
         select_app, create_program, identify_error, logical_solution) %>% 
  sjPlot::plot_likert(geom.colors = "Reds",
                      title = c("Digital self-efficacy (n = 393.607)"),
                      sort.frq = "pos.desc",
                      geom.size = 0.8,
                      axis.labels = c("search_info", "asses_info", "share_info",
                                      "pair_collab", "how_to_share",                                                       "edit_text", "collect_data", "create_pres",
                                      "page_web", "change_settings", "select_app",
                                      "create_program", "identify_error",
                                      "logical_solution"),
                      catcount = 4,
                      values  =  "sum.outside",
                      reverse.colors = F,
                      reverse.scale = T,
                      show.n = FALSE,
                      show.prc.sign = T
  ) +
  ggplot2::theme(legend.position = "bottom")

c
Figure 3: Digital self-efficacy PISA

2.2 Bivariates

Code
Mp <- psych::polychoric(pisa[c(1:14)])

Pp <- cor(pisa[c(1:14)], method = "pearson")

diag(Mp$rho) <- NA

diag(Pp) <- NA

rownames(Mp$rho) <- c("search_info (A)",
                      "asses_info (B)",
                      "share_info (C)",
                      "pair_collab (D)",
                      "explain_howtoshare (E)",
                      "edit_text (F)",
                      "collect_data (G)",
                      "create_pres (H)",
                      "page_web (I)", 
                      "change_settings (J)",
                      "select_app (K)",
                      "create_program (L)", 
                      "identify_error (M)",
                      "logical_solution (N)")

#set Column names of the matrix
colnames(Mp$rho) <-c("(A)", "(B)","(C)","(D)","(E)","(F)","(G)",
                    "(H)","(I)", "(J)", "(K)", "(L)", "(M)", "(N)")

rownames(Pp) <- c("search_info (A)",
                  "asses_info (B)",
                  "share_info (C)",
                  "pair_collab (D)",
                  "explain_howtoshare (E)",
                  "edit_text (F)",
                  "collect_data (G)",
                  "create_pres (H)",
                  "page_web (I)", 
                  "change_settings (J)",
                  "select_app (K)",
                  "create_program (L)", 
                  "identify_error (M)",
                  "logical_solution (N)")

#set Column names of the matrix
colnames(Pp) <-c("(A)", "(B)","(C)","(D)","(E)","(F)","(G)",
                "(H)","(I)", "(J)", "(K)", "(L)", "(M)", "(N)")

testpp <- cor.mtest(Mp$rho, conf.level = 0.95)

#Plot the matrix using corrplot
corrplot::corrplot(Mp$rho,
                   method = "color",
                   addCoef.col = "black",
                   type = "upper",
                   tl.col = "black",
                   col = colorRampPalette(c("#B42012", "white", "#E16462"))(12),
                   bg = "white",
                   number.digits = 2,
                   na.label = "-")
Figure 4: PISA correlations

2.3 Exploratory factor model (3 factors)

Code
fac_pa <- fa(r = pisa_efa, nfactors = 3, fm= "pa")
fac_pa
Factor Analysis using method =  pa
Call: fa(r = pisa_efa, nfactors = 3, fm = "pa")
Standardized loadings (pattern matrix) based upon correlation matrix
                   PA1   PA3   PA2   h2   u2 com
search_info       0.79  0.06 -0.08 0.67 0.33 1.0
asses_info        0.75  0.05  0.06 0.67 0.33 1.0
share_info        0.90 -0.07  0.04 0.74 0.26 1.0
pair_collab       0.81 -0.01  0.04 0.67 0.33 1.0
how_to_share      0.63  0.18  0.06 0.66 0.34 1.2
edit_text         0.51  0.37 -0.07 0.65 0.35 1.9
collect_data      0.17  0.60  0.05 0.60 0.40 1.2
create_pres       0.04  0.81 -0.06 0.65 0.35 1.0
page_web         -0.13  0.65  0.27 0.57 0.43 1.4
change_settings   0.11  0.68  0.00 0.60 0.40 1.1
select_app        0.09  0.65  0.10 0.62 0.38 1.1
create_program   -0.07  0.09  0.79 0.68 0.32 1.0
identify_error    0.05  0.00  0.87 0.79 0.21 1.0
logical_solution  0.07 -0.03  0.86 0.75 0.25 1.0

                       PA1  PA3  PA2
SS loadings           3.83 3.06 2.41
Proportion Var        0.27 0.22 0.17
Cumulative Var        0.27 0.49 0.66
Proportion Explained  0.41 0.33 0.26
Cumulative Proportion 0.41 0.74 1.00

 With factor correlations of 
     PA1  PA3  PA2
PA1 1.00 0.79 0.31
PA3 0.79 1.00 0.59
PA2 0.31 0.59 1.00

Mean item complexity =  1.1
Test of the hypothesis that 3 factors are sufficient.

df null model =  91  with the objective function =  10.01 with Chi Square =  3939795
df of  the model are 52  and the objective function was  0.3 

The root mean square of the residuals (RMSR) is  0.02 
The df corrected root mean square of the residuals is  0.03 

The harmonic n.obs is  287326 with the empirical chi square  23624.56  with prob <  0 
The total n.obs was  393607  with Likelihood Chi Square =  117506.3  with prob <  0 

Tucker Lewis Index of factoring reliability =  0.948
RMSEA index =  0.076  and the 90 % confidence intervals are  0.075 0.076
BIC =  116836.3
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   PA1  PA3  PA2
Correlation of (regression) scores with factors   0.96 0.95 0.95
Multiple R square of scores with factors          0.93 0.90 0.90
Minimum correlation of possible factor scores     0.85 0.81 0.80

2.4 Confirmatory factor analysis

Code
model_cfa <- '
  gen_dse = ~ asses_info + share_info + pair_collab + how_to_share + 
         edit_text
  spec_dse = ~ create_program + identify_error + logical_solution
  '

m_cfa <- cfa(model = model_cfa, 
              data = pisa, 
              estimator = "DWLS",
              ordered = T,
              std.lv = F)
Code
standardizedsolution(m_cfa) %>% 
  filter(op == "=~") %>% 
  select(Factor = lhs, Indicator = rhs, `Loading (DWLS)` = est.std) %>% 
  kable(format = "markdown", digits = 2)
Factor Indicator Loading (DWLS)
gen_dse asses_info 0.86
gen_dse share_info 0.92
gen_dse pair_collab 0.91
gen_dse how_to_share 0.90
gen_dse edit_text 0.88
spec_dse create_program 0.87
spec_dse identify_error 0.94
spec_dse logical_solution 0.92
Table 1: PISA Factor loadings

En Table 1 las cargas factoriales se encuentran estandarizadas. Resulta llamativo que todos los loadings son bastante altos, lo cual podría sugerir que los factores están sobre explicando a los indicadores

Code
summary(m_cfa)
lavaan 0.6-19 ended normally after 25 iterations

  Estimator                                       DWLS
  Optimization method                           NLMINB
  Number of model parameters                        33

                                                  Used       Total
  Number of observations                        254707      393607

Model Test User Model:
                                                      
  Test statistic                              9970.311
  Degrees of freedom                                19
  P-value (Chi-square)                           0.000

Parameter Estimates:

  Parameterization                               Delta
  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model        Unstructured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)
  gen_dse =~                                          
    asses_info        1.000                           
    share_info        1.064    0.001 1010.333    0.000
    pair_collab       1.051    0.001 1069.472    0.000
    how_to_share      1.044    0.001 1050.228    0.000
    edit_text         1.014    0.001  999.646    0.000
  spec_dse =~                                         
    create_program    1.000                           
    identify_error    1.082    0.001  890.287    0.000
    logical_solutn    1.058    0.001  935.045    0.000

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)
  gen_dse ~~                                          
    spec_dse          0.378    0.001  640.674    0.000

Thresholds:
                   Estimate  Std.Err  z-value  P(>|z|)
    asses_info|t1    -1.611    0.004 -393.436    0.000
    asses_info|t2    -1.098    0.003 -352.779    0.000
    asses_info|t3    -0.059    0.002  -23.853    0.000
    share_info|t1    -1.576    0.004 -393.659    0.000
    share_info|t2    -1.106    0.003 -354.261    0.000
    share_info|t3    -0.211    0.003  -84.332    0.000
    pair_collab|t1   -1.625    0.004 -393.229    0.000
    pair_collab|t2   -1.119    0.003 -356.335    0.000
    pair_collab|t3   -0.213    0.003  -85.190    0.000
    how_to_shar|t1   -1.534    0.004 -393.369    0.000
    how_to_shar|t2   -1.015    0.003 -337.311    0.000
    how_to_shar|t3   -0.077    0.002  -30.874    0.000
    edit_text|t1     -1.623    0.004 -393.269    0.000
    edit_text|t2     -1.108    0.003 -354.494    0.000
    edit_text|t3     -0.219    0.003  -87.491    0.000
    creat_prgrm|t1   -0.726    0.003 -265.299    0.000
    creat_prgrm|t2   -0.102    0.002  -40.904    0.000
    creat_prgrm|t3    0.670    0.003  248.405    0.000
    identfy_rrr|t1   -0.879    0.003 -306.782    0.000
    identfy_rrr|t2   -0.256    0.003 -101.839    0.000
    identfy_rrr|t3    0.581    0.003  219.901    0.000
    logicl_sltn|t1   -0.868    0.003 -303.940    0.000
    logicl_sltn|t2   -0.271    0.003 -107.818    0.000
    logicl_sltn|t3    0.555    0.003  211.187    0.000

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)
   .asses_info        0.255                           
   .share_info        0.156                           
   .pair_collab       0.178                           
   .how_to_share      0.188                           
   .edit_text         0.234                           
   .create_program    0.248                           
   .identify_error    0.119                           
   .logical_solutn    0.158                           
    gen_dse           0.745    0.001  729.661    0.000
    spec_dse          0.752    0.001  696.240    0.000
Code
fit_pisa <- fitMeasures(m_cfa,
                         c("chisq", "df", "pvalue", "cfi", "tli", "rmsea", "srmr"))

knitr::kable(fit_pisa, digits = 3)
x
chisq 9970.31078106
df 19.00000000
pvalue 0.00000000
cfi 0.99918261
tli 0.99879543
rmsea 0.04534650
srmr 0.02892275
Table 2: PISA Fit measures

\(\chi^2\) es un número extremadamente alto y significativo, lo cual no es buen indicio, pero esto puede deberse al gran tamaño de la muestra (N > 200 tienden a dar \(\chi^2\) significativo).

El CFI y el TLI poseen valores que sugieren un buen ajuste del modelo (CFI & TLI > 0.95), aunque el RMSEA contradice los indices de ajuste anteriores (RMSEA < 0.05), lo cual evidencia una incongruencia en el modelo.

2.5 SEM Multigrupo con PISA

Code
multigroup_cfa <- '
  gen_dse = ~ asses_info + share_info + pair_collab + how_to_share + 
         edit_text
  spec_dse = ~ create_program + identify_error + logical_solution
  '

#'
#    gen_dse = ~ search_info + asses_info + share_info + pair_collab + #how_to_share + 
#         edit_text + collect_data + create_pres + change_settings + #select_app
#    spec_dse = ~ create_program + identify_error + logical_solution
#  '

Intentar sacar el ‘page_web’

Code
fitgroup <- sem(model = multigroup_cfa, data = pisa, group = "CNT", missing = "fiml")

2.5.1 Indicadores de ajuste modelo de grupo en general

Code
fit_pisa_group <- fitMeasures(fitgroup,
                         c("chisq", "df", "pvalue", "cfi", "tli", "rmsea", "srmr"))

knitr::kable(fit_pisa_group, digits = 3)
x
chisq 26962.89179469
df 988.00000000
pvalue 0.00000000
cfi 0.98224220
tli 0.97383060
rmsea 0.06590765
srmr 0.02806089

2.5.2 Visualización cargas factoriales por país

Code
all_params <- parameterEstimates(fitgroup, standardized = TRUE)

factor_loadings_all_groups <- all_params %>%
  filter(op == "=~")

group_labels <- lavInspect(fitgroup, "group.label")

country_map <- data.frame(group = 1:length(group_labels), CNT = unlist(group_labels))

factor_loadings_all_groups <- factor_loadings_all_groups %>%
  left_join(country_map, by = "group")
Code
loadings_gen_dse <- factor_loadings_all_groups %>%
  filter(lhs == "gen_dse") %>%
  select(CNT, item = rhs, loading = std.all, latent_factor = lhs)

labels_gen_dse <- loadings_gen_dse %>%
  group_by(item) %>%
  slice_min(order_by = loading, n = 3) %>%
  ungroup()

loadings_spec_dse <- factor_loadings_all_groups %>%
  filter(lhs == "spec_dse") %>%
  select(CNT, item = rhs, loading = std.all, latent_factor = lhs)

labels_spec_dse <- loadings_spec_dse %>%
  group_by(item) %>%
  slice_min(order_by = loading, n = 3) %>%
  ungroup()

Cleaveland loadings autoeficacia general

Code
library(forcats)

plot_gen_dse <- ggplot(loadings_gen_dse,
                       aes(x = loading,
                           y = fct_reorder(item, loading, .fun = median, .desc = FALSE))) +
  geom_point(aes(color = '#B42012'), size = 3, alpha = 0.7) + 
    geom_text(data = labels_gen_dse, 
            aes(label = CNT), 
            nudge_y = 0.3,
            size = 2.5,
            color = "black",
            check_overlap = TRUE) +
  scale_color_identity(name = "Factor", 
                       guide = "legend", 
                       labels = c("General")) +
  labs(title = "Cargas Factoriales: Autoeficacia General",
       x = "Carga Factorial Estandarizada",
       y = "Ítem") +
  theme_minimal(base_size = 10) +
  theme(axis.text.y = element_text(size = 8),
        plot.title = element_text(hjust = 0.5),
        legend.position = "top")

print(plot_gen_dse)

El rango varía entre 0.6 y 0.9 aproximadamente. Japon se repite entre los países con menor carga factorial en las variables, y Brunei Darussalam y España también aparecen en varias ocasiones.. Las variables create_pres, collect_data, change_settings y select_app presentan en general un menor puntaje. #### Cleaveland loadings autoeficacia especializada

Code
plot_spec_dse <- ggplot(loadings_spec_dse,
                        aes(x = loading,
                            y = fct_reorder(item, loading, .fun = median, .desc = FALSE))) +
  geom_point(aes(color = '#E16462'), size = 3, alpha = 0.7) +
    geom_text_repel(data = labels_spec_dse, 
                  aes(label = CNT), 
                  size = 2.5,
                  color = "black",
                  box.padding = 0.4,
                  point.padding = 0.2,
                  min.segment.length = 0,
                  max.overlaps = Inf) +
  scale_color_identity(name = "Factor", 
                       guide = "legend", 
                       labels = c("Especializada")) +
  labs(title = "Cargas Factoriales: Autoeficacia Especializada", 
       x = "Carga Factorial Estandarizada",
       y = "Ítem") +
  theme_minimal(base_size = 10) +
  theme(axis.text.y = element_text(size = 8),
        plot.title = element_text(hjust = 0.5),
        legend.position = "top")

print(plot_spec_dse)

Se repite Letonia en tres de las categorías y Lituania en 2. Se observa una menor dispersión en los loadings.

2.5.3 SEM por separado para cada país (ahora con fiml)

Este procedimiento se realiza para obtener los indicadores de ajuste por cada CNT

Code
lista_paises <- unique(unlist(pisa$CNT))

resultados_lista <- list()
summary_lista <- list()

for (pais_actual in lista_paises) {
  
  # Imprimimos el progreso
  # cat("Procesando:", pais_actual, "...\n")
  
  datos_pais <- pisa %>%
    filter(CNT == pais_actual)
  
  fit_pais <- tryCatch({
    
    sem(model = multigroup_cfa, 
        data = datos_pais,
        missing = "fiml")
  }, error = function(e) {
    
     cat("  -> ¡ERROR! No se pudo ajustar el modelo para", pais_actual, ". Razón:", conditionMessage(e), "\n")
     return(NULL)
  })
    
  if (!is.null(fit_pais)) {
     if (lavInspect(fit_pais, "converged")) {
        medidas_ajuste <- fitMeasures(fit_pais)
        resultados_lista[[pais_actual]] <- medidas_ajuste
       # cat("  -> Modelo ajustado y resultados guardados.\n")
     } else {
        cat("  -> ¡ADVERTENCIA! El modelo para", pais_actual, "no convergió. Se omitirán sus resultados.\n")
        resultados_lista[[pais_actual]] <- rep(NA)
        
     }
  }
}

### Test con chile (o otros países)

datos_test <- pisa %>%
    filter(CNT == "CHL")

test_model <- sem(model = multigroup_cfa, 
        data = datos_test,
        missing = "fiml")

fitMeasures(test_model)
                        npar                         fmin 
                      25.000                        0.034 
                       chisq                           df 
                     301.182                       19.000 
                      pvalue               baseline.chisq 
                       0.000                    20292.379 
                 baseline.df              baseline.pvalue 
                      28.000                        0.000 
                         cfi                          tli 
                       0.986                        0.979 
                  cfi.robust                   tli.robust 
                       0.985                        0.978 
                        nnfi                          rfi 
                       0.979                        0.978 
                         nfi                         pnfi 
                       0.985                        0.668 
                         ifi                          rni 
                       0.986                        0.986 
                 nnfi.robust                   rni.robust 
                       0.978                        0.985 
                        logl            unrestricted.logl 
                  -35714.030                           NA 
                         aic                          bic 
                   71478.060                    71638.110 
                      ntotal                         bic2 
                    4456.000                    71558.670 
                       rmsea               rmsea.ci.lower 
                       0.058                        0.052 
              rmsea.ci.upper               rmsea.ci.level 
                       0.064                        0.900 
                rmsea.pvalue               rmsea.close.h0 
                       0.013                        0.050 
       rmsea.notclose.pvalue            rmsea.notclose.h0 
                       0.000                        0.080 
                rmsea.robust        rmsea.ci.lower.robust 
                       0.061                        0.055 
       rmsea.ci.upper.robust          rmsea.pvalue.robust 
                       0.068                        0.001 
rmsea.notclose.pvalue.robust                          rmr 
                       0.000                        0.021 
                  rmr_nomean                         srmr 
                       0.023                        0.024 
                srmr_bentler          srmr_bentler_nomean 
                       0.024                        0.026 
                        crmr                  crmr_nomean 
                       0.026                        0.030 
                  srmr_mplus            srmr_mplus_nomean 
                       0.024                        0.026 
                       cn_05                        cn_01 
                     446.975                      536.445 
                         gfi                         agfi 
                       0.997                        0.994 
                        pgfi                          mfi 
                       0.431                        0.969 
                        ecvi 
                       0.079 
Code
# cat("\n...Proceso de ajuste finalizado.\n")
Code
fit_indices_por_pais <- do.call(rbind, resultados_lista)

fit_indices_por_pais <- as.data.frame(fit_indices_por_pais)

fit_indices_por_pais <- fit_indices_por_pais %>%
  tibble::rownames_to_column(var = "CNT")


indices_ajuste <- fit_indices_por_pais %>% 
  select(CNT, chisq, df, rmsea, rmsea.ci.lower,  rmsea.ci.upper, srmr, cfi, tli)

2.5.4 Tabla para visualizar indicadores de ajuste por país

2.5.5 Descriptivos índices de ajuste

Code
table1::table1(~ . + -CNT,data=indices_ajuste)
Overall
(N=52)
CNT
ALB 1 (1.9%)
ARG 1 (1.9%)
AUS 1 (1.9%)
AUT 1 (1.9%)
BEL 1 (1.9%)
BGR 1 (1.9%)
BRA 1 (1.9%)
BRN 1 (1.9%)
CHE 1 (1.9%)
CHL 1 (1.9%)
CRI 1 (1.9%)
CZE 1 (1.9%)
DEU 1 (1.9%)
DNK 1 (1.9%)
DOM 1 (1.9%)
ESP 1 (1.9%)
EST 1 (1.9%)
FIN 1 (1.9%)
GBR 1 (1.9%)
GEO 1 (1.9%)
GRC 1 (1.9%)
HKG 1 (1.9%)
HRV 1 (1.9%)
HUN 1 (1.9%)
IRL 1 (1.9%)
ISL 1 (1.9%)
ISR 1 (1.9%)
ITA 1 (1.9%)
JOR 1 (1.9%)
JPN 1 (1.9%)
KAZ 1 (1.9%)
KOR 1 (1.9%)
LTU 1 (1.9%)
LVA 1 (1.9%)
MAC 1 (1.9%)
MAR 1 (1.9%)
MLT 1 (1.9%)
MYS 1 (1.9%)
PAN 1 (1.9%)
POL 1 (1.9%)
QUR 1 (1.9%)
ROU 1 (1.9%)
SAU 1 (1.9%)
SGP 1 (1.9%)
SVK 1 (1.9%)
SVN 1 (1.9%)
SWE 1 (1.9%)
TAP 1 (1.9%)
THA 1 (1.9%)
TUR 1 (1.9%)
URY 1 (1.9%)
USA 1 (1.9%)
chisq
Mean (SD) 519 (266)
Median [Min, Max] 452 [174, 1450]
df
Mean (SD) 19.0 (0)
Median [Min, Max] 19.0 [19.0, 19.0]
rmsea
Mean (SD) 0.0661 (0.0102)
Median [Min, Max] 0.0641 [0.0474, 0.0973]
rmsea.ci.lower
Mean (SD) 0.0609 (0.0102)
Median [Min, Max] 0.0590 [0.0417, 0.0925]
rmsea.ci.upper
Mean (SD) 0.0715 (0.0103)
Median [Min, Max] 0.0698 [0.0533, 0.102]
srmr
Mean (SD) 0.0283 (0.00519)
Median [Min, Max] 0.0282 [0.0181, 0.0414]
cfi
Mean (SD) 0.982 (0.00449)
Median [Min, Max] 0.982 [0.969, 0.991]
tli
Mean (SD) 0.973 (0.00662)
Median [Min, Max] 0.974 [0.954, 0.986]

2.5.6 Chi cuadrado por país (en base al modelo global)

Code
group_summary <- summary(fitgroup)

valores_chi <- group_summary$test$standard$stat.group

nombres_paises <- group_summary$data$group.label

df_chi <- data.frame(
  Pais = nombres_paises,
  Chi.Cuadrado = valores_chi
)

knitr::kable(df_chi)
Pais Chi.Cuadrado
ALB 327.4637
ARG 499.4030
AUS 881.2075
AUT 420.1680
BEL 475.3554
BRA 482.0376
BRN 447.0900
BGR 336.3261
CHL 301.1821
TAP 643.7963
CRI 365.3012
HRV 654.6537
CZE 622.1149
DNK 321.0997
DOM 206.2159
EST 488.0748
FIN 1042.4170
GEO 194.5719
DEU 335.4971
GRC 455.5464
HKG 537.7163
HUN 420.3194
ISL 420.0620
IRL 451.1369
ISR 348.0173
ITA 451.8849
JPN 793.3151
KAZ 1183.0980
JOR 530.4529
KOR 1094.9025
LVA 335.0929
LTU 498.6921
MAC 409.7495
MYS 715.0998
MLT 207.7785
MAR 435.3821
PAN 174.2699
POL 402.8751
ROU 301.1216
SAU 668.3040
SGP 508.9165
SVK 444.6937
SVN 665.2256
ESP 1450.3066
SWE 463.0617
CHE 408.8021
THA 900.2077
TUR 615.7509
QUR 210.9505
GBR 872.9201
USA 325.5153
URY 217.7482

3 SEM Multinivel con PISA

Code
multimodel_cfa <- '
    level: 1
    gen_dse = ~ search_info + asses_info + share_info + pair_collab + how_to_share + 
         edit_text + collect_data + create_pres + change_settings + select_app
    spec_dse = ~ create_program + identify_error + logical_solution
    level: 2
    gen_dse = ~ search_info + asses_info + share_info + pair_collab + how_to_share + 
         edit_text + collect_data + create_pres + change_settings + select_app
    spec_dse = ~ create_program + identify_error + logical_solution
  '
Code
fit <- sem(model = multimodel_cfa, data = pisa, cluster = "CNT")

3.0.1 Cargas estandarizadas

Code
standardizedsolution(fit)
                lhs op              rhs est.std    se        z pvalue ci.lower
1           gen_dse =~      search_info   0.812 0.001 1066.190  0.000    0.811
2           gen_dse =~       asses_info   0.824 0.001 1137.801  0.000    0.822
3           gen_dse =~       share_info   0.841 0.001 1265.385  0.000    0.840
4           gen_dse =~      pair_collab   0.822 0.001 1129.395  0.000    0.821
5           gen_dse =~     how_to_share   0.833 0.001 1205.060  0.000    0.831
6           gen_dse =~        edit_text   0.834 0.001 1214.419  0.000    0.832
7           gen_dse =~     collect_data   0.753 0.001  794.662  0.000    0.751
8           gen_dse =~      create_pres   0.758 0.001  813.381  0.000    0.756
9           gen_dse =~  change_settings   0.746 0.001  771.979  0.000    0.745
10          gen_dse =~       select_app   0.742 0.001  755.834  0.000    0.740
11         spec_dse =~   create_program   0.822 0.001 1027.908  0.000    0.821
12         spec_dse =~   identify_error   0.904 0.001 1482.359  0.000    0.903
13         spec_dse =~ logical_solution   0.879 0.001 1323.943  0.000    0.878
14      search_info ~~      search_info   0.340 0.001  274.958  0.000    0.338
15       asses_info ~~       asses_info   0.322 0.001  269.971  0.000    0.319
16       share_info ~~       share_info   0.292 0.001  260.971  0.000    0.290
17      pair_collab ~~      pair_collab   0.324 0.001  271.006  0.000    0.322
18     how_to_share ~~     how_to_share   0.307 0.001  266.827  0.000    0.305
19        edit_text ~~        edit_text   0.305 0.001  266.615  0.000    0.303
20     collect_data ~~     collect_data   0.434 0.001  304.074  0.000    0.431
21      create_pres ~~      create_pres   0.426 0.001  301.338  0.000    0.423
22  change_settings ~~  change_settings   0.443 0.001  306.752  0.000    0.440
23       select_app ~~       select_app   0.449 0.001  308.437  0.000    0.447
24   create_program ~~   create_program   0.324 0.001  246.395  0.000    0.321
25   identify_error ~~   identify_error   0.182 0.001  164.859  0.000    0.180
26 logical_solution ~~ logical_solution   0.227 0.001  194.850  0.000    0.225
27          gen_dse ~~          gen_dse   1.000 0.000       NA     NA    1.000
28         spec_dse ~~         spec_dse   1.000 0.000       NA     NA    1.000
29          gen_dse ~~         spec_dse   0.522 0.002  316.582  0.000    0.519
30      search_info ~1                    0.000 0.000       NA     NA    0.000
31       asses_info ~1                    0.000 0.000       NA     NA    0.000
32       share_info ~1                    0.000 0.000       NA     NA    0.000
33      pair_collab ~1                    0.000 0.000       NA     NA    0.000
34     how_to_share ~1                    0.000 0.000       NA     NA    0.000
35        edit_text ~1                    0.000 0.000       NA     NA    0.000
36     collect_data ~1                    0.000 0.000       NA     NA    0.000
37      create_pres ~1                    0.000 0.000       NA     NA    0.000
38  change_settings ~1                    0.000 0.000       NA     NA    0.000
39       select_app ~1                    0.000 0.000       NA     NA    0.000
40   create_program ~1                    0.000 0.000       NA     NA    0.000
41   identify_error ~1                    0.000 0.000       NA     NA    0.000
42 logical_solution ~1                    0.000 0.000       NA     NA    0.000
43          gen_dse ~1                    0.000 0.000       NA     NA    0.000
44         spec_dse ~1                    0.000 0.000       NA     NA    0.000
45          gen_dse =~      search_info   0.932 0.020   46.377  0.000    0.892
46          gen_dse =~       asses_info   0.961 0.012   82.888  0.000    0.938
47          gen_dse =~       share_info   0.972 0.009  106.465  0.000    0.954
48          gen_dse =~      pair_collab   0.960 0.012   78.563  0.000    0.936
49          gen_dse =~     how_to_share   0.984 0.006  169.160  0.000    0.972
50          gen_dse =~        edit_text   0.979 0.007  148.599  0.000    0.966
51          gen_dse =~     collect_data   0.917 0.024   38.474  0.000    0.870
52          gen_dse =~      create_pres   0.904 0.027   33.596  0.000    0.851
53          gen_dse =~  change_settings   0.942 0.017   56.368  0.000    0.909
54          gen_dse =~       select_app   0.867 0.036   23.945  0.000    0.796
55         spec_dse =~   create_program   0.930 0.021   44.131  0.000    0.889
56         spec_dse =~   identify_error   0.974 0.012   79.717  0.000    0.950
57         spec_dse =~ logical_solution   0.974 0.012   79.612  0.000    0.950
58      search_info ~~      search_info   0.132 0.037    3.520  0.000    0.058
59       asses_info ~~       asses_info   0.076 0.022    3.431  0.001    0.033
60       share_info ~~       share_info   0.055 0.018    3.108  0.002    0.020
61      pair_collab ~~      pair_collab   0.078 0.023    3.329  0.001    0.032
62     how_to_share ~~     how_to_share   0.032 0.011    2.794  0.005    0.010
63        edit_text ~~        edit_text   0.041 0.013    3.162  0.002    0.016
64     collect_data ~~     collect_data   0.160 0.044    3.661  0.000    0.074
65      create_pres ~~      create_pres   0.183 0.049    3.768  0.000    0.088
66  change_settings ~~  change_settings   0.113 0.031    3.580  0.000    0.051
67       select_app ~~       select_app   0.248 0.063    3.955  0.000    0.125
68   create_program ~~   create_program   0.135 0.039    3.435  0.001    0.058
69   identify_error ~~   identify_error   0.051 0.024    2.154  0.031    0.005
70 logical_solution ~~ logical_solution   0.051 0.024    2.139  0.032    0.004
71          gen_dse ~~          gen_dse   1.000 0.000       NA     NA    1.000
72         spec_dse ~~         spec_dse   1.000 0.000       NA     NA    1.000
73          gen_dse ~~         spec_dse   0.125 0.141    0.892  0.372   -0.150
74      search_info ~1                   16.522 1.634   10.111  0.000   13.320
75       asses_info ~1                   19.468 1.927   10.101  0.000   15.690
76       share_info ~1                   19.670 1.947   10.101  0.000   15.853
77      pair_collab ~1                   21.984 2.178   10.095  0.000   17.715
78     how_to_share ~1                   19.953 1.976   10.097  0.000   16.080
79        edit_text ~1                   17.971 1.777   10.113  0.000   14.488
80     collect_data ~1                   16.976 1.681   10.097  0.000   13.681
81      create_pres ~1                   16.798 1.662   10.107  0.000   13.540
82  change_settings ~1                   21.156 2.098   10.083  0.000   17.044
83       select_app ~1                   20.470 2.030   10.085  0.000   16.492
84   create_program ~1                   13.062 1.299   10.055  0.000   10.516
85   identify_error ~1                   13.959 1.387   10.067  0.000   11.241
86 logical_solution ~1                   13.099 1.301   10.070  0.000   10.549
87          gen_dse ~1                    0.000 0.000       NA     NA    0.000
88         spec_dse ~1                    0.000 0.000       NA     NA    0.000
   ci.upper
1     0.814
2     0.825
3     0.843
4     0.823
5     0.834
6     0.835
7     0.755
8     0.760
9     0.748
10    0.744
11    0.824
12    0.906
13    0.880
14    0.343
15    0.324
16    0.294
17    0.327
18    0.309
19    0.307
20    0.436
21    0.428
22    0.446
23    0.452
24    0.327
25    0.184
26    0.230
27    1.000
28    1.000
29    0.525
30    0.000
31    0.000
32    0.000
33    0.000
34    0.000
35    0.000
36    0.000
37    0.000
38    0.000
39    0.000
40    0.000
41    0.000
42    0.000
43    0.000
44    0.000
45    0.971
46    0.984
47    0.990
48    0.984
49    0.995
50    0.992
51    0.963
52    0.956
53    0.975
54    0.938
55    0.972
56    0.998
57    0.998
58    0.205
59    0.120
60    0.090
61    0.124
62    0.054
63    0.066
64    0.245
65    0.279
66    0.174
67    0.371
68    0.212
69    0.098
70    0.098
71    1.000
72    1.000
73    0.401
74   19.725
75   23.245
76   23.487
77   26.252
78   23.826
79   21.454
80   20.272
81   20.055
82   25.269
83   24.448
84   15.608
85   16.677
86   15.648
87    0.000
88    0.000

Se observa un panorama generalizado en las altas cargas factoriales en los indicadores. La gran mayoría ronda por el 0.8, mientras que solamente el indicador que trata sobre crear y mantener una página web tiene un loading > 0.7

3.0.2 Correlación intraclase

Code
lavInspect(fit, "icc")
     search_info       asses_info       share_info      pair_collab 
           0.058            0.041            0.040            0.034 
    how_to_share        edit_text     collect_data      create_pres 
           0.036            0.050            0.041            0.044 
 change_settings       select_app   create_program   identify_error 
           0.029            0.028            0.031            0.032 
logical_solution 
           0.037 

El ICC de todos los indicadores es bastante alto. El caso más llamativo es el de la variable relativa a buscar información en dispositivos digitales, donde el 58% de su varianza se debe a diferencias entre países (diferencias en cómo comprenden la escala?).