Effect Sizes

Uma introdução prática tamanho de Efeitos para metanálise em R.

Heterogeneidade

Tutorial sobre heterogeneidade em metanálise no R

1. Introdução à Heterogeneidade

Heterogeneidade refere-se à dispersão dos efeitos verdadeiros entre os diferentes estudos que compõem uma metanálise. Os estudos raramente são idênticos, variando em suas populações, nas especificidades da intervenção ou nas escalas usadas para avaliar os desfechos. Quando o tamanho de efeito varia substancialmente entre as populações, focar apenas na média tem utilidade muito limitada, pois essa média pode não representar a realidade de nenhuma população específica. O verdadeiro objetivo de avaliar a heterogeneidade é entender as implicações clínicas ou práticas da intervenção. Queremos ser capazes de responder:

Por exemplo, um medicamento que melhora o risco de doença cardiovascular em 50% em vários estudos é bem diferente de outro que melhora o risco em média de 50%, variando de -10% (piorando o risco) até 80% nos estudos selecionados.

Lembra que falamos sobre existirem dois tipos de variância no tutorial anterior? Em um modelo de efeitos aleatórios existe a variância do erro amostral (dos efeitos observados) e a variância dos efeitos verdadeiros. Em geral, a variância dos efeitos observados tende a ser sempre maior do que a variância dos efeitos verdadeiros. Porém, a dificuldade de avaliar a heterogeneidade reside justamente em identificar quanto da variação total vem do erro amostral e quanto vem das diferenças reais nos tamanhos de efeito. É para isso que surgiram as métricas discutas a seguir: para determinar quanto de variância é de cada tipo.


2. Métricas Utilizadas

2.1. \(Q\) de Cochran

Tradicionalmente, os metanalistas têm usado a estatística \(Q\) de Cochran para tentar distinguir o que é erro amostral do que é verdadeira heterogeneidade entre os estudos. Ele é definido como uma soma ponderada dos quadrados. Ou seja, ele calcula o quanto do efeito observado de cada estudo (\(\hat{\theta}_k\)) se desvia do efeito combinado (\(\hat{\theta}\)) (elevado ao quadrado para evitar valores negativos), ponderando essa diferença pelo inverso da variância do estudo (\(w_k\)). A fórmula matemática é:

\[Q = \sum_{k=1}^{K} w_k (\hat{\theta}_k - \hat{\theta})^2\] Perceba que como utilizamos \(w_k\), estudos com maior precisão (menor erro padrão) têm um peso maior no cálculo de \(Q\).

Porém, esse valor \(Q\) une os dois tipos de variância. Agora temos que separar o que erro amostral do erro verdadeiro. Na estatística, sob a hipótese nula de que não há heterogeneidade (toda variação é apenas erro de amostragem), assume-se que \(Q\) segue aproximadamente uma distribuição Qui-quadrado (\(\chi^2\)) com \(K-1\) graus de liberdade, sendo \(k\) a quantidade de estudos incluídos. Se você não está familiarizado com a distribuição de qui-quadrado ela parece uma curva normal só que mais desviada para a esquerda. Ela muda de acordo com os graus de liberdade (quantos estudos foram incluidos) e quanto maior o grau de liberdade mais ela se aproxima de uma curva normal. Resumindo, o foco é que podemos calcular o valor de \(Q\) que esperamos encontrar apenas por erro de amostragem.

Para entender como o \(Q\) se comporta, podemos simular dois cenários: um sem heterogeneidade e outro com heterogeneidade entre os estudos. Aqui vamos simular 10.000 metanálises de 40 estudos cada. Vamos calcular o valor de \(Q\) para cada uma dessas metanálises fingindo que não existe heterogeneidade e assumindo a heterogeneidade (objetos Q_fixo e Q_random). Para fazer isso vamos utilizar a função rnorm(K) que gera um conjunto de 40 valores aleatórios seguindo uma distribuição normal com média 0 e desvio padrão 1. Eles vão ser correspondentes à diferença \(\hat{\theta}_k - \hat{\theta}\). Perceba que sum(rnorm(K)^2) faz a soma cada um desses 40 valores elevados ao quadrado, o que equivale à fórmula do Q assumindo que o peso para cada estudo é 1. Para simular a heterogeneidade (ou seja, sair de um modelo de efeitos fixos apenas com erro de amostragem e entrar em um modelo aleatório em há também a variabilidade dos efeitos verdadeiros), vamos somar dois valores de rnorm(K).

set.seed(100)
K <- 40
df <- 39 # Graus de liberdade (K-1)

# Simulação: Sem Heterogeneidade vs. Com Heterogeneidade
Q_fixo <- replicate(10000, sum(rnorm(K)^2))
Q_random <- replicate(10000, sum((rnorm(K) + rnorm(K))^2))

# Criando um data frame organizado para o ggplot
df_simulacao <- data.frame(
  Valor_Q = c(Q_fixo, Q_random),
  Cenario = rep(c("Sem Heterogeneidade", "Com Heterogeneidade"), each = 10000)
)

