meta.analisis.fnc

Objetivo

A partir de la librería metafor se lleva a cabo análisis de efectividad de "principios activos" o terapias publicadas en la bibliografía (meta-análisis).

En el momento actual la función meta.analisis.fnc lleva a cabo dos tipos fundamentales de meta-análisis: Los de análisis de riesgo relativo, odd ratios y diferencias de riesgo por un lado y los de diferencias de medias para casos grupo-control.

Riesgo Relativo, Odd Ratio, etc

Partiremos de la base de datos dat.bcg con los datos de 13 estudios donde se valora la eficacia terapéutica de una vacuna contra la tuberculosis.

head(dat.bcg)

trial author year tpos tneg cpos cneg ablat alloc

1 1 Aronson 1948 4 119 11 128 44 random

2 2 Ferguson & Simes 1949 6 300 29 274 55 random

3 3 Rosenthal et al 1960 3 228 11 209 42 random

4 4 Hart & Sutherland 1977 62 13536 248 12619 52 random

5 5 Frimodt-Moller et al 1973 33 5036 47 5761 13 alternate

6 6 Stein & Aronson 1953 180 1361 372 1079 44 alternate

La función requiere obligatoriamente de la existencia de las variables author y year. Tal y como puedes ver en la cabecera de los datos, para cada estudio tenemos los valores que presentamos en la siguiente tabla:

meta.analisis.fnc(dat.bcg, medida='rr', tpos='tpos', tneg='tneg',

cpos='cpos', cneg='cneg')

O utilizando los números de columna de las variables:

meta.analisis.fnc(dat.bcg, medida='rr', tpos=4, tneg=5, cpos=6, cneg=7)

La medida de resultado que queremos investigar es el Riesgo relativo (medida='rr'). Podríamos haber indicado la Odd ratio (or) o quizás la diferencia de riesgos (dr).


Se usa: Conducting meta-analyses in {R} with the {metafor} package by Wolfgang Viechtbauer

#------------------------------------------------------------------

# META-ANALISIS DE RR

#------------------------------------------------------------------

$Estimado

Random-Effects Model (k = 13; tau^2 estimator: REML)

tau^2 (estimated amount of total heterogeneity): 0.3132 (SE = 0.1664)

tau (square root of estimated tau^2 value): 0.5597

I^2 (total heterogeneity / total variability): 92.22%

H^2 (total variability / sampling variability): 12.86


Test for Heterogeneity:

Q(df = 12) = 152.2330, p-val < .0001


Model Results:

estimate se zval pval ci.lb ci.ub

-0.7145 0.1798 -3.9744 <.0001 -1.0669 -0.3622 ***

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Por defecto se generará un gráfico forest, que puede ser manipulado por el usaurio modificando tres argumentos: xlim, size.fon1 y size.fon2. El argumento xlim=c(-16,6) por defecto, size.font1=0.75 (tamaño de letra del cuerpo de gráfico) y size.font2=0.70 (tamaño de letra de cabeceras).

El usuario puede a su ver incluir los argumento to.pdf=T (F por defecto) o to.tiff=T (F por defecto) si desea guardar las gráficas en el directorio de trabajo en formato pdf o tiff.

Podemos incluir el argumento que.factor con el nombre del factor de la base de datos sobre el que queremos estudiar el forest plot para cada nivel de dicho factor.

meta.analisis.fnc(dat.bcg, medida = "rr", tpos=4, tneg=5, cpos=6, cneg=7,

exponencial = T, que.factor='alloc')

Obtenemos el forest plot con los valores tipificados de riesgo relativo tanto para los datos globales como para cada nivel del factor alloc: systemic, random y alternate.

Podemos incluir modelos predictivos de la heterogeneidad mediante la inclusión del argumento moderadoras.


meta.analisis.fnc(dat.bcg, medida = "rr", moderadoras='ablat*alloc',

tpos='tpos', tneg='tneg', cpos='cpos', cneg='cneg', to.tiff=T,

xlim=c(-20,10), size.font1=0.65, size.font2=0.60)

Incluimos la interacción de las variables ablat*alloc para modelar la heterogeneidad entre los estudios.


