Veni, ViDi, Vici

October 23, 2011
By

This post was kindly contributed by Farmacovigilancia nerd2!=nerd - go there to comment and to read the full post.


Bueno,luego de realizar una pequeña introducción a las distribuciones de probabilidad, inferencia frecuentista e inferencia Bayesiana,necesarias para comprender lo que sigue, continuaré con el análisis de lasalida del paquete PhViD para detección de señales en farmacovigilancia.

Teníamosnuestro espacio de trabajo cargado con el paquete PhViD y los datos de latablita descargada con datos inventados a los fines de poder trabajar. Si noestá configurado así, repetir los pasos según sugerí en el post anterior.

Ahorabien, había explicado el significado de las columnas “count”, “expected count”,“drug margin”, “event margin” y “n11/E”. Ahora nos adentraremos en la utilidadde las demás.

Enprimer lugar, hablaré un poco del Information Component o “IC”. Como vimosantes, la columna “n11/E” nos entrega la razón entre el valor observado y el esperado. El IC seexpresa como el logaritmo natural del siguiente cociente: la probabilidad deencontrar el evento y la droga asociados, dividida por la multiplicación de laprobabilidad de hallar la droga sola por la probabilidad de hallar el eventosolo. Habitualmente se encuentra notada de la siguiente manera:
 Peropuede encontrarse escrito de otras maneras que tienen el mismo significado. Elmismo puede calcularse también obteniendo el logaritmo natural del valor den11/E, que es equivalente a la expresión entre paréntesis en la ecuaciónanterior.
Eneste cociente, si la ocurrencia observada en forma conjunta es igual a la esperada,el resultado será igual a 1 y su logaritmo igual a 0. Con este resultadoencontraríamos que la asociación entre Droga – Evento no ocurre másfrecuentemente que lo esperable y por lo tanto no se generaría una señal. Porel contrario, si es mayor a 1, tendríamos una posible señal.

Elalgoritmo BCPNN va más allá. Utilizando métodos de inferencia Bayesiana estimaun nuevo valor para el IC, tomando como evidencia para reformularlo, losvalores encontrados en la tabla. Este valor es el valor esperado del IC luegode tomar evidencia que permite estimar su valor “a posteriori”. También estimael sd “a posteriori”. Con estos valores asume (en la función por defecto, peropuede indicarse que lo haga de otra manera) que la distribución de probabilidaddel IC es normal y calcula la probabilidad de obtener un valor igual o menorque 0, que sería el valor obtenido para el IC si no se genera señal alguna. Siesta probabilidad es baja se acepta la hipótesis de que hay asociación entreDroga y Evento. Esta probabilidad esta expresada en la columna postH0.

Sitenemos ganas de ver el corazón del algoritmo, podemos escribir en R:

> BCPNN

Luegode presionar “Enter” aparecerá una ristra de instrucciones que son las que seejecutan cuando llamamos a la función. La verdad es que la mayoría es bastantecríptica para alguien que no se halla acostumbrado a ver este tipo de salidas,pero hay un par de cosas que pueden notarse.
Puedeverse que la función calcula dentro de su operatoria un objeto “EICb” que es lamedia esperada para el IC y supongo que su acrónimo significará algo como “laesperanza del IC luego de aplicar Bayes”. También, a continuación de laanterior se observa un objeto denominado “VICb” que es la varianza del IC. Laraíz cuadrada de la varianza es el sd. Aquí se usa sd como equivalente del seporque estamos estimando una distribución teórica que sería equivalente a la“poblacional”, y en ese caso el sd es usado como el estimador de σ.

También,en ese listado se usa el símbolo “<-” en lugar de“=” para asignar el contenido a un objeto. Hay que saber que el primero es elnativo de R. Yo utilizo “=” por comodidad y para mayor entendimiento, peropuede pasar infrecuentemente que alguna función no arroje nada o nos de errorsi no utilizamos la otra forma.

Lasotras columnas importantes son las denominadas “FDR” y “FNR” que son acrónimosde False Discovery Rate y False Negative Rate. Estos son conceptos introducidospor los autores del paquete y pueden verse desarrollados en los paperspublicados por ellos[1].
Básicamente,los métodos para detección de señales son muy sensibles y tienden a producir ungran número de falsos positivos, entonces se genera una variable que mide laprobabilidad de obtener un falso positivo (FDR) y la de obtener un falsonegativo (FNR).
Sino indicamos nada en contrario el ránking es ordenado según postH0, de menor amayor. Esto puede cambiarse mediante el argumento “RANKSTAT”. Por defecto tomael valor igual a 1 y ordena por postH0. Acepta también el valor 2 y en estecaso, produce un doble efecto: arroja una columna adicional llamada“Q_0.025(log(IC))” que indica el extremo inferior de un intervalo de confianzadel 95% para el IC a posteriori, lo segundo, es que ordena el ránking por esacolumna.
Noobstante el orden, la regla para decidir cuáles son señales y cuáles no, es pordefecto el FDR, con un punto de corte de 0.05.

Haremosahora unas pruebas con el set de datos que viene en el paquete PhViD.
Elset de datos es “PhViDdata.frame”. Lo asignaremos a un objeto que tenga unnombre un poco más manejable, por ejemplo:

> lista=PhViDdata.frame

Ensegundo lugar, convertiremos el objeto “lista” a un objeto en el formato quemaneja el paquete:

> data=as.PhViD(lista)

Ahorausamos “BCPNN” para buscar señales, asignando la salida al objeto “Bdata”:

> Bdata=BCPNN(data)

Porúltimo, asignaremos las señales a el objeto “signals”:

> signals=Bdata$SIGNALS

Ahora,dado que la salida será enorme el objeto signals es muy difícil de visualizaren R, y mostraré algunas funciones para poder enterarnos de lo que contiene. Enprimer lugar la instrucción “head”:

> head(signals)

Nosmuestra el contenido de las 6 primeras filas de la tabla.
Lainstrucción “summary”:

> summary(signals)

Nosmuestra resúmenes de las columnas, cuando son numéricos nos da estadísticosdescriptivos y cuando son categóricos nos muestra las frecuencias deocurrencias de los primeros valores.
Lainstrucción “str”:

> str(signals)

Nosmuestra también los primeros valores pero puestos como líneas. Adicionalmentenos dice si una variable es numérica marcándola como “num” o si es categórica,marcándola como “factor”. Otra información que nos da es la dimensión de latabla, que en este caso es de 19130 líneas x 12 columnas. Esto es bastanteútil, porque el número de líneas de “signals” será igual al número de señalesproducidas. Si hiciéramos lo mismo con el objeto “lista” que contiene la listade pares Droga – Evento:

> str(lista)

Obtenemosque el número total es de 102483. Vale decir, que obtuvimos:

> 19130/102483*100
[1] 18.66651

Un18% de pares con señal positiva. Esto es lo que expresaba antes cuando decíaque estos métodos daban gran cantidad de señales y que la forma de manejarloses tomar las más intensas. Por ello, es importante el ránking ordenado de másintensa a menos intensa.

Podemosabrir una ventana con la tabla para navegarla con:

> View(signals)

Posiblemente,la forma más práctica sea exportar la tabla

> write.table(signals,"C:/PhVid/listaExp.csv",quote=F,row.names=F,sep=";")

Acontinuación, muestro como se genera una lista de señales dándole a “RANKSTAT”el valor de 2, para mostrar cómo se llama la función con este argumento:

> Bdata2=BCPNN(data,RANKSTAT=2)
> signals2=Bdata2$SIGNALS

Sihacemos un “str” de “signals2”, se verá que el número de señales es distinto alanterior. Esto ocurre porque el orden de la lista interviene en la creación dela variable “FDR”, que es la que determina el punto de corte.

Hayotro argumento que es importante y es “MC”. Por defecto su valor es “FALSE”. Siseteamos su valor a “MC=TRUE”, la distribución de probabilidad del IC escalculada por simulación por un método llamado Monte Carlo. Adicionalmente, elargumento “NB.MC” indica el número de simulaciones a realizar. Por defecto es10000.
Sinuestra base es pequeña (y la mayoría los son) conviene usar este argumentopara generar los parámetros calculados con menor error. Si bien el método esmás lento, prioriza la precisión a la velocidad.

Finalmente,quiero decirles que no soy estadístico ni matemático ni informático. Estoyaprendiendo sobre esto casi al mismo tiempo que ustedes.
Lesdigo esto porque me gustaría que vuelquen sus opiniones o inquietudes en loscomentarios al pie de cada post; todos serán bienvenidos. Contestaré todas laspreguntas cuya respuesta sepa, y las que no, buscaremos la forma deaprenderlas.
Muchasgracias y disculpen la demora en postear. Nos vemos.


1.    AhmedI, Thiessard F, Miremont-Salamé G, Bégaud B, Tubert-Bitter P. PharmacovigilanceData Mining With Methods Based on False Discovery Rates: A ComparativeSimulation Study. Clin Pharmacol Ther 2010 Sep;88(4):492-498.

Tags: , ,

Comments are closed.