Saltar al contenido principal

# 11.14: Ejercicio- Mejorando el Guión de Referenciación

$$\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}}$$

$$\newcommand{\vectorA}[1]{\vec{#1}} % arrow$$

$$\newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow$$

$$\newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vectorC}[1]{\textbf{#1}}$$

$$\newcommand{\vectorD}[1]{\overrightarrow{#1}}$$

$$\newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}}$$

$$\newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}}$$

$$\newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} }$$

$$\newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}}$$

$$\newcommand{\avec}{\mathbf a}$$ $$\newcommand{\bvec}{\mathbf b}$$ $$\newcommand{\cvec}{\mathbf c}$$ $$\newcommand{\dvec}{\mathbf d}$$ $$\newcommand{\dtil}{\widetilde{\mathbf d}}$$ $$\newcommand{\evec}{\mathbf e}$$ $$\newcommand{\fvec}{\mathbf f}$$ $$\newcommand{\nvec}{\mathbf n}$$ $$\newcommand{\pvec}{\mathbf p}$$ $$\newcommand{\qvec}{\mathbf q}$$ $$\newcommand{\svec}{\mathbf s}$$ $$\newcommand{\tvec}{\mathbf t}$$ $$\newcommand{\uvec}{\mathbf u}$$ $$\newcommand{\vvec}{\mathbf v}$$ $$\newcommand{\wvec}{\mathbf w}$$ $$\newcommand{\xvec}{\mathbf x}$$ $$\newcommand{\yvec}{\mathbf y}$$ $$\newcommand{\zvec}{\mathbf z}$$ $$\newcommand{\rvec}{\mathbf r}$$ $$\newcommand{\mvec}{\mathbf m}$$ $$\newcommand{\zerovec}{\mathbf 0}$$ $$\newcommand{\onevec}{\mathbf 1}$$ $$\newcommand{\real}{\mathbb R}$$ $$\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}$$ $$\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}$$ $$\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}$$ $$\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}$$ $$\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}$$ $$\newcommand{\laspan}[1]{\text{Span}\{#1\}}$$ $$\newcommand{\bcal}{\cal B}$$ $$\newcommand{\ccal}{\cal C}$$ $$\newcommand{\scal}{\cal S}$$ $$\newcommand{\wcal}{\cal W}$$ $$\newcommand{\ecal}{\cal E}$$ $$\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}$$ $$\newcommand{\gray}[1]{\color{gray}{#1}}$$ $$\newcommand{\lgray}[1]{\color{lightgray}{#1}}$$ $$\newcommand{\rank}{\operatorname{rank}}$$ $$\newcommand{\row}{\text{Row}}$$ $$\newcommand{\col}{\text{Col}}$$ $$\renewcommand{\row}{\text{Row}}$$ $$\newcommand{\nul}{\text{Nul}}$$ $$\newcommand{\var}{\text{Var}}$$ $$\newcommand{\corr}{\text{corr}}$$ $$\newcommand{\len}[1]{\left|#1\right|}$$ $$\newcommand{\bbar}{\overline{\bvec}}$$ $$\newcommand{\bhat}{\widehat{\bvec}}$$ $$\newcommand{\bperp}{\bvec^\perp}$$ $$\newcommand{\xhat}{\widehat{\xvec}}$$ $$\newcommand{\vhat}{\widehat{\vvec}}$$ $$\newcommand{\uhat}{\widehat{\uvec}}$$ $$\newcommand{\what}{\widehat{\wvec}}$$ $$\newcommand{\Sighat}{\widehat{\Sigma}}$$ $$\newcommand{\lt}{<}$$ $$\newcommand{\gt}{>}$$ $$\newcommand{\amp}{&}$$ $$\definecolor{fillinmathshade}{gray}{0.9}$$

En este ejercicio, vamos a hacer algunas mejoras en el script del ejercicio anterior, incluyendo definir una variable para el nombre del archivo de ecuaciones y guardar el conjunto de datos en tu disco duro.

Asegúrese de que MyScript4.m siga abierto. Al final del conjunto de líneas que definen las otras carpetas y nombres de archivo, agregue esta línea:

ecuaciones_nombre_archivo = [DIR 'equations.txt'];

Esa línea creará una variable que contenga la ruta y el nombre de archivo del archivo con las ecuaciones. Es muy fácil cometer un error cuando creas una variable como esta. De hecho, inicialmente cometí un error cuando escribí esa línea de código. Cuando creas una nueva variable para una ruta y un nombre de archivo, debes verificarla primero antes de ejecutar tu script. Para ello, ejecuta esa línea de código. (La variable DIR ya debería establecerse a partir del momento en que ejecutó el script anteriormente). Luego, escriba dir (equations_filename) en la línea de comandos. El comando dir enumera cualquier archivo que coincida con la variable que especifique dentro de los paréntesis. Cuando ejecute este comando, debería recibir un mensaje de error diciendo que no se encuentra el archivo.

Ahora escriba equations_filename en la línea de comandos para ver el valor de esta variable. ¿Ves el problema? Nos falta la diagonal entre la ruta y el nombre del archivo (o una diagonal en una computadora con Windows; vea el cuadro de texto a continuación). Solucione esto cambiando el código a:

ecuaciones_nombre_archivo = [DIR '/equations.txt'];

Ahora ejecuta esa línea de código y luego el comando dir (equations_filename). Si Equations_filename está configurado correctamente, el comando dir debería simplemente imprimir el nombre del archivo (equations.txt).

Ahora reemplace la cadena que contiene la ruta y el nombre de archivo en el comando pop_eegchanoperator con equations_filename para que el comando se vea así:

EEG = pop_eegchanoperator (EEG, Equations_filename, 'ErrorMsg', 'popup', 'KeepChloc', 'on', 'Warning', 'on');

Salga de EEGLAB, escriba clear all y luego guarde y ejecute el script actualizado. Debería llevar al mismo resultado que la versión anterior del script que no usaba la variable equations_filename, pero el script ahora es más robusto.

Windows usa una diagonal (\) para separar los elementos de una ruta, mientras que Mac OS, UNIX y Linux usan una diagonal hacia adelante (/). Matlab es lo suficientemente inteligente como para convertirlo al separador apropiado para su computadora. Sin embargo, realmente no confío en él, así que me gusta usar un enfoque más explícito usando una función de Matlab llamada filesep. Esta función devuelve el separador de archivos apropiado para el equipo en el que se ejecuta el script. Por ejemplo, definiría la variable para el archivo de ecuaciones como [DIR filesep 'equations.txt'] en lugar de [DIR '/equations.txt'] o [DIR '\ equations.txt']. Si escribe filesep en la línea de comandos, verá que devuelve '/' si está ejecutando Mac OS, UNIX o Linux y '\' si está ejecutando Windows.

Hagamos un par de mejoras más. Primero, cuando se está ejecutando un script, no suele querer que aparezcan mensajes de error y advertencia como ventanas nuevas que esperan a que responda. Si estás ejecutando un guión durante la noche porque lleva mucho tiempo, no quieres que el guión esté esperando una respuesta a un mensaje de advertencia cuando llegues a la mañana siguiente. Entonces, cambiemos los parámetros 'ErrorMsg', 'popup' en la función pop_eegchanoperator () a 'ErrorMsg', 'cw' para que los mensajes de error se impriman en la Ventana de Comandos y cambiemos 'Warning', 'on' a 'Warning', 'off' para que los mensajes de advertencia no sean impreso. (Pero tenga en cuenta que los mensajes de error seguirán siendo impresos.)

Ahora hagamos algunos cambios que tendrán un impacto más directo. Primero, vamos a agregar _ref al final del nombre del conjunto de datos para indicar que ahora se ha referenciado a los datos. Escriba eeg.setName en la línea de comandos para que pueda ver cuál es el setname actual. Si Subject 10 es el conjunto de datos activo, debería ver que el setname es '10_N170'. Para actualizar el setname, agrega la siguiente línea a tu script después de la línea con el comando pop_eegchanoperator:

eeg.setName = [eeg.setName '_ref'];

Esto toma el setname actual y agrega _ref al final, almacenando el resultado en la variable eeg.setName. ¡Eso fue bastante fácil! Tenga en cuenta que esto es justo antes de la línea con el comando eeg_store, por lo que el nuevo setname se almacenará en ALLEEG y por lo tanto aparecerá en el menú Datasets una vez que lleguemos al comando eeglab redraw. Esta línea de código viola mi regla sobre el uso de variables para definir valores, porque no definí una variable para '_ref'. Las reglas están hechas para romperse, pero sólo cuando hay una buena razón. En este caso, la cadena '_ref' es algo que siempre uso, por lo que es poco probable que ponerlo en el cuerpo del script cause problemas más adelante.

Ahora agreguemos algún código para guardar el conjunto de datos referenciado en su disco duro, en la misma carpeta que el conjunto de datos original. Primero debe usar la GUI para guardar el conjunto de datos actual en su disco duro para que pueda usar el historial para ver el comando para guardar un archivo de conjunto de datos. Seleccione EEGLAB > Archivo > Guardar dataset actual como y use tmp.set como nombre de archivo (en la carpeta Chapter_11). Debido a que estás ejecutando esta rutina para ver el historial, en realidad no necesitas el archivo, y este nombre de archivo te ayudará a recordar que es un archivo temporal que puedes eliminar en algún momento. Ahora escribe eegh para ver la historia. Deberías ver algo como esto:

EEG = pop_saveset (EEG, 'nombre de archivo', 'tmp.set', 'ruta de archivo', '/Usuarios/Luck/ch_10_scripting/ejercicios/');

Copia esa línea desde la Ventana de Comandos y pégala en tu script después de la línea con el comando eeg_store. Pero queremos hacer algunos cambios antes de usarlo. Primero, no queremos que el archivo se llame tmp.set. Me gusta que el nombre de archivo sea el mismo que el setname, pero con .set al final. Para lograrlo, cambie la nueva línea de código reemplazando 'tmp.set' por [eeg.setName '.set'] (que crea una cadena con el nombre de conjunto seguido de .set).

También queremos cambiar la ruta para que utilice la variable subject_dir que creamos previamente para contener la ruta de los datos de este sujeto. Para ello, reemplace la cadena que actualmente enumera la ruta (que es '/Users/Luck/ch_10_scripting/ejercices/' en mi computadora pero será otra cosa en su computadora) a Subject_dir. Esta línea de código ahora debería verse así:

EEG = pop_saveset (EEG, 'nombre de archivo', [eeg.setName '.set'], 'filepath', subject_dir);

Antes de ejecutar el código, quiero mostrarte un pequeño truco más para lidiar con errores y otro tipo de errores. Probablemente cometí un error al menos el 50% de las veces cuando agregué código a uno de los guiones de este libro. Si tienes un script que recorre los datos de 40 participantes, puede ser realmente molesto que el script muestre un mensaje de error 40 veces antes de que termine. Por lo general, puede escribir Ctrl-c para detener el código después del primer error, pero eso no siempre funciona. Entonces, la primera vez que pruebo un nuevo guión, solo lo intento con los datos del primer participante. Lo hago siguiendo la línea que define los ID de asunto con otra línea que enumera solo el primer ID de asunto. Por ejemplo, cerca de la parte superior de MyScript4.m, tengo estas dos líneas:

SUB = [1 2 3 5 6 7 8 9 10]; %Matriz de números de sujetos

%SUB = [1]; %Sólo el primer tema

La primera vez que ejecuto el script después de hacer un cambio, simplemente elimino el símbolo% en la segunda de las dos líneas. Esto sobrescribe el contenido original de SUB y lo reemplaza con solo el ID para Subject 1, y el loop se ejecuta solo para este tema. Una vez que consiga que el guión funcione para ese sujeto, luego vuelvo a poner el símbolo% y vuelvo a ejecutar el script.

Para ver esto en acción, agrega la línea con SUB = [1]; (sin el símbolo%). Ahora puede ejecutar la nueva versión del script que cambia el nombre de conjunto y guarda el conjunto de datos como un archivo. Si obtienes un error, o parece que no funciona correctamente, puedes solucionarlo e intentarlo de nuevo. Una vez que consigas que el script funcione sin ningún problema, puedes comentar esa línea (es decir, agregar el símbolo%) y volver a ejecutar el script para procesar todos los temas.

Ahora tiene un script robusto y bien diseñado que carga los conjuntos de datos, hace referencia a los datos, guarda los datos referenciados en su disco duro y hace que los conjuntos de datos estén disponibles en la GUI de EEGLAB. Ya puedes abrir Script4b.m para ver mi versión de este script. Tiene comentarios que explican cada línea de código.

Script4b.m también usa una versión ligeramente diferente del archivo de ecuaciones, llamada Reference_Equations.txt, que reordena los canales además de referenciarlos. El orden de los canales en los archivos de datos originales refleja el orden de los electrodos en el sistema de grabación BioSemi que utilizamos para recopilar los datos. Este pedido es conveniente para el proceso de colocación de los electrodos en la cabeza, pero no para ver los datos. Reordené los canales para que estén en conjuntos que van de izquierda a derecha para una línea dada de electrodos (por ejemplo, F7, F3, Fz, F4, F8 para los canales Frontales).

This page titled 11.14: Ejercicio- Mejorando el Guión de Referenciación 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.