The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Vignette 1. General guidance about metaConvert

Gosling CJ, Cortese S, Solmi M, Haza B, Vieta E, Delorme R, Fusar-Poli P, Radua J

2026-07-20

Step 1. Protocol stage

If you have not yet registered your protocol, you can benefit of our tools to select a priori the type of input data that could be extracted to estimate an effect size.

see_input_data(measure = "or")



data_extraction_sheet(measure = "or")

Step 2. Dataset comparison

When data extraction has been performed in duplicate, our tools offer the possibility to flag the differences between the two datasets. For this example, we will use two datasets (df.compare1 and df.compare2) distributed with metaConvert.

compare_df(
    df_extractor_1 = df.compare1,
    df_extractor_2 = df.compare2,
    output = "html")
rowname chng_type study_id author year n_exp n_nexp prop_cases_exp prop_cases_nexp
1 df_extractor_1 1 Michellini 2000 20 40 0.2 0.2
1 df_extractor_2 1 Smith 2000 20 40 0.2 0.2
2 df_extractor_1 2 Jones 2019 52 32 0.44 0.34
2 df_extractor_2 2 Vietillini 2019 52 32 0.44 0.34
3 df_extractor_1 3 Raymond 2022 198 238 0.32 0.22
3 df_extractor_2 3 Raymond 2020 188 238 0.32 0.22
4 df_extractor_1 4 El-Jiher 2017 2010 1991 0.1 0.21
4 df_extractor_2 4 El-Jiher 2017 2010 1991 0.1 0.31
5 df_extractor_1 5 Tortolinni 2005 111 181 0.5 0.45
5 df_extractor_2 5 Tortolinni 2005 111 181 0.5 0.4
6 df_extractor_2 3 Raymond 2022 198 10 0.32 0.22

In grey, values that are consistent between the two data extractors. In green/red, the values that differ.

Only rows with differences between the two datasets are identified, and you can easily retrieve the row number by looking at the ID in the rowname column. If your dataset have rows in a different order (like in the example above), you can automatically reorder your datasets by indicating to the function the columns that store this information

compare_df(
    df_extractor_1 = df.compare1,
    df_extractor_2 = df.compare2,
    ordering_columns = c("author", "year"),
    output = "html")
rowname chng_type study_id author year n_exp n_nexp prop_cases_exp prop_cases_nexp ID_metaConvert
1 df_extractor_1 4 El-Jiher 2017 2010 1991 0.1 0.21 El-Jiher_2017
1 df_extractor_2 4 El-Jiher 2017 2010 1991 0.1 0.31 El-Jiher_2017
2 df_extractor_1 2 Jones 2019 52 32 0.44 0.34 Jones_2019
2 df_extractor_2
3 df_extractor_1 1 Michellini 2000 20 40 0.2 0.2 Michellini_2000
3 df_extractor_2
4 df_extractor_1
4 df_extractor_2 3 Raymond 2020 188 238 0.32 0.22 Raymond_2020
5 df_extractor_1 3 Raymond 2022 198 238 0.32 0.22 Raymond_2022
5 df_extractor_2 3 Raymond 2022 198 10 0.32 0.22 Raymond_2022
6 df_extractor_1
6 df_extractor_2 1 Smith 2000 20 40 0.2 0.2 Smith_2000
7 df_extractor_1 5 Tortolinni 2005 111 181 0.5 0.45 Tortolinni_2005
7 df_extractor_2 5 Tortolinni 2005 111 181 0.5 0.4 Tortolinni_2005
8 df_extractor_1
8 df_extractor_2 2 Vietillini 2019 52 32 0.44 0.34 Vietillini_2019

Step 3. Effect size computation

Basic usage

To generate an effect size from a dataset that contains approriate column names and information, you simply need to :

For this example, we will generate effect sizes from the df.short dataset, and we will estimate Hedges’ g.

res = convert_df(x = df.short, measure = "g")
#> Warning in convert_df(x = df.short, measure = "g"): When you enter input data
#> that cannot be negative (F-test, eta-squared, p-value, or chi-square values),
#> do not forget to properly set up the direction of the generated effect size
#> using corresponding reverse_* argument!
summary(res)
#> 
#> -- metaConvert summary --
#> Measure: Hedges' g  |  37 studies
#> 
#> Crude estimates: 29/37 (78%)
#>   means_sd                  14
#>   cohen_d                   7
#>   means_plot                2
#>   means_se                  2
#>   anova_f                   1
#> 15 quality flag(s) raised
#> Missing ES in rows: 30, 31, 32, 33, 34, 35, 36, 37
#> 
#> Adjusted estimates: 15/37 (41%)
#>   ancova_f                  6
#>   ancova_means_sd           3
#>   ancova_means_se           3
#>   cohen_d_adj               2
#>   ancova_means_plot         1
#> 16 quality flag(s) raised

To know more about the information stored in each column, refer to documentation of the summary.metaConvert function, available in the R manual of this package.

More advanced usage

A tutorial on a more advanced usage will be proposed in the companion paper of this tool; the link will be inserted as soon as the paper will be published.

For now, you can refer to the documentation of the convert_df function in the R manual of this package, in which all options are described.

Risk difference and NNT

Since version 1.1.0 the package natively supports risk difference (measure = "rd") and number needed to treat (measure = "nnt") alongside ratio measures. Both carry a proper standard error and a confidence interval. When the RD CI crosses zero, the NNT CI is set to NA to preserve the Altman (1998) discontinuous-CI convention - the point estimate and SE remain available.

