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 :

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:

Error rendering macro 'code': Invalid value specified for parameter 'lang'
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)

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).

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 ):

Error rendering macro 'code': Invalid value specified for parameter 'lang'
>> 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 :

Pour corriger les mouvements occulaires, les composantes 8 et 30 sont sélectionnées.

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 ):

Error rendering macro 'code': Invalid value specified for parameter 'lang'
>> 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 :

Correction du blink: sélection des composantes 16 et 48

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 ):

Error rendering macro 'code': Invalid value specified for parameter 'lang'
>> 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 :

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, ...