Synthesis-Factor-Report-Workflow.RmdThis vignette demonstrates the new post-synthesis latent functionality and the standardized reporting object:
library(mars)
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"
)
)
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
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
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.
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.
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
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
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
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 TRUEfactor_loadings includes a salient column
based on the selected loading_threshold.
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")
report_cfa$reproducibility
#> $call
#> NULL
#>
#> $package_version
#> [1] "0.5.1.1"
#>
#> $seed
#> [1] 10403
#>
#> $convergence_warnings
#> character(0)This block includes:
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
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")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: