BrunoProg64 Blog

Proyecto de Tesis de ECG – Parte 1.5

Posted by brunoprog64 en mayo 5, 2010

Saludos de nuevos a mis lectores. Esta parte sigue de la Parte 1, anteriormente publicada y se llama “1.5” porque he de corregir ciertas cosas que no quedaron clara en la misma.

Primero, sobre lo de la presión y que sube y baja en respuesta a emociones. Existe en Medicina el caso de Hipertensión de la Bata Blanca, que es un caso pasajero de hipertensión cuando un paciente está ante su médico, por ansiedad. La existencia del síndrome confirma parcialmente mi teoría de que la subida de tensión es provocada por razones emocionales. Sin embargo no he encontrado nada que diga exactamente que la ansiedad sube la tensión y el miedo la reduce. Es dependiente de cada persona… por lo que me corrijo de los párrafos del primer artículo. No necesariamente la tensión sube o baja de acuerdo a ansiedad y miedo. Y dado que no pienso hacer el medidor de tensión en mi monitor ECG de momento, lo retiro de mi proyecto oficial.

De nuevo, estos post no son necesariamente lo que diré ante los jurados, porque quiero acercar a mis lectores al tema de hacer una Tesis, sin ser tan formales, que a mi parecer es el grave problema que padecen los centros de enseñanza. Pero volvamos al tema, no nos desviemos.

He decidido complicarme un poco la vida… y he vuelto con una novedad. Recuerdan que dije en el otro post que aVF, aVL y aVR, son derivaciones que se pueden calcular ya que el Triángulo de Einthoven cumple las Leyes de Kirchhoff. Einthoven promulgó una Ley, llamada la Ley de Einthoven, que nos dice que la suma de las Derivaciones I y III da igual a la Derivación II. Si esto no fuera así, los electrodos están mal colocados. Normalmente los ECGs comerciales calculan la Derivación II como es normal, pero ya hemos dicho que nuestro gran problema en mi caso es que sólo disponemos de una entrada de audio con dos canales. Pues sólo usaremos dos derivaciones: I y III y calcularemos la II por la Ley de Einthoven. La denoto mejor:

II Derivacion = I Derivacion + III Derivación

Naturalmente podemos despejar la ecuación para obtener la I o la III Derivación, de modo que tengamos que poner el menor número de electrodos posibles. Dirán algunos que esto disminuye la exactitud del ECG… es cierto. No es lo mismo una Derivación sacada por matemáticas, que la Derivación sacada por sensores. Pero… no todo es lo que parece. Más adelante lo explicaré.

Volviendo a Einthoven… él no es el descubridor de las derivaciones aVR, aVL, aVF. Su descubridor es Frank Norman Wilson. En realidad, estas derivaciones se ubican en las mismas posiciones que las Derivaciones I, II y III, sólo que Wilson analizó la Ley de Einthoven y vio que combinando dos polos negativos, realzaba la actividad eléctrica que no se nota en las Derivaciones I, II y III.

Fórmulas de ECG de Wilson

Fórmulas de ECG de Wilson

¡¡Esto es fantástico!! En serio… lo es… significa que nuevamente usando las Leyes de Kirchhoff podemos obtener más derivaciones, en este caso la aVR, aVL y la aVF. ¿Y eso que quiere decir? Que si bien necesitamos 4 a 6 electrodos para recoger la señal… en la teoría nos basta con sólo 2 señales. I y II o I y III. Luego de acuerdo a la Ley de Einthoven y a las Fórmulas de Wilson, podemos obtener la derivación que falta. Luego podemos usar esa derivación faltante, para calcular las 3 extras. El resultado es que nuestro equipo es más fácil de conducir y sólo hace falta un cable de micrófono para introducir la señal. El resto es cosa de matemáticas.

De nuevo, me dirá alguno que no es lo mismo calcularlas que estimarlas. Insisto con que mi Proyecto de Tesis no se trata de construir un ECG 100% fiable que pase todas las pruebas que se exigen a estos equipos, sino que se trata de construir un equipo capaz de ayudar al especialista y que al ser más software que Hardware, pueda ser utilizado en cualquier PC con una tarjeta de sonido. Con eso a mí me basta. Dejémosle los ECG precisos al milímetro a Philips, a Siemens y demás fabricantes de equipo biomédico.

Naturalmente, no estoy considerando las derivaciones V1, V2, V3, V4, V5 y V6. No las consideraremos de momento. No hasta que tenga más literatura sobre ECG que pueda leer. De nuevo agradezco a Google Books.

Seguimos entonces. Como ya hemos dicho, tenemos que demostrar que efectivamente hacer lo que dice la teoría sea verdad… podamos derivar 6 derivaciones de sólo 2. Entonces, tenemos que buscar algún ECG hecho y derecho con todas sus derivaciones, tomar dos y tratar de crear las demás desde ellas. Esto parece un trabajo para… PhysioBank, una gran colección de base de datos de señales biomédicas para investigación y desarrollo de Software Libre.