Ao plotar os dois cenários em gráfico percebemos que os valores de Q assumindo um modelo fixo (apenas o erro amostral) seguem uma curva de qui-quadrado com 39 graus de liberdade (pois são 40 estudos). Porém, ao adicionar a heterogeneidade às metanálises o valore de \(Q\) delas tornou-se maior (a média aproximadamente dobrou) e mais espalhado.

ggplot(df_simulacao, aes(x = Valor_Q, fill = Cenario)) +
  # Histograma de densidade
  geom_histogram(aes(y = after_stat(density)), bins = 70, 
                 alpha = 0.6, position = "identity", color = "white") +
  
  # Curva Teórica Qui-quadrado (df = 39)
  stat_function(fun = dchisq, args = list(df = df), 
                color = "#005f73", linewidth = 1, linetype = "dashed") +
  
  # Cores personalizadas do seu tutorial
  scale_fill_manual(values = c("Sem Heterogeneidade" = "#252422", 
                               "Com Heterogeneidade" = "#fb8500")) +
  scale_y_continuous(expand = c(0,0)) +
  # Estética e Eixos
  labs(x = "Valor de Q", y = "Densidade") +
  xlim(0, 160) +
  theme_classic() +
  theme(
    legend.position = "bottom",
    legend.title = element_blank(), 
    axis.line.x = element_line(color = "#252422", linewidth = 0.6),
    axis.ticks.x = element_line(color = "#252422"),
    text = element_text(family = "Arial", color = "#252422"),
    plot.title = element_text(face = "bold", size = 14)
  )

A conclusão óbvia é que adicionar a heterogeneidade aumentou o valor de \(Q\). E isso agora pode ser medido, pois se o valor de \(Q\) calculado na sua metanálise for muito maior que o valor esperado com \(K-1\), você tem evidência de que os estudos não são farinha do mesmo saco (muito diferentes entre si). Pode-se fazer um teste estatístico entre real vs. esperado, o que chama-se teste \(Q\). Ele diz se o valor observado de \(Q\) é significativamente diferente da distribuição esperada sob a hipótese nula (sem heterogeneidade). Esse teste tem sua relevância, mas também tem grandes limitações:

Mas, apesar do \(Q\) não ser a métrica ideal para medir heterogeneidade, é importante aprender sobre ele pois ele é a base para as outras métricas, como o \(I^2\) (a seguir 😁).


2.2. \(I^2\) (Higgins & Thompson)

A estatística \(I^2\) (Higgins & Thompson, 2002) é uma das medidas mais populares para relatar a heterogeneidade em metanálises, sendo incluída por padrão no pacote {meta}. Enquanto o \(\tau^2\) e o \(Q\) medem a variação em uma escala absoluta, o \(I^2\) oferece uma perspectiva relativa: ele nos diz qual proporção da variabilidade observada nos tamanhos de efeito não é causada pelo erro de amostragem.

O \(I^2\) pode ser visto como uma razão de “sinal-ruído”. Ele quantifica, em percentual, o quanto o valor observado de \(Q\) excede o valor de \(Q\) esperado caso não houvesse heterogeneidade (\(K-1\)). Se esse valor for menor que zero, assumimos que seja zero. A fórmula matemática é a razão entre a dispersão excedente e a dispersão total:

\[I^2 = \frac{Q - (K - 1)}{Q} \times 100\%\]

Se \(I^2\) for próximo de 0%, quase toda a variância observada é “espúria” (apenas erro de amostragem). Se for alto, faz sentido investigar as causas dessa variação através de análises de subgrupo ou metarregressão (próximos tutoriais!). Existe uma regra de bolso para avaliar se o \(I^2\) é grande ou pequeno:

Para entendermos melhor vamos pegar um \(I^2\) simulado de um modelo de efeitos fixos (sem heterogeneidade).

# 1. Calculando I^2 para uma simulação SEM heterogeneidade (Pegamos o 10º valor simulado de Q_fixo)
q_val_fixo <- Q_fixo[10]
i2_fixo <- (q_val_fixo - df) / q_val_fixo
i2_fixo
[1] 0.237083

Agora vamos ver o mesmo valor simulado mas assumindo heterogeneidade. Perceba que o valor é bem maior!

# 2. Calculando I^2 para uma simulação COM heterogeneidade (Pegamos o 10º valor simulado de Q_random)
q_val_random <- Q_random[10]
i2_random <- (q_val_random - df) / q_val_random
i2_random
[1] 0.5441129

O \(I^2\) tem algumas vantagens:

Mas precisamos lembrar que o \(I^2\) é uma escala relativa. Então, O reflete a extensão da sobreposição dos intervalos de confiança. Um \(I^2\) de 100% significa apenas que a maior parte da variância é real, mas não implica necessariamente que os efeitos estejam dispersos em uma faixa ampla (podem estar todos muito próximos, mas estimados com extrema precisão).


2.3. A Variância (\(\tau^2\)) e o Desvio Padrão (\(\tau\)) dos Efeitos Verdadeiros

Imagine que tivéssemos uma quantidade infinita de estudos, cada um com uma amostra infinita. A variância entre esses “efeitos verdadeiros” seria o \(\tau^2\). Como não temos o infinito, usamos os dados observados para estimar esse parâmetro através do \(T^2\).

O método mais popular para estimar o \(\tau^2\) é o Método dos Momentos (ou DerSimonian-Laird). Ele parte da diferença entre o excesso de variação (\(Q - df\)) e divide por uma constante \(C\) que coloca o valor de volta na métrica original:

\[T^2 = \frac{Q - df}{C}\]

Se o valor de \(Q\) for menor que os graus de liberdade (\(Q < df\)), o cálculo resultaria em um número negativo. Como uma variância não pode ser negativa, o \(T^2\) é automaticamente definido como zero.

O \(\tau\) permite descrever a distribuição dos efeitos reais ao redor da média, de forma idêntica ao que fazemos com o desvio padrão em um estudo primário. Se assumirmos uma distribuição normal, podemos calcular um intervalo onde 95% dos efeitos reais devem cair:

\[\text{Média Combinada} \pm 1,96 \times \tau\]

Por exemplo, se a sua metanálise deu um efeito \(g = 0,58\) e um \(\tau = 0,29\). Para termos uma noção do impacto clínico podemos calcular esse intervalo de confiança:


No pacote {meta}, o \(\tau^2\) e o \(\tau\) são calculados automaticamente. Aqui vamos usar o objeto m.gen do tutorial passado. Para relembrar aqui está o código:

library(meta)
library(dmetar)

# Carregar o banco de dados
data(SuicidePrevention)

# Executar a metanálise com metacont
m.cont <- metacont(n.e = n.e, 
                   mean.e = mean.e, 
                   sd.e = sd.e, 
                   n.c = n.c, 
                   mean.c = mean.c, 
                   sd.c = sd.c, 
                   studlab = author, 
                   data = SuicidePrevention, 
                   sm = "SMD", 
                   method.smd = "Hedges", 
                   common = FALSE,      # Desativa efeito fixo
                   random = TRUE,      # Ativa efeitos randômicos
                   method.tau = "REML", 
                   title = "Suicide Prevention")
m.cont$tau2 #Tau-quadrado (Variância)
[1] 0.004369486
m.cont$tau #Tau (Desvio Padrão)
[1] 0.06610209
limite_inf <- m.cont$TE.random - 1.96 * m.cont$tau
limite_sup <- m.cont$TE.random + 1.96 * m.cont$tau

cat("Os efeitos reais variam entre:", round(limite_inf, 2), "e", round(limite_sup, 2))
Os efeitos reais variam entre: -0.36 e -0.1

Vale lembrar que esse \(\tau^2\) é de suma importância pois ele é somado à variância de cada estudo para determinar o peso no modelo de efeitos aleatório (\(W_i = 1 / (V_{Yi} + T^2)\)).


2.4. Intervalos de Predição (Prediction Intervals - PI)

Métricas como o \(\tau^2\) e o \(\tau\) são robustas por não serem influenciadas pelo número de estudos ou pelo tamanho das amostras, mas são difíceis de interpretar na prática. O Intervalo de Predição (PI) resolve esse problema ao traduzir a heterogeneidade em uma faixa de valores concreta. Ele responde à pergunta fundamental: “Se realizarmos um novo estudo no futuro, dentro de qual faixa podemos esperar que o seu resultado caia, baseando-se nas evidências atuais?”. Se o PI estiver totalmente no lado “positivo” (favorecendo a intervenção), temos segurança de que o tratamento será benéfico em novos contextos. Se o PI incluir o zero, há incerteza sobre a eficácia do tratamento em cenários futuros, mesmo que a média atual seja significativa.

O Intervalo de Predição de 95% é calculado utilizando uma distribuição \(t\) com \(K-1\) graus de liberdade:

\[\hat{\mu} \pm t_{K-1, 0.975} \sqrt{SE^2_{\hat{\mu}} + \hat{\tau}^2}\]

Como você pode observar, a inclusão do \(\hat{\tau}^2\) na fórmula é o que torna o PI mais amplo e representativo da variabilidade do mundo real. A única alteração necessária a se fazer é adicionar prediction = TRUE na função de criação do modelo. Por exemplo:

library(meta)
library(dmetar)

m.gen <- metagen(TE = TE, 
                 seTE = seTE, 
                 studlab = author, 
                 data = data,
                 common = FALSE, 
                 random = TRUE,
                 prediction = TRUE # ATIVA O INTERVALO DE PREDIÇÃO
                 )

Não vamos confundir o Intervalo de Confiança com o Intervalo de Predição. Ambos são diferentes e complementares e devem ser reportados na metanálise. Vamos comparar os dois:


Característica Intervalo de Confiança (IC) Intervalo de Predição (PI)
Foco Principal A precisão da estimativa média atual (\(\hat{\mu}\)). A dispersão esperada para um novo estudo futuro.
O que considera Apenas o erro padrão da média combinada (\(SE_{\hat{\mu}}\)). O erro padrão da média mais a variância entre estudos (\(\tau^2\)).
Largura (Amplitude) Geralmente mais estreito; diminui conforme mais estudos são incluídos. Geralmente muito mais largo; reflete a variabilidade real entre contextos.
Utilidade Clínica Indica se o tratamento funciona, em média, para a população. Indica se o tratamento é confiável para o próximo caso ou hospital.


