Saltar al contenido principal
LibreTexts Español

11.16: Ejercicio: construcción de una tubería de procesamiento de EEG completa

  • Page ID
    151520
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Ahora ha aprendido los conceptos básicos del scripting, así que estamos listos para construir una canalización completa de preprocesamiento de EEG. Este pipeline ejecutará todos los pasos previos al promediado. Coincide estrechamente con la tubería de ejemplo descrita en el Apéndice 3. Aquí, hemos dividido la canalización en cinco scripts separados:

    • Step1_Pre_ICA_Processing.m - Realiza los pasos iniciales de preprocesamiento antes de la corrección de artefactos basada en ICA
    • Step2_ICA_Phase1.m - Crea un dataset optimizado para la descomposición ICA
    • Step3_ICA_Phase2.m - Realiza la descomposición ICA
    • Step4_ICA_Phase3.m - Transfiere los pesos ICA del conjunto de datos optimizado al conjunto de datos original y reconstruye los datos sin los CI artefactos
    • Step5_Post_ICA_Processing.m - Realiza los pasos siguientes a la corrección de artefactos que son necesarios antes de promediar

    Te animo a dividir tu procesamiento de EEG y ERP en múltiples scripts de esta manera. Un principio general de una buena programación es dividir un trabajo complejo en un conjunto de pequeños módulos independientes. Esto hace que cada parte del trabajo sea más simple y menos propensa a errores. También te facilita encontrar y solucionar problemas. Y te facilita reutilizar tu código para futuros experimentos. Idealmente, ninguno de tus scripts debería tener más de 200 líneas de largo (incluyendo comentarios). Si encuentras que un guión se alarga un poco, trata de averiguar cómo dividirlo en una secuencia de guiones más pequeños.

    Step1_pre_ICA_Processing.m es similar a Script5.m del ejercicio anterior, pero con dos cambios importantes. En primer lugar, la interpolación se ha eliminado de este guión y se ha movido a una etapa posterior, después de la corrección de artefactos. Segundo, el nuevo script hace referencia a los datos al O2 más que al promedio de todos los sitios. Esto se debe a que usar el promedio de todos los sitios como referencia hace que ICA sea complicado (ver el capítulo sobre corrección de artefactos). Después del paso ICA, volveremos a hacer referencia al promedio de todos los sitios. Por cierto, podría haber utilizado cualquier sitio como referencia en esta etapa inicial. Consulte el siguiente cuadro de texto para obtener más información.

    Reconocer un error conceptual

    Cuando empecé a escribir estos scripts, hice referencia a los datos al promedio de todos los sitios al inicio de la tubería (porque esta es una referencia estándar para el N170). Había pasado por la etapa de realizar la descomposición de ICA, y comencé a revisar los datos para determinar qué CI deberían eliminarse (usando el proceso descrito en el capítulo sobre corrección de artefactos). Los CI del primer participante se veían bien pero no geniales. El curso del tiempo de uno de los mejores CI tenía mucho ruido extraño de alta frecuencia que no estaba viendo en el EEG. Los CI del segundo participante fueron aún peores, con los dos primeros CI mostrando mucho ruido de alta frecuencia y los movimientos oculares distribuidos en tres CI. Estaba empezando a sospechar. Cuando miré los CI del tercer participante, los parpadeos se extendieron por los cuatro CI superiores, y dos de ellos volvieron a tener una tonelada de ruido extraño de alta frecuencia.

    Entonces me pregunté qué estaba haciendo de manera diferente a antes, y luego me di cuenta de que ahora estaba haciendo referencia al promedio de todos los sitios antes de la descomposición. Luego cambié los guiones para usar O2 como referencia, volví a ejecutar la descomposición ICA, y luego todo funcionó mejor.

    La moraleja de la historia es que es posible que consigas participantes ocasionales para los que los CI no se ven muy bien, pero si ves más de uno o dos, necesitas pensar en tu proceso y averiguar qué está pasando mal. La referencia es un posible problema. Otro problema común es una duración de grabación insuficiente (especialmente si tienes >64 canales). Un tercer problema común es el enorme C.R.A.P. que no ha sido eliminado antes de la descomposición.

    Step2_ICA_Phase1.m implementa los procedimientos descritos en el Capítulo 9 para crear conjuntos de datos optimizados para la descomposición ICA, incluyendo downsampling a 100 Hz, eliminando roturas y otros períodos de enorme C.R.A.P., e implementando un filtro de paso alto agresivo. Es similar a uno de los scripts de ejemplo al final del Capítulo 9 (MMN_Artifiact_Correction_Phase3.m). Abre Step2_ICA_Phase1.m y échale un vistazo.

    Un elemento muy importante de este script es que asume que ya has pasado por el EEG para determinar los parámetros que usarás para encontrar un enorme C.R.A.P. con la rutina de rechazo de artefactos (EEG continuo) y almacenó estos parámetros en una hoja de cálculo llamada ICA_Continuous_ AR.xlsx. Ya he hecho esto por ti. Para determinar estos parámetros, primero comenté la parte del script que realiza el rechazo continuo de artefactos, y luego ejecuté el código al final del script para cargar los conjuntos de datos en la GUI de EEGLAB. Estos conjuntos de datos han sido submuestreados y filtrados agresivamente, y quería ver cómo se veían los artefactos en estos conjuntos de datos porque se usarán para el rechazo continuo de artefactos. Dos de los sujetos tenían una gran C.R.A.P., y yo ejecuté la rutina de rechazo de Artefacto (EEG continuo) desde la GUI para que estos sujetos determinaran los mejores criterios de rechazo. Como se discutió en el capítulo sobre corrección de artefactos, realmente necesita mirar cuidadosamente los datos al establecer estos parámetros si desea que ICA funcione bien. La hoja de cálculo también indica qué canales incluir. He dejado fuera los canales EOG y Fp1/Fp2 para que los artefactos oculares ordinarios no se eliminen. También he dejado fuera cualquier canal que quede fuera de la descomposición ICA e interpolado posteriormente. Períodos locos en estos canales no influirán en la descomposición, así que no necesitamos eliminarlos.

    Si miras el código para leer estos parámetros desde la hoja de cálculo, verás que es muy parecido al código para leer los parámetros para interpolar canales malos en el ejercicio anterior, excepto que tenemos diferentes etiquetas de columnas en la hoja de cálculo.

    También verás que el script llama a la rutina POP_ErplabDeleteTimeSegments para eliminar los periodos de tiempo durante los descansos, lo que también ayuda a deshacerse de grandes C.R.A.P. Tenga en cuenta que los parámetros que controlan esta rutina se definen como variables en la parte superior del script, siguiendo una buena programación práctica.

    Una vez que hayas revisado el guión para ver cómo funciona, sigue adelante y ejecútalo. Verás que crea un nuevo archivo de conjunto de datos para cada participante con _optimized al final del nombre de archivo. También puede cargar los nuevos conjuntos de datos en la GUI de EEGLAB ejecutando el bit de código al final del script. Esto le permite ver cómo se ven los conjuntos de datos optimizados y asegurarse de que todo funcionó correctamente.

    Step3_ICA_Phase2.m ejecuta el proceso de descomposición ICA en el conjunto de datos creado por Step2_ICA_Phase1.m. Se supone que ya se ha creado una hoja de cálculo de Excel llamada interpolate.xlsx para indicar qué canales se interpolarán después de que se haya realizado la corrección y, por lo tanto, deben excluirse de la descomposición ICA. Ya he creado este archivo para ti. Tenga en cuenta que el proceso de descomposición es bastante lento, por lo que este script tarda mucho en ejecutarse.

    Step4_ICA_Phase3.m toma los pesos ICA en el conjunto de datos optimizado y los transfiere de nuevo al conjunto de datos de preoptimización. Luego elimina los CI artifácticos, que se enumeran en un archivo llamado ICs_to_Remove.xlsx. Tuve que determinar qué CI eran artifácticos observando los mapas de CI del cuero cabelludo y comparando los cursos de tiempo de CI con los cursos de tiempo EEG/EOG (como se describe en el capítulo sobre corrección de artefactos). Para hacerlo más fácil, utilicé el bit de código al final de Step3_ICA_Phase2.m para cargar los conjuntos de datos en la GUI de EEGLAB.

    No pasé mucho tiempo tomando decisiones cuidadosas sobre qué CI eliminar (y asegurándome de que la descomposición de ICA fuera realmente óptima). Por ejemplo, el Sujeto 1 todavía tiene alguna actividad de parpadeo restante en F4 después de la corrección. ¡Es realmente aburrido pasar muchas horas seguidas obteniendo el ICA perfecto para un gran grupo de participantes! Esta es una razón más por la que debes hacer el preprocesamiento inicial de cada participante dentro de las 48 horas posteriores a la recolección de datos. Es mucho más fácil dedicar el tiempo necesario para optimizar el ICA cuando solo lo haces para un participante a la vez y no tienes que pasar un día entero procesando los datos de 20 participantes.

    El último script es Step5_Post_ICA_Processing.m, que realiza los pasos siguientes a la corrección de artefactos que deben ejecutarse antes de promediar. Esto incluye volver a hacer referencia al promedio de todos los sitios (y poner los canales en un orden más útil), realizar interpolación para cualquier canal malo, agregar una EventList, asignar eventos a bins con BINLISTER, epojar los datos y realizar detección de artefactos. El guión también imprime un resumen de la proporción general de ensayos marcados para rechazo en cada participante y crea un archivo Excel con esta información desglosada por bin.

    Abre el guión y echa un vistazo. Verás que la primera parte del script (anterior al bucle) define y abre un conjunto de archivos con los parámetros de detección de artefactos. Ya hemos corregido los parpadeos, así que solo queremos marcar épocas con parpadeos que ocurrieron en un momento que pudieran interferir con la percepción del estímulo. Los movimientos oculares no suelen ser un problema en este paradigma porque los estímulos se presentan brevemente en el centro de la pantalla, pero marcamos ensayos con movimientos oculares que podrían interferir con la percepción del estímulo (que eran bastante raros). Utilizamos los canales bipolares no corregidos para la detección de parpadeo y movimiento ocular. También marcamos ensayos con gran C.R.A.P. en cualquiera de los canales EEG (usando tanto un umbral de voltaje absoluto como un algoritmo de amplitud pico a pico de ventana móvil). Cada una de estas rutinas de detección de artefactos utiliza una bandera diferente para que podamos realizar un seguimiento del número de pruebas marcadas para cada tipo de artefacto.

    La parte superior del script también preasigna un conjunto de matrices que se utilizarán para almacenar el número de pruebas aceptadas y rechazadas para cada participante. Esta preasignación no es estrictamente necesaria, pero es una buena práctica de programación, deja en claro cuáles son las dimensiones de las matrices.

    El cuerpo del bucle sujeto carga el conjunto de datos creado por el script anterior, interpola cualquier canal malo, vuelve a hacer referencia a los datos, crea la EventList, ejecuta BINLISTER y epoca los datos. Estos pasos son bastante sencillos.

    El siguiente conjunto de líneas lee los parámetros para la detección de parpadeo de una hoja de cálculo y luego ejecuta el algoritmo de función paso para encontrar parpadeos que ocurrieron entre -200 y +300 ms. Estas líneas utilizan el mismo “código mágico” que usé para tomar parámetros de hojas de cálculo en los scripts anteriores. No pasé mucho tiempo estableciendo los parámetros de detección de artefactos, podrías hacer un mejor trabajo si pasaras algún tiempo usando las estrategias descritas en el capítulo sobre rechazo de artefactos. Una vez extraídos los parámetros de la hoja de cálculo, se llama a la rutina de detección de artefactos. Luego repetimos este proceso para el movimiento ocular y los artefactos C.R.A.P.

    Cada uno de estos pasos de detección de artefactos se suma a las banderas establecidas por el paso anterior. Al final, guardamos el conjunto de datos en el disco duro. ¡Ya está listo para promediar!

    Después del final del ciclo, agregué algún código para obtener información sobre el número de ensayos que se marcaron para cada participante. El código demuestra cómo guardar esta información en el formato especial Table de Matlab, lo que luego facilita guardar la información como una hoja de cálculo.

    Como de costumbre, el final del script tiene algún código después de la sentencia return que puede usar para cargar los conjuntos de datos en la GUI de EEGLAB.

    ¡Uf! Eso es mucho código. Pero espero que te muestre cómo romper una compleja secuencia de pasos de procesamiento en un conjunto de módulos relativamente simples. Y espero que también demuestre el proceso de ir y venir entre la GUI (para establecer varios parámetros específicos del participante y asegurarse de que los datos se vean bien) y los scripts (que son mucho más rápidos, especialmente cuando se necesita reprocesar los datos varias veces).

    Una última cosa: Una vez que hayas creado un conjunto de scripts que realizan las diferentes etapas de procesamiento para tu experimento, puedes crear un “script maestro” que simplemente llama a los scripts para cada etapa. Entonces puedes ejecutar todas las etapas llamando a este script.


    This page titled 11.16: Ejercicio: construcción de una tubería de procesamiento de EEG completa is shared under a CC BY 4.0 license and was authored, remixed, and/or curated by Steven J Luck directly on the LibreTexts platform.