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.000276096 | Any | 0.0 | ||
2 | 1 | condition: face | 0.00121805 | Any | 0.01 | ||
3 | 1 | condition: face | 0.00905281 | Any | 0.02 | ||
4 | 1 | condition: face | 0.00492913 | Any | 0.03 | ||
5 | 1 | condition: face | 0.000306879 | Any | 0.04 | ||
6 | 1 | condition: face | 0.0011858 | Any | 0.05 | ||
7 | 1 | condition: face | 0.00734451 | Any | 0.06 | ||
8 | 1 | condition: face | 0.00833586 | Any | 0.07 | ||
9 | 1 | condition: face | 0.00952535 | Any | 0.08 | ||
10 | 1 | condition: face | 0.00563764 | Any | 0.09 | ||
11 | 1 | condition: face | 0.0590155 | Any | 0.1 | ||
12 | 1 | condition: face | 0.187331 | Any | 0.11 | ||
13 | 1 | condition: face | 0.576066 | Any | 0.12 | ||
14 | 1 | condition: face | 0.304674 | Any | 0.13 | ||
15 | 1 | condition: face | 0.269461 | Any | 0.14 | ||
16 | 1 | condition: face | 0.27268 | Any | 0.15 | ||
17 | 1 | condition: face | 0.27276 | Any | 0.16 | ||
18 | 1 | condition: face | 0.286085 | Any | 0.17 | ||
19 | 1 | condition: face | 0.310983 | Any | 0.18 | ||
20 | 1 | condition: face | 0.389116 | Any | 0.19 | ||
21 | 1 | condition: face | 0.0400523 | Any | 0.2 | ||
22 | 1 | condition: face | 0.0209925 | Any | 0.21 | ||
23 | 1 | condition: face | 0.00728841 | Any | 0.22 | ||
24 | 1 | condition: face | 0.00631977 | Any | 0.23 | ||
25 | 1 | condition: face | 0.00666009 | Any | 0.24 | ||
26 | 1 | condition: face | 0.00641612 | Any | 0.25 | ||
27 | 1 | condition: face | 0.00634659 | Any | 0.26 | ||
28 | 1 | condition: face | 0.00605966 | Any | 0.27 | ||
29 | 1 | condition: face | 0.0064253 | Any | 0.28 | ||
30 | 1 | condition: face | 0.00661277 | Any | 0.29 | ||
31 | 1 | condition: face | 0.00657537 | Any | 0.3 | ||
32 | 1 | condition: face | 0.0062685 | Any | 0.31 | ||
33 | 1 | condition: face | 0.00681632 | Any | 0.32 | ||
34 | 1 | condition: face | 0.00674751 | Any | 0.33 | ||
35 | 1 | condition: face | 0.00723387 | Any | 0.34 | ||
36 | 1 | condition: face | 0.00693519 | Any | 0.35 | ||
37 | 1 | condition: face | 0.00673979 | Any | 0.36 | ||
38 | 1 | condition: face | 0.00701447 | Any | 0.37 | ||
39 | 1 | condition: face | 0.00625599 | Any | 0.38 | ||
40 | 1 | condition: face | 0.00684818 | Any | 0.39 | ||
41 | 1 | condition: face | 0.00893697 | Any | 0.4 | ||
42 | 1 | condition: face | 0.00750376 | Any | 0.41 | ||
43 | 1 | condition: face | 0.0104718 | Any | 0.42 | ||
44 | 1 | condition: face | 0.024929 | Any | 0.43 | ||
45 | 1 | condition: face | 0.0225599 | Any | 0.44 | ||
46 | 1 | continuous | 0.000147515 | Any | 0.0 | ||
47 | 1 | continuous | 6.21685e-5 | Any | 0.01 | ||
48 | 1 | continuous | 0.000455905 | Any | 0.02 | ||
49 | 1 | continuous | 4.37426e-5 | Any | 0.03 | ||
50 | 1 | continuous | 0.000123742 | Any | 0.04 | ||
51 | 1 | continuous | 1.94433e-5 | Any | 0.05 | ||
52 | 1 | continuous | 8.24115e-5 | Any | 0.06 | ||
53 | 1 | continuous | 1.53654e-6 | Any | 0.07 | ||
54 | 1 | continuous | 7.52518e-6 | Any | 0.08 | ||
55 | 1 | continuous | 0.00014592 | Any | 0.09 | ||
56 | 1 | continuous | 8.25061e-7 | Any | 0.1 | ||
57 | 1 | continuous | 0.000104262 | Any | 0.11 | ||
58 | 1 | continuous | 5.49448e-6 | Any | 0.12 | ||
59 | 1 | continuous | 0.0001882 | Any | 0.13 | ||
60 | 1 | continuous | 1.16102e-6 | Any | 0.14 | ||
61 | 1 | continuous | 6.31581e-5 | Any | 0.15 | ||
62 | 1 | continuous | 1.56448e-6 | Any | 0.16 | ||
63 | 1 | continuous | 0.000599661 | Any | 0.17 | ||
64 | 1 | continuous | 0.00728231 | Any | 0.18 | ||
65 | 1 | continuous | 0.0978105 | Any | 0.19 | ||
66 | 1 | continuous | 0.854214 | Any | 0.2 | ||
67 | 1 | continuous | 0.355671 | Any | 0.21 | ||
68 | 1 | continuous | 0.282977 | Any | 0.22 | ||
69 | 1 | continuous | 0.285093 | Any | 0.23 | ||
70 | 1 | continuous | 0.278331 | Any | 0.24 | ||
71 | 1 | continuous | 0.282962 | Any | 0.25 | ||
72 | 1 | continuous | 0.284605 | Any | 0.26 | ||
73 | 1 | continuous | 0.284962 | Any | 0.27 | ||
74 | 1 | continuous | 0.283158 | Any | 0.28 | ||
75 | 1 | continuous | 0.281591 | Any | 0.29 | ||
76 | 1 | continuous | 0.284366 | Any | 0.3 | ||
77 | 1 | continuous | 0.282344 | Any | 0.31 | ||
78 | 1 | continuous | 0.284764 | Any | 0.32 | ||
79 | 1 | continuous | 0.285409 | Any | 0.33 | ||
80 | 1 | continuous | 0.281967 | Any | 0.34 | ||
81 | 1 | continuous | 0.280067 | Any | 0.35 | ||
82 | 1 | continuous | 0.281299 | Any | 0.36 | ||
83 | 1 | continuous | 0.274928 | Any | 0.37 | ||
84 | 1 | continuous | 0.278807 | Any | 0.38 | ||
85 | 1 | continuous | 0.267941 | Any | 0.39 | ||
86 | 1 | continuous | 0.259431 | Any | 0.4 | ||
87 | 1 | continuous | 0.239387 | Any | 0.41 | ||
88 | 1 | continuous | 0.1926 | Any | 0.42 | ||
89 | 1 | continuous | 0.0523001 | Any | 0.43 | ||
90 | 1 | continuous | 0.000115614 | 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.