3. Interpretando Heterogeneidade no R (Aplicação Prática)

Vamos construir uma análise completa do zero utilizando o dataset SuicidePrevention (que avalia a eficácia de intervenções na redução da ideação suicida). Aqui, utilizamos a função metacont para dados contínuos. Observe que incluímos prediction = TRUE e o ajuste de Hartung-Knapp (HK) para garantir que os intervalos sejam robustos.

library(meta)
library(dmetar)

# Carregar o dataset real de Saúde e Bem-Estar
data(HealthWellbeing)

# Criar a metanálise de correlações com diagnóstico completo
m.wellbeing <- metacor(cor = cor, 
                       n = n, 
                       studlab = author, 
                       data = HealthWellbeing,
                       common = FALSE,        # Desativa efeito comum
                       random = TRUE,        # Ativa efeitos randômicos
                       method.tau = "REML",  # Melhor estimador para tau^2
                       method.random.ci = "HK", # Ajuste robusto de Knapp-Hartung
                       prediction = TRUE,    # ESSENCIAL: Ativa Intervalo de Predição
                       title = "Saúde e Bem-Estar")

# Ver o "caos" estatístico
summary(m.wellbeing)
Review:     Saúde e Bem-Estar

                       COR           95%-CI %W(random)
An, 2008            0.6200 [0.4964; 0.7189]        2.8
Angner, 2013        0.3720 [0.2823; 0.4552]        3.4
Barger, 2009        0.2900 [0.2870; 0.2930]        3.8
Doherty, 2013       0.3330 [0.2908; 0.3739]        3.7
Dubrovina, 2012     0.7300 [0.7255; 0.7344]        3.8
Fisher, 2010        0.4050 [0.2373; 0.5493]        2.8
Gana, 2013          0.2920 [0.2310; 0.3507]        3.6
Garrido, 2013       0.3880 [0.3300; 0.4430]        3.6
Goldbeck, 2001      0.3600 [0.1366; 0.5486]        2.4
Jacobsson, 2010     0.3080 [0.0732; 0.5104]        2.3
Kim, 2012           0.3500 [0.2352; 0.4551]        3.3
Koots-Ausmees, 2015 0.3400 [0.3367; 0.3432]        3.8
Kulczycka, 2010     0.4200 [0.2247; 0.5829]        2.5
Lacruz, 2012        0.1900 [0.1532; 0.2263]        3.7
Liang, 2014         0.4900 [0.4791; 0.5007]        3.8
Matthews, 2002      0.4700 [0.4059; 0.5295]        3.6
Mukuria, 2013       0.2940 [0.2794; 0.3085]        3.8
Mukuria, 2015       0.3900 [0.3697; 0.4100]        3.8
Ngamaba, 2016       0.4980 [0.4707; 0.5243]        3.8
Ngamaba, 2017       0.2900 [0.2838; 0.2961]        3.8
Patten, 2010        0.1600 [0.0354; 0.2797]        3.3
Sabatini, 2014      0.2200 [0.1537; 0.2843]        3.6
Takeyachi, 2003     0.2020 [0.1352; 0.2669]        3.6
Tuchtenhagen, 2015  0.2900 [0.2358; 0.3424]        3.7
Wang, 2002          0.3200 [0.1639; 0.4605]        2.9
Wang, 2015          0.3200 [0.2968; 0.3428]        3.8
Yildirim, 2013      0.3900 [0.3031; 0.4705]        3.4
Zajacova, 2014      0.2440 [0.2135; 0.2740]        3.8
Zagorski, 2013      0.3600 [0.3494; 0.3705]        3.8

Number of studies: k = 29
Number of observations: o = 853794

                        COR           95%-CI     t  p-value
Random effects model 0.3632 [0.3092; 0.4148] 12.81 < 0.0001
Prediction interval         [0.0563; 0.6074]               

Quantifying heterogeneity (with 95%-CIs):
 tau^2 = 0.0241 [0.0141; 0.0436]; tau = 0.1554 [0.1186; 0.2088]
 I^2 = 99.8%; H = 24.14

Test of heterogeneity:
        Q d.f. p-value
 16320.87   28       0

Details of meta-analysis methods:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-Profile method for confidence interval of tau^2 and tau
- Calculation of I^2 based on Q
- Hartung-Knapp adjustment for random effects model (df = 28)
- Prediction interval based on t-distribution (df = 28)
- Fisher's z transformation of correlations

