Page 1
How to perform MEG group analysis with MNE
MNE software for processing MEG and EEG data, A. Gramfort, M. Luessi, E. Larson, D. Engemann, D. Strohmeier, C. Brodbeck, L. Parkkonen, M. Hämäläinen, Neuroimage, 2014MEG and EEG data analysis with MNE-Python, A. Gramfort, M. Luessi, E. Larson, D. Engemann, D. Strohmeier, C. Brodbeck, R. Goj, M. Jas, T. Brooks, L. Parkkonen, M. Hämäläinen, Frontiers in Neuroscience, 2013
Biomag 2016http://www.biomag2016.org/satellite_meetings2.php
http://martinos.org/mne
Page 2
• MNE based on C code developed for ~15 years by MSH• MNE-Python started ~6 years ago at MGH, Boston
About the project
Source: https://www.ohloh.net/p/MNE
Page 3
http://martinos.org/mne/
Page 4
http://mne-tools.github.io/mne-biomag-group-demo/
Page 5
People behind this work
@agramfort @dengemann
@jasmainak
http://martinos.org/mne/stable/whats_new.html@jaeilepp
@Eric89GXL
Page 6
(Some) MNE People
@agramfort @mluessi @dengemann
@lauriparkkonen
@Eric89GXL
@mshamalainen
@t3on
@joewalter
@jasmainak@rgoj
@chris=anmbrodbeck
@jaeilepp
@adykstra @leggi@a
@kazemakase
@TalLinzen
@OlafHauk @jdammers
http://martinos.org/mne/stable/whats_new.html
@kingjr
Page 7
MNE People
https://github.com/mne-tools/mne-python/graphs/contributors
Alan Leggitt, Alexander Rudiuk, Alexandre Barachant, Alexandre Gramfort, Andrew Dykstra, Asish Panda, Basile Pinsard, Brad Buran, Camilo Lamus, Cathy Nangini, Chris Holdgraf, Christian Brodbeck, Christoph Dinh, Christopher J. Bailey, Christopher Mullins, Clemens Brunner, Clément Moutard, Dan G. Wakeman, Daniel McCloy, Daniel Strohmeier, Denis A. Engemann, Emanuele Olivetti, Emily Ruzich, Emily Stephen, Eric Larson, Fede Raimondo, Federico Raimondo, Félix Raimundo, Guillaume Dumas, Hafeza Anevar, Hari Bharadwaj, Ingoo Lee, Jaakko Leppakangas, Jair Montoya, Jean-Remi King, Johannes Niediek, Jona Sassenhagen, Jussi Nurminen, Kambiz Tavabi, Keith Doelling, Lorenzo De Santis, Louis Thibault, Luke Bloy, Mads Jensen, Mainak Jas, Manfred Kitzbichler, Manoj Kumar, Marian Dovgialo, Marijn van Vliet, Mark Wronkiewicz, Marmaduke Woodman, Martin Billinger, Martin Luessi, Matt Tucker, Matti Hamalainen, Michael Krause, Mikolaj Magnuski, Natalie Klein, Nick Foti, Nick Ward, Niklas Wilming, Olaf Hauk, Phillip Alday, Praveen Sripad, Richard Höchenberger, Roan LaPlante, Romain Trachel, Roman Goj, Ross Maddox, Sagun Pai, Saket Choudhary, Simon Kornblith, Simon-Shlomo Poil, Sourav Singh, Tal Linzen, Tanay, Teon Brooks, Tom Dupré la Tour, Yaroslav Halchenko, Yousra Bekhti, Ellen Lau, Mads Jensen !
Page 8
https://github.com/mne-tools/mne-biomag-group-demo/
Get the code to replicate
Page 9
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/index.html
Analysis Scripts
Page 12
.../mne-biomag-group-demo/tree/master/scripts/processing
Fetch data from OpenfMRI
Sensor space analysis
Source space analysis
Anatomical pipeline
Page 13
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/index.html
Results at group level
Page 14
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/index.html
Demos and results for each
subject
Page 15
Installing MNE-Python
$ pip install --upgrade --user mne
Install Scientific Python environment, e.g., Anaconda at
http://martinos.org/mne/stable/install_mne_python.html
https://www.continuum.io/downloads
Install MNE-Python:
Page 16
.../mne-biomag-group-demo/tree/master/scripts/processing
Fetch data from OpenfMRI
Sensor space analysis
Source space analysis
Anatomical pipeline
Page 17
Built on top of FreeSurfer$ recon-all -s ${SUBJECT} -i xy000000.nii -all
http://surfer.nmr.mgh.harvard.edu/
Page 18
Anatomy workflow
MRI data
MRI data reconstructedrecon-all (Freesurfer 5.1)
BEM meshmne watershed_bemor mne flash_bem
BEM model
MEG/EEG data
Forward solutionor gain matrix
not automatic
needs freesurfer
Coregistrationmne_analyze/mrilab/Python
Page 19
BEM meshes
http://martinos.org/mne/stable/auto_tutorials/plot_forward.html
Page 20
BEM meshes
>>> for subject_id in range(1, 20):>>> subject = "sub%03d" % subject_id>>> mne.bem.make_watershed_bem(subject, >>> subjects_dir=subjects_dir,>>> overwrite=True)
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/11-make_watershed.html
Page 21
Preprocessing: From raw to ERP/ERFdrifts blinks
line noise
cardiac
10 seconds filtered data clean data using SSPs
Preprocessingto get cleanevoked data(ERF/ERP)
or ICA
Page 22
Maxwell filtering
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_maxfilter.html
MNE implements maxfilter (TM)
Page 23
Maxwell filtering
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_maxfilter.html
MNE implements maxfilter (TM)
Page 24
Maxwell filtering
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_maxfilter.html
MNE implements maxfilter (TM)
Page 25
.../mne-biomag-group-demo/tree/master/scripts/processing
Fetch data from OpenfMRI
Sensor space analysis
Source space analysis
Page 26
Filtering
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_analysis_1.html
Page 27
Filtering
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_analysis_1.html
Page 28
Code for filtering
>>> for subject_id in range(1, 20):>>> subject = "sub%03d" % subject_id>>> for run in range(1, 7):>>> raw_in = ...>>> raw = mne.io.read_raw_fif(raw_in, preload=True, add_eeg_ref=False)>>> raw.filter(1, 40, l_trans_bandwidth=0.5, h_trans_bandwidth='auto',>>> filter_length='auto', phase='zero', fir_window='hann')
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/02-python_filtering.html
Page 29
Filter design
http://martinos.org/mne/stable/auto_tutorials/plot_background_filtering.html
Page 30
Filter design
High pass filtering removes slow drifts and can make baselining unnecessary… yet the story is not that simple
http://martinos.org/mne/stable/auto_tutorials/plot_background_filtering.html
Page 31
Paradigm
Presentation Screen
Famous
Unfamiliar
Scrambled
Page 32
Paradigm on trigger channel
>>> mask = 4096 + 256 # mask for excluding high order bits>>> events = mne.find_events(raw, stim_channel='STI101',>>> consecutive='increasing', mask=mask,>>> mask_type='not_and', min_duration=0.003)>>> fig = mne.viz.plot_events(events)
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/03-run_extract_events.html
Page 33
Paradigm in code
>>> events_id = {>>> 'face/famous/first': 5,>>> 'face/famous/immediate': 6,>>> 'face/famous/long': 7,>>> 'face/unfamiliar/first': 13,>>> 'face/unfamiliar/immediate': 14,>>> 'face/unfamiliar/long': 15,>>> 'scrambled/first': 17,>>> 'scrambled/immediate': 18,>>> 'scrambled/long': 19,>>> }
Use “tags” to describe events
Page 34
From Epochs to Evoked
>>> tmin, tmax = -0.2, 0.8>>> reject = dict(grad=4000e-13, mag=4e-12, eog=180e-6)>>> baseline = None>>>>>> epochs = mne.Epochs(raw, events, events_id, tmin, tmax,
proj=True, picks=picks, baseline=baseline, preload=True, decim=2, reject=reject, add_eeg_ref=False)
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/05-make_epochs.html
…reject the ones with blinks
Page 35
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_analysis_1.html
why did we drop epochs?Example of “drop log” for subject 1:
Page 36
Use ICA on Epochs to remove ECG>>> ica_name = op.join(meg_dir, subject, 'run_%02d-ica.fif' % run)>>> ica = read_ica(ica_name)>>> n_max_ecg = 3 # use max 3 components>>> ecg_epochs = create_ecg_epochs(raw, tmin=-.5, tmax=.5)>>> ecg_inds, scores_ecg = ica.find_bads_ecg(ecg_epochs, method='ctps',
threshold=0.8)>>> ica.exclude += ecg_inds[:n_max_ecg]>>> ica.apply(epochs)
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_ica.html
Page 37
Use ICA on Epochs to remove ECG
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_ica.html
Page 38
Fit and apply ICA on Epochs
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_ica.html
Page 39
From Epochs to Evoked
>>> evoked_faces = epochs['face'].average()>>> evoked_famous = epochs['face/famous'].average()>>> evoked_scrambled = epochs['scrambled'].average()>>> evoked_unfamiliar = epochs[‘face/unfamiliar'].average()>>> contrast = mne.combine_evoked([evoked_famous, >>> evoked_unfamiliar,>>> evoked_scrambled], >>> weights=[0.5, 0.5, -1.])>>> mne.evoked.write_evokeds('%s-ave.fif' % subject, [evoked_famous, evoked_scrambled, evoked_unfamiliar, contrast,
faces])
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/06-make_evoked.html
Index Epochs with tags
Page 40
EEG Evoked for 3 first subjects
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_compare.html
Page 41
EEG Evoked topographies (6 subjects)
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_compare.html
Page 42
MEG Evoked for 3 first subjects
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_compare.html
Page 43
MEG Evoked for 3 first subjects
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_compare.html
Page 44
Back to filtering…
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_fanning.html
>>> raw.filter(None, 40, fir_window='hann', phase='zero', h_trans_bandwidth=‘auto’, filter_length='auto')
Page 45
Back to filtering…
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_fanning.html
>>> raw.filter(None, 40, fir_window='hann', phase='zero', h_trans_bandwidth=‘auto’, filter_length='auto')
Fanningproblem
Page 46
Much lessfanning
Back to filtering…
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_fanning.html
>>> raw.filter(1, None, l_trans_bandwidth=0.5, fir_window='hann', phase='zero',
h_trans_bandwidth=‘auto’, filter_length='auto')
Page 47
Covariance est. and whitening
Engemann, D.A., Gramfort, A., Automated model selection in covariance estimation and spatial whitening of MEG and EEG signals., Neuroimage 2015
>>> cov = mne.compute_covariance(epochs, tmax=0, method='shrunk')
Page 48
Covariance est. and whitening
>>> cov = mne.compute_covariance(epochs, tmax=0, method='shrunk')
whitened Global Field Power
whitened ERF
whitened ERP
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_analysis_1.html
Page 49
Grand averaging
>>> for idx, evokeds in enumerate(all_evokeds):>>> # Combine subjects:>>> grand_avg[idx] = mne.combine_evoked(evokeds, 'equal')
>>> mapping = {'Famous': evokeds[0], 'Scrambled': evokeds[1], 'Unfamiliar': evokeds[2]}>>> mne.viz.plot_compare_evokeds(mapping, [idx])
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_group.html
Page 50
Grand averaging
>>> for idx, evokeds in enumerate(all_evokeds):>>> # Combine subjects:>>> grand_avg[idx] = mne.combine_evoked(evokeds, 'equal')
>>> mapping = {'Famous': evokeds[0], 'Scrambled': evokeds[1], 'Unfamiliar': evokeds[2]}>>> mne.viz.plot_compare_evokeds(mapping, [idx])
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_group.html
From baseline to baseline !
Page 51
MNE vs. Wakeman et al.
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_group.html
Page 52
MNE vs. Wakeman et al.
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_group.html
Real?
Page 53
Sensors stats (cluster level)
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_sensor_cluster_stats_eeg_channel.html
Page 54
Sensors stats (cluster level)
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_sensor_spatio_temporal_cluster_stats.html
p = 0.01 (corrected)
Page 55
Decoding
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_time_decoding.html
>>> td = TimeDecoding(predict_mode='cross-validation', times=times, scorer='roc_auc')>>> td.fit(epochs, y)
http://mne-tools.github.io/mne-biomag-group-demo/auto_scripts/08-run_time_decoding.html
Page 56
Source space analysis
• 3 Layers BEM forward modeling
• dSPM source localization on cortical surface
• loose orientation (0.2) & depth (0.8) & SNR = 3
• RMS across orientations
• morphing to fsaverage:subject fsaveragemorphing
… the MNE (default) way
Page 57
Source space analysis
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_analysis_2.html
Subject 2Contrast
localization (faces vs.
scrambled
Page 58
Source space group analysis
http://mne-tools.github.io/mne-biomag-group-demo/auto_examples/plot_group.html
16 subjectsaverage ofContrast (faces vs.
scrambled
Page 59
MNE web report
http://perso.telecom-paristech.fr/~mjas/biomag_demo/report_sub002.html
Page 60
MNE web report
http://perso.telecom-paristech.fr/~mjas/biomag_demo/report_sub002.html
Command line:$ mne report --path MEG/sub002 --info MEG/sub002/run_01_filt_sss-epo.fif --subject sub002 --subjects-dir subjects/ --verbose --jobs 6
Page 61
Getting help http://martinos.org/mne/
http://mail.nmr.mgh.harvard.edu/mailman/listinfo/mne_analysisMailing list:
Page 62
Getting inspired...http://martinos.org/mne/auto_examples/index.html
Page 63
Sending feedbackhttps://github.com/mne-tools/mne-python
Page 64
Some links• Documentation:
• http://martinos.org/mne/ (general doc)
• http://martinos.org/mne/stable/manual/index.html (manual)
• http://martinos.org/mne/stable/tutorials.html (tutorials with code)
• http://martinos.org/mne/auto_examples/index.html (python examples)
• Code:
• https://github.com/mne-tools/mne-python (mne-python code)
• https://github.com/mne-tools/mne-matlab (mne matlab toolbox)
• https://github.com/mne-tools/mne-scripts (mne shell scripts)
Page 65
Access HCP-MEG data as MNE-Python data structures
https:/mne-tools.github.io/mne-hcp
Page 66
Seamlessly plug HCP MEG data into the Python ecosystem
…/mne-hcp/auto_tutorials/index.html
Poster
[Mo-P008]
Engemann et al.
Page 67
Alexandre Gramforthttp://alexandre.gramfort.netContact:
GitHub : @agramfort Twitter : @agramfort
If you want a sticker come to the
MNE poster !
OpenScience!