Es conveniente primero, si no lo han hecho ya, revisar las nociones básicas de tablas de 2 x 2 y el concepto de independencia en las mismas.
Bueno, voy a desarrollar el uso básico de los algoritmos para detección de señales en bases de datos de Eventos Adversos.
Lo primero que necesitamos es tener una tabla con datos para analizar.
Las tablas que se utilizan habitualmente son sumamente extensas y esto hace que
sea difícil manipular los datos de una forma entendible en primera instancia.
Por eso, utilizaré una tabla pequeña con datos ficticios. La tabla puede
descargarse del siguiente link: ListitaEventosDroga.
Descargamos y guardamos la tabla en cualquier carpeta, recordando dónde y vamos a
importarla a R.
La importación y exportación de datos a y desde R es una de las tareas
menos intuitivas en este software, pero con algo de práctica se le toma la
mano.
Para hacerlo, usaremos la instrucción “read.csv”, la cual permite leer
un archivo del tipo “csv” que consta de un archivo de texto común y que tiene
los datos de las columnas separados por algún carácter (generalmente una coma,
por eso “csv” quiere decir “comma separated variable”) y una línea para cada
fila de la tabla.
El método read.csv recibe algunos parámetros. El más importante es el
que indica la ruta del archivo a importar. Aquí, lo más importante es entrecomillar
la ruta del archivo y que, a diferencia de la forma de indicar la ruta en Windows,
se usa el carácter “/” en lugar de “\” para separar los nombres de las
carpetas.
Los otros parámetros que usaremos serán “header = TRUE” que indica que
nuestro archivo tiene los títulos de las columnas, y “sep = “,””, indicando que
el separador de columnas es la coma. Finalmente, hay que saber que
convertiremos la tabla en un objeto que sea manipulable por el nombre del
mismo, asignando la instrucción para importar la tabla a una variable.
La estructura del comando debería seguir este patrón:
variableObjeto = read.csv(“rutaArchivo”, header=TRUE, sep = “,”)
donde “variableObjeto” será reemplazado por el nombre del objeto a
crear (el mismo es totalmente arbitrario y pueden elegir el que quieran,
siempre y cuando lo recuerden para luego poderlo invocar) y “rutaArchivo” por
la ruta para llegar al archivo alojado en el disco. En mi caso la instrucción
será la siguiente:
x1=read.csv("C:/Users/Francisco/Documents/Repositorios/00-PhVid/listitaeventodroga.csv",
header = TRUE, sep = ";")
Ahora podemos visualizar la tabla con solo escribir el
nombre del objeto, como en el siguiente ejemplo:
> x1
Droga Evento n
1 lamotrigina prurito 10
2 omeprazol prurito 1
3 lamotrigina tos 1
4 omeprazol diarrea 1
5 aspirina sialorrea 1
6 ibuprofeno depresion 1
Vemos que R muestra una tabla con 4 columnas. La primera de ellas es
solamente una etiqueta con el número de línea, colocado por R, pero no tiene
ningún valor durante el análisis a realizar. De tal modo, la primer columna útil
es la que indica el nombre de la droga, la siguiente la que indica el evento
ocurrido, y la última indicando el número de reportes para esa combinación
Droga-Evento.
Todas las tablas que tengamos que analizar con el paquete “PhViD”
deberán tener esta estructura, respetando esas 3 columnas. El número de
asociaciones Droga-Evento no tiene limitaciones (a excepción de la memoria del
sistema que estemos usando).
Como se puede ver fácilmente, la relación entre los pares Droga-Evento
se halla intencionalmente exagerada, resaltando la ocurrencia de uno de ellos
(lamotrigina-prurito). Es conveniente repetir que los datos son totalmente
inventados a los fines de este tutorial.
Bueno, como expliqué previamente, al iniciar R se cargan solamente los
paquetes básicos. Para dotar a R de las capacidades que necesitamos hay que cargar
este paquete. Escribimos la siguiente instrucción:
> library(PhViD)
Así el paquete se carga en el espacio de trabajo actual y podemos
utilizar sus métodos para manipular los objetos creados.
Si les llega a dar algún error avisando que no puede instalar "LBE", tipean lo siguiente:
Y luego vuelven a tipear "library(PhViD)". Con eso debería solucionarse.
Si les llega a dar algún error avisando que no puede instalar "LBE", tipean lo siguiente:
source("http://bioconductor.org/biocLite.R")
biocLite("LBE")
Y luego vuelven a tipear "library(PhViD)". Con eso debería solucionarse.
Si bien antes dije que la tabla debe tener una estructura determinada,
PhViD necesita cambiar el formato que le entregamos para realizar el análisis
que queremos. Para esto, tiene el método “as.PhViD”. Como siempre, asignamos el
resultado del método a un nuevo objeto, con la siguiente instrucción:
> l1=as.PhViD(x1)
Ahora el objeto “l1” contiene mis datos en un formato que es analizable
mediante los métodos que aporta PhViD.
Voy a mostrar los pasos usando la metodología usada por el Uppsala Monitoring
Centre, con el algoritmo llamado “Bayes Confidence Propagation Neural Network”
(BCPNN). El método a usar es justamente el “BCPNN”. Los mismos pasos pueden
usarse para aplicar cualquiera de los otros algoritmos disponibles en el
paquete.
Crearemos un objeto usando el método BCPNN. Podemos nombrar al objeto
de cualquier manera, yo lo llamaré “bl1.1”. Para ello simplemente pasamos el
objeto “l1” previamente creado, por el método BCPNN asignándolo a la variable
nueva.
> bl1.1=BCPNN(l1)
El nuevo objeto creado tiene varios miembros capaces de entregarnos los
resultados obtenidos. Si queremos ver los miembros de bl1.1 usamos el método “names”
de la siguiente manera.
> names(bl1.1)
[1] "INPUT.PARAM" "ALLSIGNALS" "SIGNALS" "NB.SIGNALS"
Los miembros que nos interesan son “SIGNALS” y “ALLSIGNALS”, que nos
entregan la lista de pares detectados como señales positivas ordenados por
ranking y la lista ordenada por ranking de los valores obtenidos para todos los
pares, respectivamente.
> bl1.1$SIGNALS
Nos muestra la tabla con las señales positivas:
par
|
drug code
|
event effect
|
count
|
expected count
|
post.H0
|
n11/E
|
drug margin
|
event margin
|
FDR
|
FNR
|
Se
|
Sp
|
lamotrigina
prurito
|
lamotrigina
|
prurito
|
10
|
8.066666667
|
0.180741235
|
1.239669421
|
11
|
11
|
0.180741235
|
0.735913946
|
0.222650697
|
1
|
A su vez:
> bl1.1$ALLSIGNALS
par
|
drug code
|
event effect
|
count
|
expected count
|
post.H0
|
n11/E
|
drug margin
|
event margin
|
FDR
|
FNR
|
Se
|
Sp
|
lamotrigina
prurito
|
lamotrigina
|
prurito
|
10
|
8.066666667
|
0.180741235
|
1.239669421
|
11
|
11
|
0.180741235
|
0.735913946
|
0.222650697
|
1
|
aspirina
sialorrea
|
aspirina
|
sialorrea
|
1
|
0.066666667
|
0.295550161
|
15
|
1
|
1
|
0.238145698
|
0.715077741
|
0.414099668
|
0.922108741
|
ibuprofeno
depresion
|
ibuprofeno
|
depresion
|
1
|
0.066666667
|
0.295550161
|
15
|
1
|
1
|
0.257280519
|
0.718620375
|
0.605548639
|
0.794740052
|
omeprazol
diarrea
|
omeprazol
|
diarrea
|
1
|
0.133333333
|
0.330254358
|
7.5
|
2
|
1
|
0.275523979
|
0.725705643
|
0.787566019
|
0.667371363
|
lamotrigina
tos
|
lamotrigina
|
tos
|
1
|
0.733333333
|
0.541284471
|
1.363636364
|
11
|
1
|
0.328676077
|
0.781665645
|
0.912231554
|
0.525046743
|
omeprazol
prurito
|
omeprazol
|
prurito
|
1
|
1.466666667
|
0.677049884
|
0.681818182
|
2
|
11
|
0.386738379
|
Inf
|
1
|
0.29177773
|
Obviamente todos estos números son difíciles de leer, pero analizaremos
alguna de las columnas y les mostraré, que en el corazón del método residen
mecanismos que ya conocemos.
En primer lugar, la primera columna contiene las etiquetas con los pares combinados. La segunda y tercera columnas son los nombres de las drogas y eventos, respectivamente. La tercera columna es solamente el número de veces en las que aparece esa combinación. Hasta aquí, salvo por el orden, no es más que lo que se hallaba contenido en la tabla original.
La columna “expected count” corresponde a lo que conocemos como “valor esperado” en las tablas de 2 x 2 desarrollado previamente. Para verlo más fácil, construiremos la tabla para el par “lamotrigina prurito”. Necesitamos las marginales y el total general. Sabemos que el total de reportes es de 15. El número de reportes para ese par es de 10. Continuamos colocando el número de reportes que contienen “prurito” y el número de reportes que contienen “lamotrigina”. La tabla quedaría así:
En primer lugar, la primera columna contiene las etiquetas con los pares combinados. La segunda y tercera columnas son los nombres de las drogas y eventos, respectivamente. La tercera columna es solamente el número de veces en las que aparece esa combinación. Hasta aquí, salvo por el orden, no es más que lo que se hallaba contenido en la tabla original.
La columna “expected count” corresponde a lo que conocemos como “valor esperado” en las tablas de 2 x 2 desarrollado previamente. Para verlo más fácil, construiremos la tabla para el par “lamotrigina prurito”. Necesitamos las marginales y el total general. Sabemos que el total de reportes es de 15. El número de reportes para ese par es de 10. Continuamos colocando el número de reportes que contienen “prurito” y el número de reportes que contienen “lamotrigina”. La tabla quedaría así:
lamotrigina
|
||||
si
|
no
|
|||
prurito
|
si
|
10
|
11
|
|
no
|
||||
11
|
15
|
lamotrigina
|
||||
si
|
no
|
|||
prurito
|
si
|
10
|
1
|
11
|
no
|
1
|
3
|
4
|
|
11
|
4
|
15
|
lamotrigina
|
||||
si
|
no
|
|||
prurito
|
si
|
8.06666667
|
2.93333333
|
11
|
no
|
2.93333333
|
1.06666667
|
4
|
|
11
|
4
|
15
|
Chan! Resulta que el valor esperado para la celda correspondiente al par “lamotrigina
prurito” es el mismo que el de la columna “expected count”. Exactamente lo
mismo obtendremos calculando las tablas correspondientes a cada par.
Agregaré que la columna “n11/E” no es nada más que el valor obtenido dividiendo “count” sobre “expected.count”. El resto de las columnas serán analizadas en entregas posteriores.
Agregaré que la columna “n11/E” no es nada más que el valor obtenido dividiendo “count” sobre “expected.count”. El resto de las columnas serán analizadas en entregas posteriores.
Con esto ya podemos usar el paquete PhViD para generación de señales. Claro que otro tema es que hacer luego de tenerlas, ¿no?
Bueno, los que se animen, a probar. Espero sus comentarios.
Mil gracias eres un crack
ResponderEliminar