Agora vamos observar algumas métricas do nosso dado. Vamos focar aqui na seção chamada “Quantifying heterogeneity (with 95%-CIs)” e “Test of heterogeneity”. Agora vamos analisar esse resultado:

  1. O Efeito Combinado vs. Precisão: A correlação é \(r = 0.36\), o que indica uma associação positiva moderada. Além disso, o Intervalo de Confiança é \(0.31\) a \(0.41\), o que é extremamente estreito. Isso ocorre porque temos um tamanho amostral muito grande (quase 1 milhão de observações). Isso significa que temos muita certeza sobre onde está a média dos estudos realizados até agora.

  2. A “Explosão” da Inconsistência (\(I^2\) e \(Q\)): Perceba que o \(I^2 = 99.8\%\), o valor máximo que costuma-se ver. Isso nos diz que 99,8% da variabilidade que vemos no gráfico é “real” (heterogeneidade entre estudos) e apenas 0,2% é erro de amostragem. Além disso o \(Q = 16.320\), um valor astronômico para apenas 28 graus de liberdade (\(df\)). O \(p = 0\) (ou \(p < 0.0001\)) confirma que a hipótese de que os estudos são iguais foi esmagada pelos dados.

  3. A Realidade Clínica: Intervalo de Predição (PI): Aqui está o ponto mais importante do seu tutorial. Note a diferença brutal entre o IC (\([0.31; 0.41]\)) e o PI (\([0.05; 0.60]\)). Isso indica que a média combinada é muito precisa, mas se fóssemos repetir esse estudo esse valor seria mais amplo.

O que isso significa na prática? Significa que, embora a correlação média seja 0,36, em um novo estudo ou população, a relação entre saúde e bem-estar pode ser quase inexistente (\(0.05\)) ou fortíssima (\(0.60\)). A heterogeneidade é tão alta que a média, embora precisa, não serve para prever o que acontecerá no próximo hospital ou país.


Por que o \(I^2\) deu tão alto? O tamanho da amostra dos estudos individuais é muito grande (um estudo tem até 350.000 pessoas), o erro de amostragem tende a zero. Como o \(I^2\) mede a proporção de variação que não é erro de amostragem, qualquer mínima diferença real entre os estudos fará o \(I^2\) saltar para próximo de 100%. Isso não significa necessariamente que os estudos são bizarramente diferentes, mas sim que nossa capacidade de detectar até as menores diferenças é quase infinita. Nestes casos, ignore a porcentagem do \(I^2\) e foque no Intervalo de Predição (PI), que traduz essa variação para a realidade prática. Além disso, quando o \(I^2\) é tão alto assim, o próximo passo obrigatório é a Análise de outliers e de casos influentes! Para você guardar como regra: costuma-se recomendar a investigação de outliers e de casos influentes caso o \(I^2 > 50%\).


4. Investigando Outliers e Casos Influentes

4.1. Remoção Simples de Outliers

Às vezes, a heterogeneidade elevada em uma metanálise não é causada por uma variação equilibrada entre todos os estudos, mas sim por um ou dois estudos com resultados tão extremos que simplesmente não “se encaixam” no restante do grupo. Esses são os chamados outliers (valores atípicos). Nesta seção, vamos aprender a identificar e tratar esses casos para garantir que nossa estimativa final seja robusta e não esteja sendo distorcida por dados excepcionais.

Existem várias formas estatísticas de definir um outlier, mas uma das mais lógicas e diretas é baseada na sobreposição de intervalos de confiança. Um estudo é considerado um outlier se o seu intervalo de confiança (95%) não se sobrepõe ao intervalo de confiança do efeito combinado de toda a metanálise. Isso significa que:

Essa abordagem é inteligente porque protege estudos pequenos: se um estudo tem um erro de amostragem alto, seu intervalo de confiança será largo, aumentando a chance de ele se sobrepor à média, mesmo que o valor pontual seja distante. Se um estudo for preciso (amostra grande) e ainda assim estiver longe da média, ele é um forte candidato a outlier.

Aqui vamos utilizar o dado ThirdWave para fazer a análise de heterogeneidade. Este dataset avalia o impacto de psicoterapias de “terceira onda” no estresse de universitários, utilizando o \(g\) de Hedges (diferença de médias padronizada com correção para pequenas amostras) como métrica de efeito. A heterogeneidade é central nesta análise porque as intervenções (como ACT e Mindfulness) e os contextos universitários variam entre os estudos. Essas diferenças metodológicas e populacionais geram variações reais nos resultados (heterogeneidade de efeitos reais), o que impede que todos os estudos compartilhem um único efeito comum.

library(tidyverse) # needed for 'glimpse'
library(dmetar)
library(meta)

data(ThirdWave)
glimpse(ThirdWave)
Rows: 18
Columns: 8
$ Author               <chr> "Call et al.", "Cavanagh et al.", "Dani…
$ TE                   <dbl> 0.7091362, 0.3548641, 1.7911700, 0.1824…
$ seTE                 <dbl> 0.2608202, 0.1963624, 0.3455692, 0.1177…
$ RiskOfBias           <chr> "high", "low", "high", "low", "low", "l…
$ TypeControlGroup     <chr> "WLC", "WLC", "WLC", "no intervention",…
$ InterventionDuration <chr> "short", "short", "short", "short", "sh…
$ InterventionType     <chr> "mindfulness", "mindfulness", "ACT", "m…
$ ModeOfDelivery       <chr> "group", "online", "group", "group", "o…
m.gen <- metagen(TE = TE,
                 seTE = seTE,
                 studlab = Author,
                 data = ThirdWave,
                 sm = "SMD",
                 common = FALSE,
                 random = TRUE,
                 method.tau = "REML",
                 method.random.ci = "HK",
                 prediction = TRUE, 
                 title = "Third Wave Psychotherapies")

