Setup
using Unfold
using UnfoldMakie, CairoMakie
using UnfoldSim
using UnfoldDecode
using DataFrames
using Statistics
Quick start of Back-To-Back (b2b)
Data generation
Simulation and data collection
Generate single channel data via UnfoldSim.jl
dat, evts = UnfoldSim.predef_eeg(; noiselevel = 0.1, return_epoched = true);
dat
is a time x repetition Matrix, evts
is a DataFrame
`with independent variables / features to explain the data
Dimension expansion
Repeat the dat 20 times, representing 20 channels. In the future we will replace this with a direct multi-channel simulation.
dat_3d = permutedims(repeat(dat, 1, 1, 20), [3 1 2]);
Channels shouldnt be identical, so we add some noise.
dat_3d .+= 0.1 * rand(size(dat_3d)...);
Modeling
Solver selection
Call b2b solver in UnfoldDecode
b2b_solver = (x, y) -> UnfoldDecode.solver_b2b(x, y; cross_val_reps = 5);
one could specify the specific solvers for G and H by passing the solver_G
and solver_H
parameters to the solver_b2b
function. Implemented solvers are ridge, lasso, lsq, svm, but other solvers from MLJ.jl can be used as well.
Generate the formula
We want to decode condition
, but simultaneously control for the effect of continuous
.
f = @formula 0 ~ 1 + condition + continuous
time = range(0, 0.44, step = 1 / 100)
designDict = [Any => (f, time)]
m = Unfold.fit(UnfoldModel, designDict, evts, dat_3d; solver = b2b_solver);
results = coeftable(m);
results.estimate = abs.(results.estimate); ## back2back has no sign
results = results[results.coefname.!="(Intercept)", :] ## the intercept in b2b is hard to interpret
Row | channel | coefname | estimate | eventname | group | stderror | time |
---|---|---|---|---|---|---|---|
Int64 | String | Float64 | DataType | Nothing | Nothing | Float64 | |
1 | 1 | condition: face | 0.00201176 | Any | 0.0 | ||
2 | 1 | condition: face | 0.00364378 | Any | 0.01 | ||
3 | 1 | condition: face | 0.00520939 | Any | 0.02 | ||
4 | 1 | condition: face | 0.00501611 | Any | 0.03 | ||
5 | 1 | condition: face | 0.00143283 | Any | 0.04 | ||
6 | 1 | condition: face | 0.00233638 | Any | 0.05 | ||
7 | 1 | condition: face | 0.00922447 | Any | 0.06 | ||
8 | 1 | condition: face | 0.00927352 | Any | 0.07 | ||
9 | 1 | condition: face | 0.00962683 | Any | 0.08 | ||
10 | 1 | condition: face | 0.00564038 | Any | 0.09 | ||
11 | 1 | condition: face | 0.0579659 | Any | 0.1 | ||
12 | 1 | condition: face | 0.194406 | Any | 0.11 | ||
13 | 1 | condition: face | 0.5796 | Any | 0.12 | ||
14 | 1 | condition: face | 0.307346 | Any | 0.13 | ||
15 | 1 | condition: face | 0.270874 | Any | 0.14 | ||
16 | 1 | condition: face | 0.270424 | Any | 0.15 | ||
17 | 1 | condition: face | 0.272506 | Any | 0.16 | ||
18 | 1 | condition: face | 0.282857 | Any | 0.17 | ||
19 | 1 | condition: face | 0.31145 | Any | 0.18 | ||
20 | 1 | condition: face | 0.390778 | Any | 0.19 | ||
21 | 1 | condition: face | 0.0365178 | Any | 0.2 | ||
22 | 1 | condition: face | 0.0222499 | Any | 0.21 | ||
23 | 1 | condition: face | 0.00707891 | Any | 0.22 | ||
24 | 1 | condition: face | 0.00644083 | Any | 0.23 | ||
25 | 1 | condition: face | 0.00647094 | Any | 0.24 | ||
26 | 1 | condition: face | 0.00673642 | Any | 0.25 | ||
27 | 1 | condition: face | 0.00644951 | Any | 0.26 | ||
28 | 1 | condition: face | 0.00599373 | Any | 0.27 | ||
29 | 1 | condition: face | 0.00647065 | Any | 0.28 | ||
30 | 1 | condition: face | 0.00632556 | Any | 0.29 | ||
31 | 1 | condition: face | 0.00664532 | Any | 0.3 | ||
32 | 1 | condition: face | 0.00664224 | Any | 0.31 | ||
33 | 1 | condition: face | 0.00676942 | Any | 0.32 | ||
34 | 1 | condition: face | 0.00704748 | Any | 0.33 | ||
35 | 1 | condition: face | 0.00704868 | Any | 0.34 | ||
36 | 1 | condition: face | 0.00689335 | Any | 0.35 | ||
37 | 1 | condition: face | 0.00695012 | Any | 0.36 | ||
38 | 1 | condition: face | 0.00680078 | Any | 0.37 | ||
39 | 1 | condition: face | 0.00590307 | Any | 0.38 | ||
40 | 1 | condition: face | 0.00730209 | Any | 0.39 | ||
41 | 1 | condition: face | 0.00706259 | Any | 0.4 | ||
42 | 1 | condition: face | 0.00870782 | Any | 0.41 | ||
43 | 1 | condition: face | 0.012643 | Any | 0.42 | ||
44 | 1 | condition: face | 0.0253075 | Any | 0.43 | ||
45 | 1 | condition: face | 0.0162129 | Any | 0.44 | ||
46 | 1 | continuous | 0.000270012 | Any | 0.0 | ||
47 | 1 | continuous | 6.95933e-6 | Any | 0.01 | ||
48 | 1 | continuous | 0.000200561 | Any | 0.02 | ||
49 | 1 | continuous | 0.000127116 | Any | 0.03 | ||
50 | 1 | continuous | 0.000350511 | Any | 0.04 | ||
51 | 1 | continuous | 7.50886e-5 | Any | 0.05 | ||
52 | 1 | continuous | 0.000289418 | Any | 0.06 | ||
53 | 1 | continuous | 1.35741e-5 | Any | 0.07 | ||
54 | 1 | continuous | 5.88929e-5 | Any | 0.08 | ||
55 | 1 | continuous | 6.73665e-7 | Any | 0.09 | ||
56 | 1 | continuous | 6.22823e-7 | Any | 0.1 | ||
57 | 1 | continuous | 2.80815e-5 | Any | 0.11 | ||
58 | 1 | continuous | 7.95363e-5 | Any | 0.12 | ||
59 | 1 | continuous | 0.000250677 | Any | 0.13 | ||
60 | 1 | continuous | 0.000129402 | Any | 0.14 | ||
61 | 1 | continuous | 0.00012792 | Any | 0.15 | ||
62 | 1 | continuous | 3.74312e-6 | Any | 0.16 | ||
63 | 1 | continuous | 0.000914131 | Any | 0.17 | ||
64 | 1 | continuous | 0.00809811 | Any | 0.18 | ||
65 | 1 | continuous | 0.0939346 | Any | 0.19 | ||
66 | 1 | continuous | 0.857561 | Any | 0.2 | ||
67 | 1 | continuous | 0.358082 | Any | 0.21 | ||
68 | 1 | continuous | 0.273539 | Any | 0.22 | ||
69 | 1 | continuous | 0.278744 | Any | 0.23 | ||
70 | 1 | continuous | 0.28211 | Any | 0.24 | ||
71 | 1 | continuous | 0.287228 | Any | 0.25 | ||
72 | 1 | continuous | 0.286356 | Any | 0.26 | ||
73 | 1 | continuous | 0.279863 | Any | 0.27 | ||
74 | 1 | continuous | 0.281136 | Any | 0.28 | ||
75 | 1 | continuous | 0.284399 | Any | 0.29 | ||
76 | 1 | continuous | 0.281916 | Any | 0.3 | ||
77 | 1 | continuous | 0.286074 | Any | 0.31 | ||
78 | 1 | continuous | 0.284982 | Any | 0.32 | ||
79 | 1 | continuous | 0.281391 | Any | 0.33 | ||
80 | 1 | continuous | 0.282507 | Any | 0.34 | ||
81 | 1 | continuous | 0.280331 | Any | 0.35 | ||
82 | 1 | continuous | 0.27924 | Any | 0.36 | ||
83 | 1 | continuous | 0.278484 | Any | 0.37 | ||
84 | 1 | continuous | 0.275909 | Any | 0.38 | ||
85 | 1 | continuous | 0.273713 | Any | 0.39 | ||
86 | 1 | continuous | 0.2579 | Any | 0.4 | ||
87 | 1 | continuous | 0.245107 | Any | 0.41 | ||
88 | 1 | continuous | 0.192979 | Any | 0.42 | ||
89 | 1 | continuous | 0.0516782 | Any | 0.43 | ||
90 | 1 | continuous | 3.68542e-5 | Any | 0.44 |
Plotting
plot_erp(results; axis = (xlabel = "Time [s]", ylabel = "Performance"))

We can see from the graph that b2b solver identifies regions where the signal can be decoded, taking into account the continuous
feature
This page was generated using Literate.jl.