Usaremos la base de datos llamada PTB Diagnostic DataBase, una base de datos de ECGs de 12 derivaciones, cortesía del Physikalisch-Technische Bundesanstalt (PTB) (Instituto Nacional de Metrología Alemán) y del Dr. Michael Oeff de la Clínica Universitaria Benjamín Franklin, en Berlín. Nos descargamos la versión en .mat o .csv de un paciente usando la interfaz de ATM de PhysioBank. El archivo debe incluir información de las 12 derivaciones y de dos detalles más, que no nos interesan a nosotros de momento.

Ejemplo de ECG de la PTB Database

Ejemplo de ECG de la PTB Database

De cualquier modo, usando la interfaz ATM de PhysioBank podemos ver las señales y separarlas. De esa interfaz podremos bajar un máximo de 10 segundos de datos de ECG. Si queremos más, bajaremos el archivo .dat que corresponden a esa lectura, pero de momento sólo queremos demostrar algo, así que no es realmente necesario. Con los 10 segundos bastan.

¿Y ahora con qué analizamos el .mat que nos acabamos de bajar? Esto es un trabajo… para Matlab. También podemos usar GNU Octave, pero en la Universidad, lo que tengo más a la mano es Matlab. Es una pena que la Universidad use más software propietario, aunque reconozco que Matlab es una herramienta muy, pero muy poderosa.

¿Qué es una señal? Para la máquina es un conjunto de valores expresados en un arreglo a lo largo del tiempo. Para los cables, naturalmente es un flujo de electrones que siguen cierto patrón. Pero quedémonos con la aproximación de un arreglo. ¿Qué podemos hacer con un arregl0? Sumarlo, restarlo, dividirlo, multiplicarlo, etc. Son números… podemos hacer todo cuanto queramos. Por ejemplo, aplicar la Ley de Einthoven y las Fórmulas de Wilson.

¿Y cómo sabemos si está bien? ¿Cómo sabemos si la señal reconstruida es equivalente a las que captó el equipo de ECG? Porque si no se parecen en nada, es mejor no usarlas, ya que podríamos hacerle problema al experto en vez de ayudalro. Para eso, es hora de buscar los libros de la Escuela Pre Universitaria y recordar un concepto… Desviación Estándar.

¿Y qué es la Desviación Estándar? Es básicamente la distancia promedio que hay entre todos los valores de un grupo de datos con su media aritmética. El asunto es que la Desviación Estándar se usa como medida de incertidumbre. Si tenemos dos grupo de datos y su desviación estándar es muy similar, podemos decir que estos datos son lo más cercanos posibles. Una diferencia entre la desviación estándar de dos grupos de datos que sea demasiado grande nos hará ver que esos valores son muy distintos y no pueden ser equivalentes ni similares. El plan es comparar los grupos de datos generados por algoritmos y los originales del ECG de ejemplo para ver si hay grandes diferencias en su desviación estándar. Si las hay… sabremos que esto de derivar todas las derivaciones es una mala idea.

(Actualización 02 – 06 – 2010: Lamentablemente la Desviación Estándar no es la mejor forma de ver si dos señales son muy similares. Mis asesores me recomendaron algo más exacto como la Prueba T Student, ya que la Desviación Estándar puede identificar como “similares” datos muy abismales si su diferencia entre sus propios elementos  similar.)

Bueno, primero nos bajamos el archivo .mat de uno de los ejemplos de la PTB Database. En mi caso, he bajado el archivo que dice ‘ptbdb/patient001/s0010_re.mat’. Pueden ubicarlo en la interfaz de ATM, ya que PhysioBank no permite el enlace directo.

Bueno, según el sitio de la PTB Database, estos son los detalles técnicos que hay que conocer:

  • 15 canales de datos (12 del ECG y los otros tres de ECG adicional, pero referente a V1, V2, V3, V4 y V6)
  • Frecuencia de muestreo de 1 Khz  (1000 Hz), lo que indica una sensibilidad de 0.001 segundos.
  • Resolución de 16 bits.

Bueno, el orden de las derivaciones en el archivo es: I, II, III, aVR, aVL, aVF, V1, V2, V3, V4, V5, V6, VX, VY y VZ. Los últimos 3 corresponden a algo llamado “Frank Leads ECG”, pero no he encontrado nada especial, así que supongo que serán derivaciones experimentales. No las consideraremos en nuestro trabajo al igual que de momento las 6 derivaciones V1, V2, V3, V4, V5 y V6.

Entonces en Matlab, cargamos el archivo .mat usando la sentencia ‘load‘. Dado que este no es un curso de Matlab, les copio y pego el código que use:

%%cargamos el archivo ecg_raw.mat
load 'ecg_raw.mat'
ecg_raw = val;
clear val;

%el archivo tiene las derivaciones en orden: i, ii, iii, avr, avl, avf,
%v1, v2, v3, v4, v5, v6

der1 = ecg_raw(1,:);
der2 = ecg_raw(2,:);
der3 = ecg_raw(3,:);

%ya tenemos las tres derivaciones, comprobamos si el ECG esta en orden....

der2_tmp = der1 + der3;