summary(m.gen)
Review:     Third Wave Psychotherapies

                          SMD            95%-CI %W(random)
Call et al.            0.7091 [ 0.1979; 1.2203]        5.0
Cavanagh et al.        0.3549 [-0.0300; 0.7397]        6.3
DanitzOrsillo          1.7912 [ 1.1139; 2.4685]        3.8
de Vibe et al.         0.1825 [-0.0484; 0.4133]        7.9
Frazier et al.         0.4219 [ 0.1380; 0.7057]        7.3
Frogeli et al.         0.6300 [ 0.2458; 1.0142]        6.3
Gallego et al.         0.7249 [ 0.2846; 1.1652]        5.7
Hazlett-Stevens & Oren 0.5287 [ 0.1162; 0.9412]        6.0
Hintz et al.           0.2840 [-0.0453; 0.6133]        6.9
Kang et al.            1.2751 [ 0.6142; 1.9360]        3.9
Kuhlmann et al.        0.1036 [-0.2781; 0.4853]        6.3
Lever Taylor et al.    0.3884 [-0.0639; 0.8407]        5.6
Phang et al.           0.5407 [ 0.0619; 1.0196]        5.3
Rasanen et al.         0.4262 [-0.0794; 0.9317]        5.1
Ratanasiripong         0.5154 [-0.1731; 1.2039]        3.7
Shapiro et al.         1.4797 [ 0.8618; 2.0977]        4.2
Song & Lindquist       0.6126 [ 0.1683; 1.0569]        5.7
Warnecke et al.        0.6000 [ 0.1120; 1.0880]        5.2

Number of studies: k = 18

                             SMD            95%-CI    t  p-value
Random effects model (HK) 0.5771 [ 0.3782; 0.7760] 6.12 < 0.0001
Prediction interval              [-0.0542; 1.2084]              

Quantifying heterogeneity (with 95%-CIs):
 tau^2 = 0.0820 [0.0295; 0.3533]; tau = 0.2863 [0.1717; 0.5944]
 I^2 = 62.6% [37.9%; 77.5%]; H = 1.64 [1.27; 2.11]

Test of heterogeneity:
     Q d.f. p-value
 45.50   17  0.0002

Details of meta-analysis methods:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-Profile method for confidence interval of tau^2 and tau
- Calculation of I^2 based on Q
- Hartung-Knapp adjustment for random effects model (df = 17)
- Prediction interval based on t-distribution (df = 17)

Perceba que esse estudo possue uma heterogeneidade considerável com um \(I^2 = 62%\). Para automatizar o processo descrito acima de descoberta de outliers, utilizaremos a função find.outliers do pacote {dmetar}. Ela identifica os culpados, remove-os e recalcula toda a metanálise automaticamente para você comparar os resultados.

m.outliers <- find.outliers(m.gen)
m.outliers
Identified outliers (random-effects model) 
------------------------------------------ 
"DanitzOrsillo", "Shapiro et al." 
 
Results with outliers removed 
----------------------------- 
Review:     Third Wave Psychotherapies

Number of studies: k = 16

                             SMD           95%-CI    t  p-value
Random effects model (HK) 0.4528 [0.3257; 0.5800] 7.59 < 0.0001
Prediction interval              [0.1705; 0.7352]              

Quantifying heterogeneity (with 95%-CIs):
 tau^2 = 0.0139 [0.0000; 0.1032]; tau = 0.1180 [0.0000; 0.3213]
 I^2 = 24.8% [0.0%; 58.7%]; H = 1.15 [1.00; 1.56]

Test of heterogeneity:
     Q d.f. p-value
 19.95   15  0.1739

Details of meta-analysis methods:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-Profile method for confidence interval of tau^2 and tau
- Calculation of I^2 based on Q
- Hartung-Knapp adjustment for random effects model (df = 15)
- Prediction interval based on t-distribution (df = 15)

Primeiro perceba que a função identificou dois outliers (“DanitzOrsillo” e “Shapiro et al.”). Ao remover esses dois estudos você observará mudanças drásticas nos indicadores de heterogeneidade:

  1. Redução do \(I^2\): É comum ver o \(I^2\) despencar (nesse caso de 63% para 25%) após a remoção de apenas dois estudos.

  2. \(\tau^2\) e Significância: O intervalo de confiança do \(\tau^2\) passou a incluir o zero, e o teste \(Q\) de Cochran deixou de ser significativo (\(p > 0,05\)).

  3. Intervalo de Predição (PI): Como a variação diminuiu, o Intervalo de Predição se torna muito mais estreito e preciso, dando mais segurança sobre a eficácia da intervenção em estudos futuros.

Embora seja tentador remover outliers para deixar seu gráfico “bonito” e o \(I^2\) baixo, você jamais deve excluir estudos sem uma justificativa técnica ou teórica sólida apenas para obter resultados mais favoráveis. A remoção de outliers serve para a) identificar possíveis erros de digitação ou coleta de dados nos estudos primários; b) verificar a robustez do seu efeito (se o resultado sumir após tirar um outlier, ele não é robusto); c)gerar uma análise de sensibilidade para reportar como os dados se comportam em um cenário de maior consistência.


