This vignette demonstrates the new post-synthesis latent functionality and the standardized reporting object:

  1. Pooled correlation matrix, SE/CI matrix, heterogeneity matrix
  2. Model decisions (transform, PD repair, missingness handling)
  3. Factor solution tables (loadings, communalities, fit indices)
  4. Publication-ready tables
  5. Plot suite (heatmaps, loadings/path, leave-one-study-out influence)
  6. Reproducibility and limitations blocks
library(mars)

1) Fit Correlation Synthesis Model

dat <- na.omit(becker09)

fit_cor <- mars(
  data = dat,
  studyID = "ID",
  effectID = "numID",
  sample_size = "N",
  effectsize_type = "cor",
  varcov_type = "weighted",
  variable_names = c(
    "Cognitive_Performance",
    "Somatic_Performance",
    "Selfconfidence_Performance",
    "Somatic_Cognitive",
    "Selfconfidence_Cognitive",
    "Selfconfidence_Somatic"
  )
)

2) Optional Direct Latent Models

EFA from synthesis

efa_out <- efa_from_synthesis(
  mars_object = fit_cor,
  n_factors = 1,
  synthesis_method = "weighted",
  synthesis_transform = "fisher_z",
  pd_adjust = "eigen_clip"
)

summary(efa_out)
#> 
#> Call:
#> stats::factanal(factors = as.integer(n_factors), covmat = R,     n.obs = as.integer(N), rotation = rotation)
#> 
#> Uniquenesses:
#>    Performance      Cognitive        Somatic Selfconfidence 
#>          0.894          0.531          0.499          0.588 
#> 
#> Loadings:
#>                Factor1
#> Performance    -0.326 
#> Cognitive       0.685 
#> Somatic         0.708 
#> Selfconfidence -0.642 
#> 
#>                Factor1
#> SS loadings      1.488
#> Proportion Var   0.372
#> 
#> Test of the hypothesis that 1 factor is sufficient.
#> The chi square statistic is 54.23 on 2 degrees of freedom.
#> The p-value is 1.68e-12

CFA from synthesis

model_cfa <- "
General =~ Performance + Cognitive + Somatic + Selfconfidence
"

rel_vec <- c(
  Performance = 0.88,
  Cognitive = 0.90,
  Somatic = 0.85,
  Selfconfidence = 0.87
)

cfa_out <- cfa_from_synthesis(
  mars_object = fit_cor,
  model = model_cfa,
  synthesis_method = "weighted",
  synthesis_transform = "fisher_z",
  pd_adjust = "eigen_clip"
)

summary(cfa_out)
#> Results generated with MARS:v 0.5.1.1 
#> Thursday, April  2, 2026
#> 
#> Model Type: 
#> multivariate
#>  
#> Average Correlation Matrix: 
#>                Performance  Cognitive    Somatic Selfconfidence
#> Performance      1.0000000 -0.1194994 -0.1886655      0.3869481
#> Cognitive       -0.1194994  1.0000000  0.5232600     -0.4241649
#> Somatic         -0.1886655  0.5232600  1.0000000     -0.4225761
#> Selfconfidence   0.3869481 -0.4241649 -0.4225761      1.0000000
#> 
#> Synthesis options:
#>   method: weighted 
#>   transform: fisher_z 
#>   missing_corr: available 
#>   attenuation: none 
#>   pd_adjust: eigen_clip 
#>   pd_adjusted: FALSE 
#>   min eigen (before/after): 0.46 / 0.46 
#>   SE note: Latent-model delta SEs are conditional on the synthesized correlation matrix and are not reported. Use se_method = "simulation" or "bootstrap" to propagate correlation uncertainty. 
#> 
#>  
#>  Model Fitted: 
#>  
#> General =~ Performance + Cognitive + Somatic + Selfconfidence
#>  
#>  
#> Fixed Effects: 
#>                           predictor        outcome  estimate standard_errors
#> General -> Performance      General    Performance  1.000000              NA
#> General -> Cognitive        General      Cognitive -2.098855              NA
#> General -> Somatic          General        Somatic -2.168363              NA
#> General -> Selfconfidence   General Selfconfidence  1.967586              NA
#>                           test_statistic p_value
#> General -> Performance                NA      NA
#> General -> Cognitive                  NA      NA
#> General -> Somatic                    NA      NA
#> General -> Selfconfidence             NA      NA
#> 
#>  
#>  Fit Statistics: 
#>                    Type         Value
#> 1      Model Chi-Square 54.499 (2), 0
#> 2 Null Model Chi-Square   432.064 (6)
#> 3                   CFI         0.877
#> 4                   TLI          0.63
#> 5                 RMSEA          <NA>
#> 6                  SRMR         0.068
#> 7             CFI (raw)         0.877
#> 8             TLI (raw)          0.63

