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 :
Wiki Markup 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:
...
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:
Code Block | ||||
---|---|---|---|---|
| ||||
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)
...
Pour corriger les données, on utilise le script reject_components.m :
Code Block | ||||
---|---|---|---|---|
| ||||
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 ):
Code Block | ||||
---|---|---|---|---|
| ||||
>> 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
|
...
Pour corriger les données, on utilise le script reject_components.m :
Code Block | ||||
---|---|---|---|---|
| ||||
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 ):
Code Block | ||||
---|---|---|---|---|
| ||||
>> 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
|
...
Pour corriger les données, on utilise le script reject_components.m :
Code Block | ||||
---|---|---|---|---|
| ||||
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 ):
Code Block | ||||
---|---|---|---|---|
| ||||
>> 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
|
...