4.2. Análise de Casos Influentes

Identificar um outlier (um estudo com resultado extremo) é importante, mas nem todo outlier “estraga” a sua metanálise. Por outro lado, existem estudos que podem nem parecer tão extremos, mas que possuem um peso tão grande que “sequestram” o resultado sozinhos. Esses são os Casos Influentes. Muitas vezes esses conceitos se sobrepõem, mas eles não são a mesma coisa:

Para identificar esses estudos, o R realiza um processo exaustivo: ele recalcula a metanálise K vezes (onde K é o número de estudos), removendo um estudo diferente em cada vez. Se ao remover o “Estudo X” o seu \(I^2\) cair de 80% para 20%, ou se o seu resultado deixar de ser significativo, você acabou de encontrar um caso influente. Diferente da remoção simples de outliers, a análise de influência é mais sofisticada. Utilizaremos a função InfluenceAnalysis do pacote {dmetar} aplicada ao seu objeto m.gen.

m.cont.inf <- InfluenceAnalysis(m.gen, random = TRUE)

# A função gera 4 gráficos principais. Vamos abrir o painel geral:
plot(m.cont.inf)

Para concluir o diagnóstico de robustez da sua metanálise, precisamos olhar para os gráficos gerados pela função InfluenceAnalysis. Eles permitem identificar visualmente quem são os “vilões” da heterogeneidade e o quanto o seu resultado final depende de estudos individuais.

a) Gráfico de Baujat

O Baujat Plot é um mapa bidimensional que cruza duas informações cruciais sobre cada estudo:

plot(m.cont.inf, "baujat")

Assim, estudos localizados no canto superior direito do gráfico são os mais problemáticos. Eles são responsáveis por inflar o seu \(I^2\) e, ao mesmo tempo, deslocar a média da metanálise para um lado ou para o outro. No caso do dataset de “Terceira Onda”, estudos como “DanitzOrsillo” costumam aparecer à direita por adicionarem muita heterogeneidade, mesmo que seu impacto na média não seja tão massivo devido ao tamanho da amostra. Perceba também que o estudo “de Vibe” possui a maior influência no resultado combinado do tamanho do efeito.


b) Análise Leave-One-Out

Nessa técnica O R recalcula a metanálise \(K\) vezes, omitindo um estudo em cada rodada. Geramos dois tipos de Forest Plots para essa análise:

  1. Ordenado por Tamanho de Efeito (“es”): Mostra como a média combinada (\(\hat{\mu}\)) oscila. A área sombreada no fundo do gráfico representa o intervalo de confiança original (com todos os estudos). Se, ao retirar um estudo, o novo ponto sair de dentro dessa área, esse estudo tem uma influência desproporcional no resultado final.
plot(m.cont.inf, "es")

  1. Ordenado por Heterogeneidade (“i2”): É a forma mais rápida de ver qual estudo está “segurando” a heterogeneidade. Se o seu \(I^2\) original é de 60%, mas cai para 20% quando o “Estudo X” é removido, você encontrou a fonte principal da inconsistência dos seus dados.
plot(m.cont.inf, "i2")

Esse plot mostra que os menores \(I^2\) obtidos são retirando o estudo de “DanitzOrsillo” e “Shapiro et al.”, o que corrobora nossos resultados anteriores.


c) Gráfico de Influência

Para fechar o diagnóstico de influência, o comando plot(m.cont.inf, "influence") gera uma grade de gráficos técnicos. Essas métricas funcionam juntas como “detetores de mentira” que revelam se um estudo está distorcendo a realidade da sua metanálise. Cada um desses índices avalia um aspecto diferente de como um estudo individual afeta o modelo global. No gráfico, os estudos destacados em vermelho são aqueles que ultrapassaram os limites estatísticos de influência.

plot(m.cont.inf, "influence")

  1. Resíduos Externamente Padronizados (\(t_k\)): Mede o quanto o resultado de um estudo se desvia da média (calculada sem ele). Se o valor for muito alto, significa que o estudo não “se encaixa” na população geral e apresenta um comportamento atípico em relação aos demais.

  2. Valor DFFITS: Indica quantos desvios padrão a média global se desloca quando o estudo em questão é removido. Valores altos mostram que o estudo tem um impacto direto e pesado no valor final do efeito combinado.

  3. Distância de Cook (\(D_k\)): Uma métrica clássica de estatística que combina o resíduo do estudo com o seu peso. Funciona de forma similar ao DFFITS, mas é sempre positiva. Estudos com alta Distância de Cook são altamente influentes e podem estar sequestrando a média da metanálise.

  4. Razão de Covariância (CovRatio): Avalia a precisão do modelo. Se o CovRatio for menor que 1, significa que a remoção desse estudo torna a nossa estimativa da média muito mais precisa e confiável.

  5. \(\tau^2\) e \(Q\) (Leave-One-Out): Estes gráficos mostram o que acontece com a heterogeneidade se deletarmos o estudo. Quedas bruscas nesses valores ao remover um estudo específico confirmam que ele é o principal responsável pela inconsistência dos dados.

  6. Hat Value e Peso do Estudo: Medem a “alavancagem” ou a importância que o modelo deu ao estudo. Um Hat Value alto indica que o estudo teve muita influência na determinação do resultado final, geralmente por ter uma amostra muito grande ou um erro padrão muito pequeno.

Perceba que o estudos “DanitzOrsillo” apareceu como vermelho em todos os gráficos. E “Shapiro et al.”, apesar de ainda estar em azul, está em picos e vales das métricas. Isso corrobora o outro resultado.


4.3. Reportando Análise de Influência

O objetivo aqui é realizar uma Análise de Sensibilidade: mostrar ao leitor como o seu resultado se comporta com e sem esses estudos “complicados”. Para fazer isso iremos utilizar a função update, que permite rodar novamente o modelo sem criar o objeto do zero. Os estudos 3, 4 e 16 são os “DanitzOrsillo”, “de Vibe” ou “Shapiro”:

update(m.gen, exclude = c(3, 4, 16)) %>% 
  summary()
Review:     Third Wave Psychotherapies

                          SMD            95%-CI %W(random) exclude
Call et al.            0.7091 [ 0.1979; 1.2203]        4.6        
Cavanagh et al.        0.3549 [-0.0300; 0.7397]        8.1        
DanitzOrsillo          1.7912 [ 1.1139; 2.4685]        0.0       *
de Vibe et al.         0.1825 [-0.0484; 0.4133]        0.0       *
Frazier et al.         0.4219 [ 0.1380; 0.7057]       14.8        
Frogeli et al.         0.6300 [ 0.2458; 1.0142]        8.1        
Gallego et al.         0.7249 [ 0.2846; 1.1652]        6.2        
Hazlett-Stevens & Oren 0.5287 [ 0.1162; 0.9412]        7.0        
Hintz et al.           0.2840 [-0.0453; 0.6133]       11.0        
Kang et al.            1.2751 [ 0.6142; 1.9360]        2.7        
Kuhlmann et al.        0.1036 [-0.2781; 0.4853]        8.2        
Lever Taylor et al.    0.3884 [-0.0639; 0.8407]        5.8        
Phang et al.           0.5407 [ 0.0619; 1.0196]        5.2        
Rasanen et al.         0.4262 [-0.0794; 0.9317]        4.7        
Ratanasiripong         0.5154 [-0.1731; 1.2039]        2.5        
Shapiro et al.         1.4797 [ 0.8618; 2.0977]        0.0       *
Song & Lindquist       0.6126 [ 0.1683; 1.0569]        6.1        
Warnecke et al.        0.6000 [ 0.1120; 1.0880]        5.0        

Number of studies: k = 15

                             SMD           95%-CI    t  p-value
Random effects model (HK) 0.4819 [0.3595; 0.6043] 8.44 < 0.0001
Prediction interval              [0.3623; 0.6016]              

Quantifying heterogeneity (with 95%-CIs):
 tau^2 < 0.0001 [0.0000; 0.0955]; tau = 0.0012 [0.0000; 0.3091]
 I^2 = 4.6% [0.0%; 55.7%]; H = 1.02 [1.00; 1.50]

Test of heterogeneity:
     Q d.f. p-value
 14.67   14  0.4011

Details of meta-analysis methods:
- Inverse variance method
- Restricted maximum-likelihood estimator for tau^2
- Q-Profile method for confidence interval of tau^2 and tau
- Calculation of I^2 based on Q
- Hartung-Knapp adjustment for random effects model (df = 14)
- Prediction interval based on t-distribution (df = 14)

Perceba que O \(I^2\) caiu de 63% para apenas 5%, indicando que quase toda a “confusão” era causada por apenas três estudos.Além disso, antes o Intervalo de Predição incluía o zero (-0.06), sugerindo incerteza. Sem os casos influentes, o PI agora vai de 0.36 a 0.61, dando muito mais certeza de que o tratamento será benéfico em contextos futuros.

Quando determinamos que estudos específicos (como “DanitzOrsillo”, “de Vibe” ou “Shapiro”) são influentes, a boa prática científica exige que reportemos os resultados originais lado a lado com os resultados obtidos após a exclusão desses casos. Isso permite que o leitor avalie a robustez da sua metanálise. Se o efeito combinado mudar drasticamente ou se a heterogeneidade desaparecer por completo após retirar um ou dois estudos, essa informação é vital para a interpretação clínica.

O que incluir no seu relatório?

Análise \(g\) 95% CI p-value 95% PI \(I^2\) 95% CI (\(I^2\))
Análise Principal 0.58 0.38–0.78 < 0.001 -0.06–1.22 63% 39–78
Sem Casos Influentes¹ 0.48 0.36–0.60 < 0.001 0.36–0.61 5% 0–56

¹ Após retirar”DanitzOrsillo”, “de Vibe” e “Shapiro”

Essa tabela também é versátil: você pode adicionar linhas para outras análises de sensibilidade, como incluir apenas estudos com baixo risco de viés ou apenas estudos com amostras grandes.

Gostou? Veja também: