1+ function generate_synthetic_power_data()
2+ % Directory where synthetic test files will be saved
3+ output_dir = ' ./test_power_calculator/' ;
4+
5+ % Ensure directory exists
6+ if ~exist(output_dir , ' dir' )
7+ mkdir(output_dir );
8+ end
9+
10+ % Define test types based on whether they are edge-level or network-level
11+ edge_level_tests = {' Parametric_Bonferroni' , ' Parametric_FDR' , ' Size' , ' TFCE' };
12+ network_level_tests = {' Constrained' , ' Constrained_FWER' };
13+
14+ % Set fixed number of edges and networks (arbitrary for synthetic testing)
15+ num_edges = 10 ; % Example: 100 edges for edge-level tests
16+ num_networks = 4 ; % Example: 10 networks for network-level tests
17+ n_repetitions = 100 ; % Number of repetitions for power calculation
18+
19+ % Compute split for 25% of elements
20+ split_25_edges = floor(num_edges * 0.25 );
21+ split_25_networks = floor(num_networks * 0.25 );
22+
23+ % Loop through each test type
24+ for test_type = [edge_level_tests , network_level_tests ]
25+ tt = test_type{1 }; % Extract string
26+
27+ % Generate mock brain_data structure
28+ brain_data = struct();
29+
30+ if ismember(tt , edge_level_tests )
31+ % Edge-level test: p-values should match number of edges
32+ brain_data.edge_stats_all = randn(num_edges , n_repetitions );
33+ brain_data.edge_stats_all_neg = randn(num_edges , n_repetitions );
34+ brain_data.cluster_stats_all = []; % Not used for edge tests
35+ brain_data.cluster_stats_all_neg = [];
36+
37+ % Initialize arrays with non-significant values (>0.5)
38+ brain_data.pvals_all = 0.6 * ones(num_edges , n_repetitions );
39+ brain_data.pvals_all_neg = 0.6 * ones(num_edges , n_repetitions );
40+
41+ % Ensure 25% power: In 25% of repetitions, p-value is set to zero (significant)
42+ for rep = 1 : n_repetitions
43+ if mod(rep , 4 ) == 0 % Every 4th repetition should have significant results
44+ brain_data .pvals_all([1 , 2 , 3 ], rep ) = 0 ; % Positive detections
45+ brain_data .pvals_all_neg([4 , 5 ], rep ) = 0 ; % Negative detections
46+ end
47+ end
48+
49+ elseif ismember(tt , network_level_tests )
50+ % Network-level test: p-values should match number of networks
51+ brain_data.edge_stats_all = []; % Not used for network tests
52+ brain_data.edge_stats_all_neg = [];
53+ brain_data.cluster_stats_all = randn(num_networks , n_repetitions );
54+ brain_data.cluster_stats_all_neg = randn(num_networks , n_repetitions );
55+
56+ % Initialize arrays with non-significant values (>0.5)
57+ brain_data.pvals_all = 0.6 * ones(num_networks , n_repetitions );
58+ brain_data.pvals_all_neg = 0.6 * ones(num_networks , n_repetitions );
59+
60+ % Ensure 25% power: In 25% of repetitions, p-value is set to zero (significant)
61+ for rep = 1 : n_repetitions
62+ if mod(rep , 4 ) == 0 % Every 4th repetition should have significant results
63+ brain_data .pvals_all(1 : split_25_networks , rep ) = 0 ;
64+ brain_data .pvals_all_neg(split_25_networks + 1 : 2 * split_25_networks , rep ) = 0 ;
65+ end
66+ end
67+ end
68+
69+ % Ensure mutual exclusivity: no index should be zero in both p-values
70+ invalid_indices = (brain_data .pvals_all == 0 & brain_data .pvals_all_neg == 0 );
71+ brain_data .pvals_all(invalid_indices ) = rand(sum(invalid_indices , ' all' ), 1 );
72+
73+ % Generate mock meta_data
74+ meta_data = struct();
75+ meta_data.dataset = ' synthetic_test' ;
76+ meta_data.map = ' mock_map' ;
77+ meta_data.test = ' synthetic' ; % Placeholder test type
78+ meta_data.test_components = {' REST' , ' TASK' };
79+ meta_data.omnibus = NaN ;
80+ meta_data.subject_number = 40 ; % Single fixed subject number
81+ meta_data.testing_code = 1 ; % Indicator for test mode
82+ meta_data.test_type = tt ; % Critical test type distinction
83+ meta_data.run_time = rand() * 10 ; % Fake runtime
84+
85+ % Add critical power calculation parameters
86+ meta_data.rep_parameters.pthresh_second_level = 0.05 ; % FWER/FDR threshold
87+ meta_data.rep_parameters.n_repetitions = n_repetitions ; % Number of repetitions
88+
89+ % Generate filename
90+ filename = sprintf(' %s synthetic_%s .mat' , output_dir , tt );
91+
92+ % Save synthetic data
93+ save(filename , ' brain_data' , ' meta_data' );
94+
95+ end
96+
97+ end
0 commit comments