if (abs(std(der2) - std(der2_tmp)) < 1.0) %%Si el error es mas de 1.0 es que no coinciden
  disp('El ECG se conecto sin errores')
else
  disp('El ECG tiene errores')
end

disp(['Dev Est II: ', num2str(std(der2))]);
disp(['Dev Est IIa: ', num2str(std(der2_tmp))])
efact = std(der2) - std(der2_tmp);
efact = abs(efact);

%% efact * std(der2) / 100 -> porcentaje error
perr = (efact * std(der2)) / 100;
disp(['Porcentaje de error:', num2str(perr), '%']);

Bueno, hasta aquí hemos recogido en variables las derivaciones I, II y III. Acto seguido hemos calculado la Derivacion II usando la Ley de Einthoven y hemos calculado la derivación estándar de la Derivación II original y la Derivación II algorítmica. Acto seguido, tomo la derivación estándar de ambas y las resto, la Derivación II contra la II algoritmica. Luego, saco un porcentaje de ese numero con respecto a la Desviación Estándar de la Derivación II original. En mi caso, el resultado mostrado es el siguiente:

El ECG se conecto sin errores
Dev Est II: 255.6288
Dev Est IIa: 255.6361
Porcentaje de error:0.018641%

Tenemos un porcentaje de error de 0.018641% con respecto a la Derivación II original. Es decir… el error no es nisiquiera del 1%. Es suficiente para nuestros propósitos. Si queremos verlo, sencillamente escribiremos: ‘plot(der2)’ y luego ‘plot(der2_tmp)’, para ver la Derivación II original y algorítmica. Se deberían notar igual.

(Actualización 02 – 06 – 2010: La Desviación Estándar no es la forma correcta de hacer esta medición. Se usa la Prueba T Student. Colgaré otro post a la brevedad con las correcciones del caso)

Ya hemos visto que la Ley de Einthoven se cumple. Ahora, vamos por las derivaciones auxiliares: aVR, aVF y aVL. Pero antes, verán que hay un condicional que dice que el ECG se conectó sin errores. Es que la Ley de Einthoven se usa para autodiagnóstico. El equipo de ECG puede decirnos si los electrodos están bien colocados si se cumple. Así que es posible que al final, leamos las 3 derivaciones, porque si no, no podremos saber si las tomas se han colocado como debe de ser. Este requerimiento dependerá de mi asesor de Tesis, no de mí.

Ahora sí, veamos las otras derivaciones:

avr_a = ((der1 + der2) / 2) * -1;
avf_a = der2 - (der1 / 2);
avl_a = der1 - (der2 / 2);
%calculamos la deriv. estandar y comprobamos contra las oficiales
avr = ecg_raw(4,:);
avl = ecg_raw(5,:);
avf = ecg_raw(6,:);
disp(['Dev Est aVR: ', num2str(std(avr))]);
disp(['Dev Est aVRa: ', num2str(std(avr_a))])
disp(['Dev Est aVL: ', num2str(std(avl))]);
disp(['Dev Est aVLa: ', num2str(std(avl_a))])
disp(['Dev Est aVF: ', num2str(std(avf))]);
disp(['Dev Est aVFa: ', num2str(std(avf_a))])

Aqui no hay nada que decir, salvo que calculamos las derivaciones aVR, aVF y aVL. Y mostramos la derivación estándar de cada una, tanto la original que viene con el ECG y la algorítmica. En mi caso, esto es lo que muestra el Matlab:

Dev Est aVR: 185.701
Dev Est aVRa: 185.7917
Dev Est aVL: 306.3242
Dev Est aVLa: 306.3249
Dev Est aVF: 293.1127
Dev Est aVFa: 293.1097

Decir que la ‘a’ minúscula al final de las derivaciones indica que es la calculada algorítmicamente. Como podemos ver, la diferencia entre desviaciones estándar es por centésimas. Es decir, el error es menor del 1%. Suficiente para propósitos académicos. Para propósitos médicos cre0 que no se hace tan a la ligera. Otra cosa que deberé debatir con mi asesor… pero de momento, estamos bien, matemáticamente hablando, claro.

Naturalmente, para los fans de GNU Octave esto se puede hacer en Octave igual. Lamentablemente la Universidad tiene Matlab y esto lo hago en horas de clases. Así que futuros artículos seguirán con Matlab. Cuando encuentre un tiempo tal vez lo pase a Scilab, Octave o Python inclusive. De momento por tiempo, a mi me importa prototipar enseguida, y Matlab hace muy buen trabajo en estos casos.

Finalmente decir que no soy perfecto y que mi formación matemática no es la mejor de todas, así que si cometo un error o algo, me gustaría que me lo digan para corregirme. Este Proyecto de Tesis es para todos los lectores y tengo la intención de hacerlo público, incluído el software. Pero para eso, necesito su apoyo y su feedback para corregir alguno que otro error. Seguiremos aquí después de que exponga el primer avance de Tesis I.

Anuncios

Sorry, the comment form is closed at this time.

 
A %d blogueros les gusta esto: