# Python code to adjust Benjamini & Hochberg alpha values # By Yilin Liu, Penn Center for Learning Analytics # This code is released as public domain import numpy as np def benjamini_hochberg(p_values): n = len(p_values) # Pair each p-value with its index and sort by p-value sorted_pvals = sorted(enumerate(p_values), key=lambda x: x[1]) # Initialize result arrays for both original and sorted views result_original = np.zeros((n, 3), dtype=object) result_sorted = np.zeros((n, 3), dtype=object) # Fill result arrays with p-values for i, (orig_index, pval) in enumerate(sorted_pvals): result_sorted[i, 0] = pval # Sorted p-values result_original[orig_index, 0] = pval # Original p-values # Apply the Benjamini-Hochberg procedure for rank, (orig_index, pval) in enumerate(sorted_pvals, start=1): alpha = (0.05 * rank) / n # Fill alpha values result_sorted[rank - 1, 1] = alpha result_original[orig_index, 1] = alpha # Mark significance significance = 'Significant' if pval <= alpha else 'Not Significant' result_sorted[rank - 1, 2] = significance result_original[orig_index, 2] = significance return result_original, result_sorted result_original, result_sorted = benjamini_hochberg([0.01, 0.09, 0.2, 0.03]) print("=== Original Order ===") print("P-value | Alpha | Significance") for row in result_original: print(f"{row[0]:.5f} | {row[1]:.5f} | {row[2]}") print("\n=== Sorted by P-value ===") print("P-value | Alpha | Significance") for row in result_sorted: print(f"{row[0]:.3f} | {row[1]:.5f} | {row[2]}")