#--------------------------------------------------------------------------------

# META-ANALISIS DE RR

#--------------------------------------------------------------------------------

$Estimado


Mixed-Effects Model (k = 13; tau^2 estimator: REML)


tau^2 (estimated amount of residual heterogeneity): 0.2465 (SE = 0.2085)

tau (square root of estimated tau^2 value): 0.4965

I^2 (residual heterogeneity / unaccounted variability): 70.49%

H^2 (unaccounted variability / sampling variability): 3.39

R^2 (amount of heterogeneity accounted for): 21.30%


Test for Residual Heterogeneity:

QE(df = 7) = 20.7809, p-val = 0.0041


Test of Moderators (coefficients 2:6):

F(df1 = 5, df2 = 7) = 1.5098, p-val = 0.2988


Model Results:

estimate se tval pval ci.lb ci.ub

intrcpt 0.0209 0.7991 0.0261 0.9799 -1.8686 1.9103

ablat -0.0183 0.0238 -0.7694 0.4668 -0.0747 0.0380

allocrandom 0.0068 0.9645 0.0071 0.9946 -2.2738 2.2874

allocsystematic 0.4711 1.2654 0.3722 0.7207 -2.5212 3.4633

ablat:allocrandom -0.0098 0.0278 -0.3534 0.7342 -0.0755 0.0558

ablat:allocsystematic -0.0125 0.0389 -0.3208 0.7578 -0.1046 0.0796


---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Vemos que efectivamente la variable ablat resulta significativa en la reducción de la heterogeneidad. El peso Beta -0.0183 nos indica que por cada unidad de incremento de la latitud (ablat, lejanía del ecuador), disminuye significativamente el riesgo de contraer la enfermedad en 0.018 o lo que es lo mismo se incrementa la efectividad de la vacunación (en el grupo vacunado).

Diferencia de medias Caso-Control

En los casos de diferencias de medias Caso-Control, deseamos poner a prueba la eficacia terapéutica de un tratamiento donde disponemos de las medias, desviaciones típicas y n de los dos grupos en comparación (Tratamiento vs Control). Utilizaremos la base de datos dat.normand1999 disponible en la librería metafor.


head(dat.normand1999)

study source n1i m1i sd1i n2i m2i sd2i

1 1 Edinburgh 155 55 47 156 75 64

2 2 Orpington-Mild 31 27 7 32 29 4

3 3 Orpington-Moderate 75 64 17 71 119 29

4 4 Orpington-Severe 18 66 20 18 137 48

5 5 Montreal-Home 8 14 8 13 18 11

6 6 Montreal-Transfer 57 19 7 52 18 4

Para la comparación de medias necesitaremos las medias, desviaciones típicas y tamaños de los grupos (tratado y control).


study study number

source Source of data

n1i number of patients under specialized care

m1i mean length of stay (in days) under specialized care

sd1i standard deviation of the length of stay under specialized care

n2i number of patients under routine care

m2i mean length of stay (in days) under routine care

sd2i standard deviation of the length of stay under routine care

La función requiere de la existencia de dos variables que no se encuentran en esta base de datos: author y year, relativos al los autores de la investigación y el año de la misma. Cambiaremos el nombre original de source a author y crearemos una nueva variable year (todos con el mismo valor, por ejemplo 2000).


names(dat.normand1999)[2]='author'

dat.normand1999$year=2000

meta.analisis.fnc(dat.normand1999, medida='dmt',

mgt = 'm1i', mgc='m2i',

ngt='n1i', ngc='n2i',

dtt='sd1i', dtc='sd2i')

Dado que deseamos valorar la eficacia a partir de las diferencias de las medias standarizadas, solicitamos dmt como medida (outcome a evaluar). Podemos incluir como medida el valor dm (diferencia de medias).

Los argumentos necesarios son: mgt (media del grupo tratado) mgc (media del grupo control), ngt (participantes grupo tratado), ngc (participantes grupo control), dtt (desviación típica grupo tratado) y dtc (sd grupo control).

En la figura de la derecha, vemos que el gráfico generado por defecto, presenta algunos intervalos de confianza sobre los valores de riesgo relativo de cada estudio. Para evitarlo podemos modificar el argumento xlim cambiando sus valores por defecto (c(-16,6) a unos nuevos xlim=c(-18,10) (figura de la derecha).

Cambio Antes-Después

El tercer tipo de meta-análisis que puede realizarse con la función meta.analisis.fnc es del tipo diferencia de medias entre dos medidas repetidas (diseños antes-después). Un problema importante para llevar a cabo este tipo de análisis es que no suele publicarse la correlación de pearson entre las dos medidas repetidas. Esta información es fundamental para poder llevar a cabo el meta-análisis en este tipo de diseños.

Utilizaremos un ejemplo extraído de Morris (2008).

datos = data.frame(

author=c('a','b','c','d','e'),

year=seq(2012,2016,1),

m_pre = c(30.6, 23.5, 0.5, 53.4, 35.6),

m_post = c(38.5, 26.8, 0.7, 75.9, 36.0),

sd_pre = c(15.0, 3.1, 0.1, 14.5, 4.7),

sd_post = c(11.6, 4.1, 0.1, 4.4, 4.6),

ni = c(20, 50, 9, 10, 14),

rxy = c(0.47, 0.64, 0.77, 0.89, 0.44))

head(datos)

author year m_pre m_post sd_pre sd_post ni rxy

1 a 2012 30.6 38.5 15.0 11.6 20 0.47

2 b 2013 23.5 26.8 3.1 4.1 50 0.64

3 c 2014 0.5 0.7 0.1 0.1 9 0.77

4 d 2015 53.4 75.9 14.5 4.4 10 0.89

5 e 2016 35.6 36.0 4.7 4.6 14 0.44

Los argumentos necesarios para estimar este tipo de diseños son: mantes (media de la medida antes), mdespues (media del segundo momento temporal), dtantes (desviación tipica de la primera medida (antes), ri (correlación de pearson entre ambas medidas) y ni (tamaño de la muestra sobre la que se tomaron ambas medidas).

Por otra parte en el argumento medida incluimos el valor cmt (cambio de medias tipificado) pudiendo haber incluido alternativamente cm (cambio de medias).


meta.analisis.fnc(datos, medida='cmt',

mantes = 'm_pre', mdespues = 'm_post',

dtantes = 'sd_pre', ri = 'rxy', ni='ni')

A modo de ejemplo vamos a crear de forma aleatoria una nueva variable con el objetivo de mostrar el uso del argumento que.factor y poder valorar así el valor promedio de tamaño de efecto (rombo en la figura) para cada nivel del factor creado tipo.

datos$tipo=c('tipo1','tipo2','tipo2','tipo1','tipo1')

meta.analisis.fnc(datos, medida='cmt',

mantes = 'm_pre', mdespues = 'm_post',

dtantes = 'sd_pre', ri = 'rxy', ni='ni',

que.factor='tipo', xlim=c(-16,8))

Utilizamos el argumento xlim=c(-16,8) porque los límites por defecto (xlim=c(-16,6) provoca el solapamiento de algunos intervalos de confianza sobre los estadísticos de tamaño de efecto (size effect) de la derecha.

Podemos por supuesto utilizar la nueva variable creada tipo para valorar su influencia sobre la heterogeneidad de los estudios. Para ello debemos eliminar el argumento que.factor y sustituirlo por el argumento moderadoras='tipo' (la figura derecha se corresponde con esta solicitud).

meta.analisis.fnc(datos, medida='cmt',

mantes = 'm_pre', mdespues = 'm_post',

dtantes = 'sd_pre', ri = 'rxy', ni='ni',

moderadoras='tipo', xlim=c(-16,8))

Test of Moderators (coefficient 2):

F(df1 = 1, df2 = 3) = 1.4731, p-val = 0.3117


Model Results:

estimate se tval pval ci.lb ci.ub

intrcpt 0.6383 0.3567 1.7896 0.1715 -0.4968 1.7735

tipotipo2 0.6941 0.5719 1.2137 0.3117 -1.1258 2.5140

---

Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Tal y como cabía esperar la variable tipo generada (de forma aleatoria) no tiene influencia alguna sobre la heterogenidad de las investigaciónes.