-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMUSim_make_csv.py
More file actions
148 lines (115 loc) · 5.54 KB
/
MUSim_make_csv.py
File metadata and controls
148 lines (115 loc) · 5.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# -*- coding: utf-8 -*-
#Python 3.7, Pandas 0.24
#
#Copyright (c) 2019, Eric C. Fields
#All rights reserved.
#This code is free and open source software made available under the 3-clause BSD license.
#This software is provided "as is" and any express or implied warranties are disclaimed.
"""
Compile MUSim simulation results into more usable csv files
Author: Eric Fields
Version Date: 20 June 2019
"""
import os
from os.path import join
import pandas as pd
def parse_results(results_file, measure_text):
"""
Read results into data frame
INPUTS
results_file - Text file output by MUSim simulations
measure_text - Text of measure of interest in results file
OUTPUTS
results_df - data frame with parsed results
"""
#Read in results file
with open(results_file) as f_in:
results_text = f_in.readlines()
#Set-up output data frame
results_df = pd.DataFrame(columns=('effect', 'time_window', 'electrodes'))
r = -1 #data frame row index
#Parse lines and read relevant results into data frame
for i in range(len(results_text)):
line = results_text[i]
#Starting to parse a new simulation
if 'SIMULATION SUMMARY' in line:
r += 1
#Parse basic simulation parameters
elif 'Simulated experiments' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'n_experiments'] = int(value)
elif 'Permutations' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'n_permutations'] = int(value)
elif 'Sample size' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'n_subjects'] = int(value)
elif 'Effect:' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'effect'] = os.path.basename(value).strip()
elif 'Time window' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'time_window'] = value.strip()
elif 'Electrodes:' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'electrodes'] = value.strip()
elif 'Trials =' in line:
(field, value) = line.split('\t')
results_df.loc[r, 'n_trials'] = int(value.split()[0])
elif 'MEAN WINDOW' in line:
(field, value) = results_text[i+1].split('\t')
results_df.loc[r, 'mean_amp'] = float(value)
#Find correction method for current point in file
elif 'UNCORRECTED' in line:
method = 'uncorrected'
elif 'SIDAK' in line:
method = 'sidak'
elif 'FMAX' in line:
method = 'Fmax'
elif 'CLUSTER 0.05' in line:
method = 'cluster_05'
elif 'CLUSTER 0.01' in line:
method = 'cluster_01'
elif 'BH' in line:
method = 'BH'
elif 'BY' in line:
method = 'BY'
elif 'BKY' in line:
method = 'BKY'
#Get the measure of interst and associate with method (from above)
elif measure_text in line:
(field, value) = line.split('\t')
results_df.loc[r, method] = float(value)
return results_df
def make_power_csvs(results_file):
#Measure names and texts
measures = {'FamilywisePower': 'Family-wise rejection rate across time points with effect (familywise power)',
'FamilywiseTypeI': 'Family-wise rejection rate across time points with null effect (familywise Type I error)',
'FamilywiseFDR': 'Familywise FDR (proportion of sig studies that include false positive time point)',
'TotalMissRate': 'Total miss rate (only null time points rejected)'}
#Produce csv for all measures
for measure_name in measures:
results_df = parse_results(results_file, measures[measure_name])
results_dir = os.path.dirname(results_file)
output_file = join(results_dir, 'MUSim_Power_%s.csv' % measure_name)
results_df.to_csv(output_file, index=False, float_format='%.3f')
def make_null_csvs(results_file):
#Measure names and texts
measures = {'FamilywiseTypeI': 'Family-wise rejection rate across time points with null effect (familywise Type I error)',
'Mean_EW_TypeI': 'Mean rejection rate at individual time points with null effect (element-wise Type I error)',
'Median_EW_TypeI': 'Median rejection rate at individual time points with null effect (element-wise Type I error)'}
#Produce csv for all measures
for measure_name in measures:
results_df = parse_results(results_file, measures[measure_name])
results_df.sort_values(['n_trials', 'n_subjects'], ascending=False, inplace=True)
results_dir = os.path.dirname(results_file)
output_file = join(results_dir, 'MUSim_Null_%s.csv' % measure_name)
results_df.to_csv(output_file, index=False, float_format='%.3f')
def main():
main_dir = r'C:\Users\ecfne\Documents\Eric\Research\Stats Simulations\MUSim'
power_results_file = join(main_dir, 'results', 'MUSim_power_results.txt')
make_power_csvs(power_results_file)
null_results_file = join(main_dir, 'results', 'MUSim_null_results.txt')
make_null_csvs(null_results_file)
if __name__ == '__main__':
main()