* Encoding: UTF-8. ************************************************************************************************. * Description: Adjust your error rates and stay fashionable. * * The following spss program calculates the adjusted p value using: * * 1. Bonferroni method * 2. Holm-Bonferroni method * 3. Benjamini–Hochberg method * 4. Holm-Sidak method * * References: * * Benjamini, Y. & Hochberg, Y. (1995) Controlling the False Discovery Rate: A practical and powerful approach to multiple testing. * Journal of the Royal Statistical Society: Series B (Methodological), 57(1), 289–300. https://doi.org/10.1111/j.2517-6161.1995.tb02031.x * * Hochberg, Yosef (1988). A Sharper Bonferroni Procedure for Multiple Tests of Significance. Biometrika, 75(4).800–802. https://doi:10.1093/biomet/75.4.800. * * Holm, S. (1979). A Simple Sequentially Rejective Multiple Test Procedure. Scandinavian Journal of Statistics, 6(2), 65–70. http://www.jstor.org/stable/4615733 * * Šidák, Z. (1967). Rectangular Confidence Regions for the Means of Multivariate Normal Distributions. Journal of the American Statistical Association, 62(318), 626–633. * https://doi.org/10.2307/2283989 * * The sample p-values used as input come from the UCLA SCA page: * * Šidák-Holm Adjusted p-values. UCLA: Statistical Consulting Group. * from https://stats.oarc.ucla.edu/stata/code/idak-holm-adjusted-p-values/ (accessed 9/6/2024). * * Use: Free for non-commercial use with acknowledgement.  This spss program is licensed under an Attribution-NonCommercial-ShareAlike 4.0 International. * * Suggested citation: * * Little, J. (2024). SPSS calculator of corrections for the multiple comparison problem (Version 1.0). * https://www.statpsychservices.com.au/resources. Melbourne: Statistical Psychological Services. * * Writer: Jonathon Little * Date: 09/06/2024 * Version: 1.0 ************************************************************************************************. DATASET CLOSE ALL. ******************START**********************USER INPUT*****************************************. *Sample p value input - place your own p values below - they do not need to be sorted*. DATA LIST LIST / unadjusted_p (F9.8) . BEGIN DATA 0.2703633 0.2861805 0.0674455 0.2884618 0.0522945 0.0094186 0.0412532 0.1566575 0.0029600 0.0068728 0.0255530 0.3102804 0.0042578 0.0031542 0.0000240 END DATA. *Enter your chosen nominal alpha level. COMPUTE alpha = .05. EXECUTE. ******************END**********************DO NOT ALTER CODE BELOW THIS LINE************. SORT CASES BY unadjusted_p (A). EXECUTE. AGGREGATE /OUTFILE=* MODE=ADDVARIABLES /BREAK= /comparisons=N. COMPUTE rank = $casenum. EXECUTE. *****************************Bonferroni Method*************************************************. COMPUTE Bonferroni_p = unadjusted_p*comparisons. IF Bonferroni_p > 1 Bonferroni_p = 1.00. EXECUTE. STRING Bonferroni_Result (A7). IF unadjusted_p < (alpha / comparisons) Bonferroni_Result = 'SIG'. IF unadjusted_p >= (alpha / comparisons) Bonferroni_Result = 'NON SIG'. EXECUTE. *****************************Holm Bonferroni Method*******************************************. COMPUTE Holm_Bonferroni_p = unadjusted_p * (comparisons - rank + 1). EXECUTE. IF Holm_Bonferroni_p > 1 Holm_Bonferroni_p = 1.00. EXECUTE. STRING Holm_Bonferroni_Result (A7). IF Holm_Bonferroni_p < alpha Holm_Bonferroni_Result = 'SIG'. IF Holm_Bonferroni_p >= alpha Holm_Bonferroni_Result = 'NON SIG'. EXECUTE. DO IF LAG(Holm_Bonferroni_p) = 1. COMPUTE Holm_Bonferroni_p = 1. END IF. EXECUTE. *****************************Benjamini Hochberg Method**************************************. COMPUTE Benjamini_Hochberg_crit = (rank/comparisons)*alpha. EXECUTE. COMPUTE Benjamini_Hochberg_p = unadjusted_p * (comparisons) / (rank). EXECUTE. SORT CASES BY unadjusted_p (D). EXECUTE. IF LAG(Benjamini_Hochberg_p) <= Benjamini_Hochberg_p Benjamini_Hochberg_p = LAG(Benjamini_Hochberg_p). EXECUTE. SORT CASES BY unadjusted_p (D). EXECUTE. *Maintain non-decreasing order. The sequence should be increasing: if it ever starts decreasing, make the preceding p-value *equal to the subsequent p-value (do repeatedly, until the whole sequence becomes increasing). IF Benjamini_Hochberg_p > LAG (Benjamini_Hochberg_p) Benjamini_Hochberg_p = LAG (Benjamini_Hochberg_p). EXECUTE. FORMAT Benjamini_Hochberg_crit Benjamini_Hochberg_p (F8.7). SORT CASES BY unadjusted_p (A). EXECUTE. STRING Benjamini_Hochberg_Result (A7). IF Benjamini_Hochberg_crit > unadjusted_p Benjamini_Hochberg_Result = 'SIG'. IF Benjamini_Hochberg_crit <= unadjusted_p Benjamini_Hochberg_Result = 'NON SIG'. EXECUTE. *****************************Holm Sidak Method************************************************. COMPUTE k = (comparisons + 1) - rank. COMPUTE Sidak_p = 1 - (1 - unadjusted_p)**k. EXECUTE. COMPUTE sidak_lag = LAG(Sidak_p). EXECUTE. DO IF LAG(Sidak_p) > Sidak_p AND LAG(Sidak_p) > 2 / comparisons. COMPUTE Sidak_p = LAG(Sidak_p). END IF. EXECUTE. STRING Holm_Sidak_Result (A7). IF Sidak_p < alpha Holm_Sidak_Result = 'SIG'. IF Sidak_p >= alpha Holm_Sidak_Result = 'NON SIG'. EXECUTE. FORMAT Bonferroni_p Holm_Bonferroni_p Benjamini_Hochberg_p Sidak_p (F8.7). DELETE VARIABLES comparisons rank Benjamini_Hochberg_crit k sidak_lag. EXECUTE.