Reference node chains for EEG processing

In order to have a common basis for computation, certain reference processing chains have been created. You can find the corresponding files in the documentation under /examples/specs/node_chains/. The revision and improvement of the node chains listed below is part of the ongoing research. The documentation is updated automatically.

P300 Reference Node Chain

This is the node chain for the P300 detection:

-
    node : Time_Series_Source
-
    node : Standardization
-
    node : Decimation
    parameters :
        target_frequency : 25
        comp_type : 'normal'
-
    node : FFT_Band_Pass_Filter
    parameters :
        pass_band : [0.0, 4.0]
-
    node : TrainTestSplitter
-
    node : xDAWN
    parameters :
        erp_class_label : "Target"
        store : False
        visualize_pattern : False
        retained_channels : 8
-
    node : Local_Straightline_Features
    parameters :
        segment_width : 400
        stepsize : 120
        coefficients_used : [1]
-
    node : Gaussian_Feature_Normalization
-
    node : Grid_Search
    parameters :
        parallelization:
            processing_modality : 'serial'
        optimization:
              ranges : {~~log_complexity~~: [0, -1, -2,-3,-4,-5,-6]}
        validation_set :
            split_node :
                node : CV_Splitter
                parameters :
                    splits : 5
                    stratified : True
        evaluation:
            metric : "Balanced_accuracy"
            std_weight: 0
            performance_sink_node :
                node : Classification_Performance_Sink
                parameters :
                    ir_class : 'Target'
                    measure_times : False
                    calc_AUC : False

        variables: [${~~log_complexity~~}]

        nodes :
            -
                node: LibSVM_Classifier
                parameters :
                    complexity : "eval(10**${~~log_complexity~~})"
                    class_labels : ['Standard', 'Target']
                    weight : [1.0, 5.0]
                    kernel_type : 'LINEAR'
                    max_iterations : 50
            -
                node: Threshold_Optimization
                parameters :
                    metric : 'Balanced_accuracy'
                    class_labels : ['Standard', 'Target']
-
    node : Classification_Performance_Sink
    parameters :
        ir_class : 'Target'

LRP Reference Node Chain

This is the node chain for LRP detection:

-
    node : Time_Series_Source
-
    node : Standardization
-
    node : Decimation 
    parameters :
        target_frequency : 20
        comp_type : 'normal' 
        time_shift : "middle"
-
    node : FFT_Band_Pass_Filter
    parameters :
        pass_band : [0.1, 4.0]
-
    node : Windowing
    parameters :
        window_function_str : "t800"
        reduce_window : True
-
    node : Grid_Search
    parameters :
        parallelization: # change this according to your needs
            processing_modality : "serial"
            pool_size : 1
        optimization:
            ranges : {~~log_complexity~~: [0,-1,-2,-3,-4,-5,-6]} # this is a compromise of performance and computation time; if performance is more important use pattern search or larger grid (incl. weight optimization)
        validation_set :
            split_node :
                node : Noop
        evaluation:
            metric : "Balanced_accuracy"
            std_weight: 0
            performance_sink_node :
                node : Sliding_Window_Performance_Sink
                parameters :
                    ir_class : 'LRP'
                    decision_boundary : 0.5
                    measure_times : False
                    calc_AUC : False
                    classes_names : ['NoLRP','LRP']
                    determine_labels : 3
                    epoch_eval : False
                    uncertain_area : 'eval([(-1250,-300),(-200,0)])' # 0 here means MARS movement marker; adjust if other scenario!
            
        variables: [${~~log_complexity~~}]
        
        nodes :
            -
                node : TransferSplitter
                parameters :
                    wdefs_train : ["bis-300","bis-150","no_move"] # rule of thumb: 100 ms before actual movement onset, 50 ms after actual movement onset
                    wdefs_test : 'eval(["bis-000","bis-050"]+["bis-%d" % elem for elem in range(100,4050,50)])' # optimize on sliding windows (have to be in the training data!)
                    split_method : "count"
                    splits : 5
                    random : False
                    wdefs_split : ["bis-4000"]
            -
                node : xDAWN
                parameters :
                    erp_class_label : "LRP"
                    retained_channels : 4
            -
                node : Time_Domain_Features
            -
                node : Gaussian_Feature_Normalization
            -  
                node: LibSVM_Classifier
                parameters :
                    complexity : "eval(10**${~~log_complexity~~})"
                    class_labels : ['NoLRP', 'LRP']
                    weight : [1.0, 2.0]
                    kernel_type : 'LINEAR'
            -
               node : PSF
               parameters :
                   class_labels : ['NoLRP','LRP']
                   store : False
-
    node : Sliding_Window_Performance_Sink
    parameters :
       classes_names : ['NoLRP','LRP']
       decision_boundary : 0.5
       ir_class : "LRP"
       determine_labels : 3
       #epoch_signal : "'MarsMarker'"
       epoch_eval : False
       uncertain_area : 'eval([(-1250,-300),(-200,0)])'
       calc_soft_metrics : True