res_rd <- convert_df(df.haza, measure = "rd")
#> Warning in convert_df(df.haza, measure = "rd"): When you enter input data that
#> cannot be negative (F-test, eta-squared, p-value, or chi-square values), do not
#> forget to properly set up the direction of the generated effect size using
#> corresponding reverse_* argument!
head(summary(res_rd)[, c("row_id", "es_crude", "se_crude",
                         "es_ci_lo_crude", "es_ci_up_crude", "info_used_crude")])
#>     row_id es_crude se_crude es_ci_lo_crude es_ci_up_crude info_used_crude
#> 14       1       NA       NA             NA             NA            <NA>
#> 210      2       NA       NA             NA             NA            <NA>
#> 33       3       NA       NA             NA             NA            <NA>
#> 410      4       NA       NA             NA             NA            <NA>
#> 51       5       NA       NA             NA             NA            <NA>
#> 62       6       NA       NA             NA             NA            <NA>

Quality flags and missing-data guidance

summary() can surface two diagnostic layers. flags = TRUE adds a flags_crude / flags_adjusted column with validation errors (Tier 1: input integrity checks such as negative SDs or inverted CIs) and plausibility warnings (Tier 2: e.g. implausibly large SMD, RD outside [-1, 1], ES/SE outliers across rows). guidance = TRUE adds an es_guidance_crude column that, for rows where the effect size could not be estimated, explains which input columns the user would need to add to unlock additional estimators.

res_flags <- convert_df(df.short, measure = "g")
#> Warning in convert_df(df.short, measure = "g"): When you enter input data that
#> cannot be negative (F-test, eta-squared, p-value, or chi-square values), do not
#> forget to properly set up the direction of the generated effect size using
#> corresponding reverse_* argument!
s_flags <- summary(res_flags, flags = TRUE, guidance = TRUE)
head(s_flags[, c("row_id", "es_crude", "info_used_crude",
                 "flags_crude", "es_guidance_crude")])
#>     row_id es_crude info_used_crude
#> 110      1    1.226         anova_f
#> 24       2    0.683         cohen_d
#> 31       3    1.025         cohen_d
#> 41       4   -0.128         cohen_d
#> 51       5    0.249         cohen_d
#> 61       6    3.416         cohen_d
#>                                                                                                                                                                                                                                                                                                                                                     flags_crude
#> 110                                                                                                                                                                                                                                                                                                                                                            
#> 24                                                                                                                                                                                                                                                                                                                                                             
#> 31                                                                                                                [INFO] Duplicate study_id 'Steiner-Otoo_2020': row shares study_id with Steiner-Otoo_2020 (row 22) - verify these are independent observations; use aggregate_df() if rows should be pooled, or drop one row if they describe the same trial.
#> 41                                                                                                                                                                                                                                                                                                                                                             
#> 51                                                                                                                                                                                                                                                                                                                                                             
#> 61  [UNUSUAL] Large SMD: |g| = 3.416 (threshold: 3) (from cohen_d); [UNUSUAL] ES outlier, IQR method: g = 3.416 (from cohen_d); [INFO] Duplicate study_id 'Lopez_2019': row shares study_id with Lopez_2019 (row 13) - verify these are independent observations; use aggregate_df() if rows should be pooled, or drop one row if they describe the same trial.
#>     es_guidance_crude
#> 110                  
#> 24                   
#> 31                   
#> 41                   
#> 51                   
#> 61

Correction for attenuation due to measurement error

es_disattenuate() corrects an observed correlation for unreliability in one or both measures (Spearman, 1904; Hunter & Schmidt, 2004) and propagates the uncertainty into the corrected SE and Fisher’s z SE via the delta method. Apply it after summary(convert_df(..., measure = "r")):

# Observed correlation with known scale reliabilities
es_disattenuate(r = 0.45, r_se = 0.08,
                reliability_x = 0.82, reliability_y = 0.78)
#>   r_corrected r_corrected_se r_corrected_ci_lo r_corrected_ci_up z_corrected
#> 1   0.5626759      0.1000313         0.3362449          0.727609   0.6367401
#>   z_corrected_se z_corrected_ci_lo z_corrected_ci_up attenuation_factor
#> 1      0.1463738         0.3498527         0.9236276            0.79975

Set reliability_y = 1.0 if only one side of the correlation needs correcting (e.g. a reliable criterion measure).

Psychometric utilities: SEM and SDC

Standalone functions compute the standard error of measurement and the smallest detectable change for meta-analyses of measurement properties. They chain naturally:

sem_res <- compute_sem(sd = 10, icc = 0.85, n_sample = 100)
sdc_res <- compute_sdc(sem = sem_res$sem, sem_se = sem_res$sem_se)
sem_res
#>        sem    sem_se sem_ci_lo sem_ci_up
#> 1 3.872983 0.2752409  3.400506  4.499149
sdc_res
#>        sdc    sdc_se sdc_ci_lo sdc_ci_up
#> 1 10.73516 0.7629149  9.239879  12.23045

I do not like R

If you prefer having a graphical user interface (GUI) when performing data analysis, we are please to introduce you to our web-app that enables to perform ALL calculations of this package using an interactive GUI https://metaconvert.org/


These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.