This is a collaborative space. In order to contribute, send an email to maximilien.chaumon@icm-institute.org
On any page, type the letter L on your keyboard to add a "Label" to the page, which will make search easier.
Ica neuromag blink
Cette page présente un exemple d'utilisation de l'ICA (Independant Component Analysis) sur des données MEG Neuromag (magnetometres et gradiometres) de repos yeux ouverts (YO).
Les données ont d'abord été pré-traitées avec MaxFilter (tsss) et inspectées visuellement pour s'assurer de l'absence de "gros" artéfacts.
Le calcul et le rejet des composantes d'ICA est réalisé avec Fieldtrip (version 20140424), l'inspection visuelle des données originales, des composantes d'ICA et des données corrigées est faite avec muse (lecture des fichiers .mat).
Références :
http://fieldtrip.fcdonders.nl/tutorial/artifacts?s\[]=ica#using_ica_to_identify_artifacts
- http://fieldtrip.fcdonders.nl/example/use_independent_component_analysis_ica_to_remove_ecg_artifacts
- http://fieldtrip.fcdonders.nl/example/use_independent_component_analysis_ica_to_remove_eog_artifacts
- http://fieldtrip.fcdonders.nl/faq/why_does_my_ica_output_contain_complex_numbers
Tous les scripts utilisés se trouvent ici : /export/home/jeandidier.lemarecha/data/tests/ica/fieldtrip
2 paramètres ont été testés:
- nombre de composantes PCA à garder pour l'ICA (lien entre la dimensionnalité des données et la convergence de l'ICA)
- séparation des magnetometres et des gradiometres dans l'ICA
Calcul des composantes ICA : nombre de composantes PCA et convergence
Le script do_ica.m permet de calculer l'ICA sur un fichier en spécifiant les capteurs à utiliser et le nombre de composantes PCA à garder avant de faire l'ICA:
function [ comp, output_filename ] = do_ica( input_filename, channels, components, output_directory )
Cette fonction calcule les composantes ICA (la topographie et le décours temporel) et écrit les résultats dans le fichier input_filename+channels+ft_componentanalysis_runica_pca_components.mat dans le répertoire output_directory.
La convergence de l'ICA n'est pas garantie et dépend de la dimensionnalité des données en entrée : http://fieldtrip.fcdonders.nl/faq/why_does_my_ica_output_contain_complex_numbers\\
Pour tester la convergence de l'ICA sur nos données, on va tester différentes valeurs pour le nombre de composantes PCA à garder avant l'ICA: en commençant par tout garder (égal au nombre de capteurs), puis en en enlevant 10, 20, 30, ... jusqu'à en garder 40 au minimum.
Pour l'ICA utilisant simultanément les magnetometres et les gradiometres (306 capteurs), on garde d'abord 306 composantes PCA, puis 296, 286, 276, ... , 46.
Pour l'ICA sur les magnetometres (102 capteurs), on garde d'abord 102 composantes PCA, puis 92, 82, 72, ... , 42.
Pour l'ICA sur les gradiometres (204 capteurs), on garde d'abord 204 composantes PCA, puis 194, 184, 174, ... , 44.
Le script check_components.m permet de vérifier la convergence de l'ICA:
- l'ICA converge en utilisant simultanément les magnetometres et les gradiometres en gardant seulement 86 composantes PCA (pas de convergence pour 96)
- l'ICA converge en utilisant uniquement les magnetometres en gardant seulement 72 composantes PCA (pas de convergence pour 82)
- l'ICA converge en utilisant uniquement les gradiometres en gardant seulement 104 composantes PCA (pas de convergence pour 114)
Ces valeurs sont indicatives et peuvent changer :
- en fonction du fichier en entrée (rang des données, notamment affaibli par la procédure tsss)
- en recalculant l'ICA sur un même fichier avec les mêmes paramètres (l'algo n'est pas déterministe)
A ce stade, on dispose de 3 fichiers d'ICA (topo + decours temporel) :
- YO_tsss_st_10000_MEG_ft_componentanalysis_runica_pca_86_components.mat
- YO_tsss_st_10000_MEGMAG_ft_componentanalysis_runica_pca_72_components.mat
- YO_tsss_st_10000_MEGGRAD_ft_componentanalysis_runica_pca_104_components.mat
Etude des composantes ICA : visualisation (décours temporel et topographie), sélection, correction et comparaison avec les données originales
Le but est de corriger les artéfacts dus aux mouvements occulaires (clignements, saccades)
Magnétomètres et Gradiomètres
Visualisation et sélection des composantes ICA (#86)
- ouverture des données originales et des composantes ICA avec muse
- visualisation des décours temporels des canaux occulaires (BIO001 et BIO002) et des composantes ICA
- visualisation des carto des composantes ICA (magnetometres)
- visualisation des carto des composantes ICA (gradiometres)
Dans le but de corriger les mouvements occulaires, on identifie les composantes 17 et 52, considérées comme sources d'artéfacts occulaires, et repérées sur les décours temporels par comparaison directe avec les signaux occulaires originaux BIO001 et BIO002 et validées par les topographies associées (plus ou moins "caractéristiques" de mouvements occulaires).
Correction des données et comparaison avec les données originales
Pour corriger les données, on utilise le script reject_components.m :
Error rendering macro 'code': Invalid value specified for parameter 'lang'function [ data_corrected, output_filename ] = reject_components( input_filename, components_filename, components_to_remove )
Ce script prend en argument le fichier des données originales, le fichier contenant le calcul des composantes ICA et une liste de composantes à enlever.
Il retourne les données corrigées ( format FieldTrip ) et le fichier dans lequel ces nouvelles données sont sauvées ( format FIF ):
>> addpath /lena13/home_users/users/lemarechal/dev/dev/Install/fieldtrip/fieldtrip-20140424 >> input_filename='/export/home/jeandidier.lemarecha/data/tests/data/hafeza_hafeza/140402/YO_tsss_st_10000.fif'; >> components_filename='/lena13/home_users/users/lemarechal/cluster_data/tests/ica/fieldtrip/results/test1/YO_tsss_st_10000_MEG_ft_componentanalysis_runica_pca_86_components.mat'; >> components_to_remove=[ 17, 52 ]; >> [ data_corrected, output_filename ] = reject_components( input_filename, components_filename, components_to_remove ) >> ... data_corrected = hdr: [1x1 struct] label: {326x1 cell} time: {[1x191000 double]} trial: {[326x191000 double]} fsample: 1000 sampleinfo: [1 191000] grad: [1x1 struct] cfg: [1x1 struct] output_filename = /lena13/home_users/users/lemarechal/cluster_data/tests/ica/fieldtrip/results/test1/YO_tsss_st_10000_MEG_ft_componentanalysis_runica_pca_86_components_corrected_17_52
Comparaison données originales / corrigées :
- time course des magnétometres gauches MEG0111, MEG0121 MEG0131 MEG0141 et droits MEG1411 MEG1421 MEG1441
- topo des magnétometres
time course des gradiometres gauches MEG011[2-3], MEG012[2-3] MEG013[2-3] MEG014[2-3] et droits MEG141[2-3] MEG142[2-3] MEG144[2-3]
- topo des gradiometres
Magnétomètres
Visualisation et sélection des composantes ICA (#72)
- ouverture des données originales et des composantes ICA avec muse
- visualisation des décours temporels des canaux occulaires (BIO001 et BIO002) et des composantes ICA
- visualisation des carto des composantes ICA (magnetometres)
Pour corriger les mouvements occulaires, les composantes 8 et 30 sont sélectionnées.
Correction des données et comparaison avec les données originales
Pour corriger les données, on utilise le script reject_components.m :
Error rendering macro 'code': Invalid value specified for parameter 'lang'function [ data_corrected, output_filename ] = reject_components( input_filename, components_filename, components_to_remove )
Ce script prend en argument le fichier des données originales, le fichier contenant le calcul des composantes ICA et une liste de composantes à enlever.
Il retourne les données corrigées ( format FieldTrip ) et le fichier dans lequel ces nouvelles données sont sauvées ( format FIF ):
>> addpath /lena13/home_users/users/lemarechal/dev/dev/Install/fieldtrip/fieldtrip-20140424 >> input_filename='/export/home/jeandidier.lemarecha/data/tests/data/hafeza_hafeza/140402/YO_tsss_st_10000.fif'; >> components_filename='/lena13/home_users/users/lemarechal/cluster_data/tests/ica/fieldtrip/results/test1/YO_tsss_st_10000_MEGMAG_ft_componentanalysis_runica_pca_72_components.mat'; >> components_to_remove=[ 8, 30 ]; >> [ data_corrected, output_filename ] = reject_components( input_filename, components_filename, components_to_remove ) >> ... data_corrected = hdr: [1x1 struct] label: {326x1 cell} time: {[1x191000 double]} trial: {[326x191000 double]} fsample: 1000 sampleinfo: [1 191000] grad: [1x1 struct] cfg: [1x1 struct] output_filename = /lena13/home_users/users/lemarechal/cluster_data/tests/ica/fieldtrip/results/test1/YO_tsss_st_10000_MEGMAG_ft_componentanalysis_runica_pca_72_components_corrected_8_30
Comparaison données originales / corrigées :
- time course des magnétometres gauches MEG0111, MEG0121 MEG0131 MEG0141 et droits MEG1411 MEG1421 MEG1441
- topo des magnétometres
Gradiomètres
Visualisation et sélection des composantes ICA (#104)
- ouverture des données originales et des composantes ICA avec muse
- visualisation des décours temporels des canaux occulaires (BIO001 et BIO002) et des composantes ICA
- visualisation des carto des composantes ICA (gradiometres)
Correction du blink: sélection des composantes 16 et 48
Correction des données et comparaison avec les données originales
Pour corriger les données, on utilise le script reject_components.m :
Error rendering macro 'code': Invalid value specified for parameter 'lang'function [ data_corrected, output_filename ] = reject_components( input_filename, components_filename, components_to_remove )
Ce script prend en argument le fichier des données originales, le fichier contenant le calcul des composantes ICA et une liste de composantes à enlever.
Il retourne les données corrigées ( format FieldTrip ) et le fichier dans lequel ces nouvelles données sont sauvées ( format FIF ):
>> addpath /lena13/home_users/users/lemarechal/dev/dev/Install/fieldtrip/fieldtrip-20140424 >> input_filename='/export/home/jeandidier.lemarecha/data/tests/data/hafeza_hafeza/140402/YO_tsss_st_10000.fif'; >> components_filename='/lena13/home_users/users/lemarechal/cluster_data/tests/ica/fieldtrip/results/test1/YO_tsss_st_10000_MEGGRAD_ft_componentanalysis_runica_pca_104_components.mat'; >> components_to_remove=[ 16, 48 ]; >> [ data_corrected, output_filename ] = reject_components( input_filename, components_filename, components_to_remove ) >> ... data_corrected = hdr: [1x1 struct] label: {326x1 cell} time: {[1x191000 double]} trial: {[326x191000 double]} fsample: 1000 sampleinfo: [1 191000] grad: [1x1 struct] cfg: [1x1 struct] output_filename = /lena13/home_users/users/lemarechal/cluster_data/tests/ica/fieldtrip/results/test1/YO_tsss_st_10000_MEGGRAD_ft_componentanalysis_runica_pca_104_components_corrected_16_48
Comparaison données originales / corrigées :
time course des gradiometres gauches MEG011[2-3], MEG012[2-3] MEG013[2-3] MEG014[2-3] et droits MEG141[2-3] MEG142[2-3] MEG144[2-3]
- topo des gradiometres
Conclusion
- Computing ICA components simultaneously with magnetometers and gradiometers, compared with computing ICA components separately for magnetometers and gradiometers, doesn't seem to make any difference, at least visually.
- Number of PCA components to keep : I would suggest 100 for magnetometers and gradiometers simultaneously and if it does not converge, try 95, 90, ...