3) Build Standardized Report Object

EFA report

report_efa <- synthesis_factor_report(
  mars_object = fit_cor,
  factor_method = "efa",
  n_factors = 1,
  loading_threshold = 0.30,
  synthesis_method = "weighted",
  synthesis_transform = "fisher_z",
  pd_adjust = "eigen_clip",
  include_publication_bias = TRUE
)

report_efa
#> Synthesis Factor Report
#> Pooled correlation matrix dimension: 4 x 4 
#> Factor method: efa 
#> Model decisions:
#>   method: weighted 
#>   transform: fisher_z 
#>   missing_corr: available 
#>   attenuation: none 
#>   pd_adjust: eigen_clip | adjusted: FALSE 
#> 
#> Fit indices:
#>  chi_square df   p_value
#>       54.23  2 1.677e-12
#> 
#> Factor loadings table:
#>       indicator Factor1 communality uniqueness salient
#>     Performance -0.3263      0.1065     0.8935    TRUE
#>       Cognitive  0.6848      0.4690     0.5310    TRUE
#>         Somatic  0.7075      0.5006     0.4994    TRUE
#>  Selfconfidence -0.6420      0.4122     0.5878    TRUE
#> 
#> Sensitivity:
#>  Leave-one-study-out influence was not available.

CFA report

report_cfa <- synthesis_factor_report(
  mars_object = fit_cor,
  factor_method = "cfa",
  cfa_model = model_cfa,
  # group_var = "your_moderator_column",  # optional multi-group checks
  loading_threshold = 0.30,
  synthesis_method = "weighted",
  synthesis_transform = "fisher_z",
  missing_corr = "available",
  attenuation = "correct",
  reliability = rel_vec,
  reliability_missing = "impute_mean",
  missing_sensitivity = TRUE,
  attenuation_sensitivity = TRUE,
  reliability_scenarios = list(
    lower_rel = c(Performance = 0.80, Cognitive = 0.82, Somatic = 0.78, Selfconfidence = 0.81),
    higher_rel = c(Performance = 0.92, Cognitive = 0.94, Somatic = 0.90, Selfconfidence = 0.91)
  ),
  pd_adjust = "eigen_clip",
  include_publication_bias = TRUE
)

report_cfa
#> Synthesis Factor Report
#> Pooled correlation matrix dimension: 4 x 4 
#> Factor method: cfa 
#> Model decisions:
#>   method: weighted 
#>   transform: fisher_z 
#>   missing_corr: available 
#>   attenuation: correct 
#>   pd_adjust: eigen_clip | adjusted: FALSE 
#> 
#> Fit indices:
#>  chi_square df p_value    CFI    TLI  RMSEA    SRMR
#>       86.63  2       0 0.8574 0.5721 0.2722 0.08013
#> 
#> Factor loadings table:
#>   factor      indicator loading salient
#>  General    Performance   1.000    TRUE
#>  General      Cognitive  -2.073    TRUE
#>  General        Somatic  -2.182    TRUE
#>  General Selfconfidence   1.942    TRUE
#> 
#> Missing-correlation sensitivity:
#>     method frobenius_change max_abs_change
#>  available                0              0
#>   pairwise                0              0
#>         em                0              0
#> 
#> Attenuation sensitivity:
#>            scenario attenuation frobenius_change max_abs_change
#>                none        none          0.20656        0.07720
#>     correct_current     correct          0.00000        0.00000
#>   correct_lower_rel     correct          0.15379        0.05882
#>  correct_higher_rel     correct          0.07772        0.03039
#> 
#> Sensitivity:
#>  Leave-one-study-out influence was not available.

4) Core Outputs

Matrices

report_cfa$pooled_R
#>                Performance  Cognitive    Somatic Selfconfidence
#> Performance      1.0000000 -0.1410772 -0.2234683      0.4552118
#> Cognitive       -0.1410772  1.0000000  0.6004561     -0.4831744
#> Somatic         -0.2234683  0.6004561  1.0000000     -0.4971159
#> Selfconfidence   0.4552118 -0.4831744 -0.4971159      1.0000000
report_cfa$se_matrix
#>            [,1]       [,2]       [,3]       [,4]
#> [1,] 0.00000000 0.13776971 0.08619682 0.08406129
#> [2,] 0.13776971 0.00000000 0.03335209 0.04590156
#> [3,] 0.08619682 0.03335209 0.00000000 0.04181907
#> [4,] 0.08406129 0.04590156 0.04181907 0.00000000
report_cfa$ci_lower_matrix
#>            [,1]        [,2]        [,3]        [,4]
#> [1,]  0.0000000 -0.27002863 -0.16894577 -0.16476012
#> [2,] -0.2700286  0.00000000 -0.06537010 -0.08996706
#> [3,] -0.1689458 -0.06537010  0.00000000 -0.08196538
#> [4,] -0.1647601 -0.08996706 -0.08196538  0.00000000
report_cfa$ci_upper_matrix
#>           [,1]       [,2]       [,3]       [,4]
#> [1,] 0.0000000 0.27002863 0.16894577 0.16476012
#> [2,] 0.2700286 0.00000000 0.06537010 0.08996706
#> [3,] 0.1689458 0.06537010 0.00000000 0.08196538
#> [4,] 0.1647601 0.08996706 0.08196538 0.00000000
report_cfa$heterogeneity_matrix
#>           [,1]       [,2]       [,3]       [,4]
#> [1,]        NA 0.36337312 0.21023749 0.20565234
#> [2,] 0.3633731         NA 0.03631344 0.07990099
#> [3,] 0.2102375 0.03631344         NA 0.06352971
#> [4,] 0.2056523 0.07990099 0.06352971         NA

Model decisions

report_cfa$model_decisions
#> $synthesis_method
#> [1] "weighted"
#> 
#> $synthesis_transform
#> [1] "fisher_z"
#> 
#> $missing_corr
#> [1] "available"
#> 
#> $attenuation
#> [1] "correct"
#> 
#> $reliability_missing
#> [1] "impute_mean"
#> 
#> $pd_adjust
#> [1] "eigen_clip"
#> 
#> $pd_adjusted
#> [1] FALSE
#> 
#> $missingness_handling
#> NULL

Factor solution and fit indices

report_efa$factor_solution
#>                     indicator    Factor1 communality uniqueness
#> Performance       Performance -0.3262882   0.1064640  0.8935360
#> Cognitive           Cognitive  0.6848271   0.4689881  0.5310118
#> Somatic               Somatic  0.7075061   0.5005649  0.4994351
#> Selfconfidence Selfconfidence -0.6419993   0.4121631  0.5878369
report_efa$fit_indices
#>   chi_square df      p_value
#> 1   54.22831  2 1.676764e-12

report_cfa$factor_solution
#>    factor      indicator   loading
#> 1 General    Performance  1.000000
#> 2 General      Cognitive -2.072973
#> 3 General        Somatic -2.181622
#> 4 General Selfconfidence  1.942177
report_cfa$fit_indices
#>   chi_square df p_value      CFI      TLI     RMSEA       SRMR
#> 1    86.6267  2       0 0.857359 0.572077 0.2722205 0.08012653

5) Publication-Ready Tables

head(report_cfa$publication_tables$pooled_correlation)
#>          var1           var2   pooled_r         se    ci_lower   ci_upper
#> 1 Performance      Cognitive -0.1410772 0.13776971 -0.27002863 0.27002863
#> 2 Performance        Somatic -0.2234683 0.08619682 -0.16894577 0.16894577
#> 3   Cognitive        Somatic  0.6004561 0.03335209 -0.06537010 0.06537010
#> 4 Performance Selfconfidence  0.4552118 0.08406129 -0.16476012 0.16476012
#> 5   Cognitive Selfconfidence -0.4831744 0.04590156 -0.08996706 0.08996706
#> 6     Somatic Selfconfidence -0.4971159 0.04181907 -0.08196538 0.08196538
head(report_cfa$publication_tables$heterogeneity)
#>   var1 var2 heterogeneity
#> 1   V1   V2    0.36337312
#> 2   V1   V3    0.21023749
#> 3   V2   V3    0.03631344
#> 4   V1   V4    0.20565234
#> 5   V2   V4    0.07990099
#> 6   V3   V4    0.06352971
head(report_cfa$publication_tables$factor_loadings)
#>    factor      indicator   loading salient
#> 1 General    Performance  1.000000    TRUE
#> 2 General      Cognitive -2.072973    TRUE
#> 3 General        Somatic -2.181622    TRUE
#> 4 General Selfconfidence  1.942177    TRUE

factor_loadings includes a salient column based on the selected loading_threshold.

6) Plot Suite

Heatmaps

plot(report_cfa, type = "pooled_r", main = "Pooled Correlation Heatmap")

plot(report_cfa, type = "heterogeneity", main = "Heterogeneity Heatmap")

plot(report_cfa, type = "residuals", main = "Residual Heatmap")

plot(report_cfa, type = "calibration", main = "Calibration Plot")

Loading plot / path diagram

plot(report_efa, type = "loadings", main = "EFA Loadings")

plot(report_cfa, type = "path", main = "CFA Path Diagram")

Leave-one-study-out influence

plot(report_cfa, type = "influence", main = "Leave-One-Study-Out Influence")

plot(report_cfa, type = "influence_heatmap", main = "Influence Heatmap")

7) Reproducibility Block

report_cfa$reproducibility
#> $call
#> NULL
#> 
#> $package_version
#> [1] "0.5.1.1"
#> 
#> $seed
#> [1] 10403
#> 
#> $convergence_warnings
#> character(0)

This block includes:

  • exact call (if stored in the fitted model)
  • package version
  • seed marker
  • convergence warnings (if any)

8) Explicit Limitations Block

report_cfa$limitations
#> $dependence_assumptions
#> [1] "Assumes modeled within-study dependence and random-effects structure are correctly specified for synthesized correlations."
#> 
#> $small_study_publication_bias
#> [1] "Egger-type check p-value: 0.01752."
#> 
#> $sensitivity_results
#> [1] "Leave-one-study-out influence was not available."
#> 
#> $missing_data_sensitivity
#> [1] "Missing-correlation sensitivity (vs available ): available (F=0, max|Δ|=0); pairwise (F=0, max|Δ|=0); em (F=0, max|Δ|=0)"
#> 
#> $attenuation_sensitivity
#> [1] "Attenuation sensitivity: none (F=0.2066, max|Δ|=0.0772); correct_current (F=0, max|Δ|=0); correct_lower_rel (F=0.1538, max|Δ|=0.05882); correct_higher_rel (F=0.07772, max|Δ|=0.03039)"

If missing_sensitivity = TRUE, a missing-correlation sensitivity block is included:

report_cfa$missing_sensitivity$comparison
#>      method frobenius_change max_abs_change
#> 1 available                0              0
#> 2  pairwise                0              0
#> 3        em                0              0
report_cfa$attenuation_sensitivity$comparison
#>             scenario attenuation frobenius_change max_abs_change
#> 1               none        none       0.20656385     0.07719610
#> 2    correct_current     correct       0.00000000     0.00000000
#> 3  correct_lower_rel     correct       0.15378702     0.05882034
#> 4 correct_higher_rel     correct       0.07772433     0.03038546

9) Export Helpers

md_text <- as_markdown(report_cfa)
substr(md_text, 1, 300)
#> [1] "# Synthesis Factor Report\n\n## Model Decisions\n- Synthesis method: `weighted`\n- Transform: `fisher_z`\n- Missing-correlation handling: `available`\n- Attenuation: `correct`\n- Reliability missing strategy: `impute_mean`\n- PD adjustment: `eigen_clip`\n- Missingness handling: ``\n\n## Fit Indices\n  chi_squar"

html_text <- as_html(report_cfa)
substr(html_text, 1, 200)
#> [1] "<html><head><meta charset='utf-8'><title>Synthesis Factor Report</title></head><body><pre># Synthesis Factor Report\n\n## Model Decisions\n- Synthesis method: `weighted`\n- Transform: `fisher_z`\n- Missing"

# DOCX export requires rmarkdown + pandoc:
# as_docx(report_cfa, file = "synthesis-factor-report.docx")

10) Optional Multi-Group (Configural vs Metric-Style) Checks

If your synthesized dataset includes a moderator/group variable in fit_cor$data (for example group_var = "grp"), you can request configural-vs-metric style checks:

report_group <- synthesis_factor_report(
  mars_object = fit_cor,
  factor_method = "cfa",
  cfa_model = model_cfa,
  group_var = "grp",
  synthesis_method = "weighted",
  synthesis_transform = "fisher_z",
  pd_adjust = "eigen_clip"
)

report_group$multi_group$fit_by_group
report_group$multi_group$delta
plot(report_group, type = "invariance")

The limitations section explicitly reports:

  • dependence assumptions
  • small-study/publication-bias check summary
  • sensitivity summary from leave-one-study-out diagnostics