Setup
using Unfold
using UnfoldMakie, CairoMakie
using UnfoldSim
using UnfoldDecode
using DataFrames
using StatisticsQuick 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.