Vamos iniciar carregando os pacotes que serão utilizados. Em seguida, utilizaremos a ferramenta set.seed para garantir a replicabilidade exata dos testes.
library(mediation)
## Loading required package: MASS
## Loading required package: Matrix
## Loading required package: mvtnorm
## Loading required package: sandwich
## mediation: Causal Mediation Analysis
## Version: 4.5.1
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.2
## ✔ ggplot2 4.0.0 ✔ tibble 3.3.0
## ✔ lubridate 1.9.4 ✔ tidyr 1.3.1
## ✔ purrr 1.1.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ tidyr::expand() masks Matrix::expand()
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ tidyr::pack() masks Matrix::pack()
## ✖ dplyr::select() masks MASS::select()
## ✖ tidyr::unpack() masks Matrix::unpack()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(tibble)
library(tinytex)
# Definir Reprodutibilidade
set.seed(123)
# Tamanho da amostra
n = 300
Criando a variável de tratamento (T)
É uma Variável binária (0/1) que representa o tratamento.
‘rbinom’ cria 300 observações com probabilidade 0.5 de receber o tratamento (um sorteio de moeda honesta).
T = rbinom(n, 1, 0.5)
Criando a variável Moderador (Z) - Pré-tratamento
Variável contínua, pré-tratamento, com média 0 e desvio-padrão 1.
Ex.: nível de escolaridade, predisposição política. # É chamada de moderador porque pode alterar o efeito do tratamento.
O moderador explica para quem, quando ou em que condições o tratamento é mais ou menos eficaz.
Z = rnorm(n, 0, 1)
Mediador (M) — afetado por T
Variável intermediária afetada pelo tratamento.
É o canal causal: o tratamento muda M, que pode, por sua vez, afetar Y.
A equação 0.5 * T + erro garante que, em média, T aumenta M em 0.5 unidades.
O mediador explica porque o tratamento funciona;
M = 0.5 * T + rnorm(n, 0, 1)
Simular resultado (Y) — afetado por T, M e interação T * Z
Os termos que irão influenciar Y são arbitrariamente definidos para cada variável (M, T e Z)
Y = 1 + 0.7 * T + 0.6 * M + 0.4 * T * Z + rnorm(n, 0, 1)
Aqui está o “experimento” central:
1 é o intercepto (valor médio de Y quando tudo mais é 0).
0.7 * T é o efeito direto do tratamento.
0.6 * M é o efeito indireto (via mediador).
0.4 * T * Z é a interação: mostra que o efeito do tratamento depende de Z.
É exatamente o mecanismo de moderação. # rnorm(n, 0, 1) adiciona ruído aleatório, simulando variação não explicada.
Assim, Y é influenciado simultaneamente por T, M e pela interação T×Z.
Contruindo a BASE (data frame)
df = data.frame(T = T, Z = Z, M = M, Y = Y)
Resumo conceitual
Tratamento (T) → variável exógena, como receber uma intervenção de campanha.
Mediador (M) → mecanismo causal pelo qual T influencia Y (ex.: mudança de opinião).
Moderador (Z) → característica que faz o efeito de T variar entre indivíduos (ex.: ideologia prévia).
Desfecho (Y) → resultado de interesse (ex.: intenção de voto).
O script cria, de forma controlada, um “mundo” onde sabemos a verdade do processo gerador.
Depois, podemos aplicar modelos de mediação (para decompor efeitos diretos e indiretos) e de moderação (para ver como o efeito do tratamento muda de acordo com Z) e verificar se a estatística recupera os parâmetros que definimos.
Esse tipo de simulação é ideal para:
Ensinar a diferença entre mediação e moderação.
Testar se modelos e pacotes (mediation, lm, interações) e identificar corretamente os efeitos.
Análise de Moderação (X e Z)
Dividir Z em 3 grupos (baixo, médio, alto)
df = df %>%
mutate(Z_group = cut(Z,breaks = quantile(Z, probs = c(0, 1/3, 2/3, 1), na.rm = TRUE),
labels = c("Z baixo", "Z médio", "Z alto"),
include.lowest = TRUE))
O que foi feito?
Ele “fez isso” para estratificar o moderador contínuo Z em três faixas (baixo/médio/alto) e, assim, estimar/visualizar efeitos do tratamento por subgrupos (CATEs). É um passo comum em análises de moderação quando queremos gráficos e comparações simples.
O que cada parte faz:
Por que fazer isso?
Para comparar o efeito de T (diferença de médias ou coeficiente de T num OLS) separadamente entre Z baixo, Z médio e Z alto.
Os cortes por tercis produzem grupos de tamanhos parecidos, o que ajuda na precisão.
Observação metodológica:
Discretizar um moderador contínuo perde informação e pode introduzir arbitrariedade (onde cortar?).
Uma alternativa geralmente melhor é modelar Z como contínuo com interação T * Z e plotar efeitos marginais ao longo de Z (p.ex., Johnson–Neyman ou marginaleffects/margins).
Resumo:
Se discretizou Z em tercis para facilitar a análise/visualização
de moderação por subgrupos; é útil didaticamente, mas, quando
possível, prefira modelar a interação com Z contínuo e
visualizar os efeitos marginais.
E o que é o CATE?
É o efeito causal médio do tratamento em um subconjunto específico da população, definido por uma condição ou característica observável.
“Qual é o efeito médio do tratamento para indivíduos com X = x?”
Qual a relação com o ATE?
ATE (Average Treatment Effect) é a média geral sobre toda a amostra.
CATE é mais detalhado: Calcula esse efeito condicionado em um valor ou gurpo de X.
Ex:
- ATE - Impacto médio de uma campanha de incentivo ao voto em todos os
eleitores.
- CATE - Impacto médio entre eleitores com alta escolaridade ou entre
municípios com alta renda.
No exercício de moderação, o moderador Z foi dividido em Z baixo, Z médio e Z alto.
Para cada grupo, calcula-se a diferença média de Y entre tratados (T=1) e controles (Y=0).
Essa diferença é o CATE para cada faixa de Z
Em síntese: O CATE é o efeito médio do tratametno para um grupo ou condição específica, revelando como o impacto da intervenção varia entre diferentes pefis da população.
moderation_graph =
ggplot(df, aes(x = factor(T), y = Y, fill = Z_group)) +
geom_boxplot(alpha = 0.6) +
labs(
title = "Efeito Moderador de Z sobre o Tratamento T - Dados Simulados",
x = "Tratamento (T)",
y = "Resultado (Y)",
fill = "") +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 14),
plot.subtitle = element_text(size = 13),
strip.text.x = element_text(size = 10),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"),
legend.text = element_text(size = 14),
legend.position = "bottom")
moderation_graph
Interpretação do Resultado:
Com T = 0 (controle):
Com T = 1 (tratamento):
O tratamento tem maior efeito nos indivíduos com Z alto.
Isso reproduz a moderação programada no modelo:
O termo 0.4 * T * Z faz com que, quando Z é maior, o impacto de T em Y seja mais forte.
Em resumo
O Gráfico mostra, de maneira visual, que o efeito do tratamento T em Y depende do nível de Z, exatamente a definição de moderação em inferência causal.
Esse trecho ajusta e resume um modelo de regressão linear que representa a primeira etapa da análise de mediação.
med_model = lm(M ~ T, data = df)
summary(med_model)
##
## Call:
## lm(formula = M ~ T, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.77887 -0.68880 0.04473 0.73693 2.62219
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -0.03091 0.08034 -0.385 0.701
## T 0.60043 0.11556 5.196 3.79e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1 on 298 degrees of freedom
## Multiple R-squared: 0.08307, Adjusted R-squared: 0.07999
## F-statistic: 27 on 1 and 298 DF, p-value: 3.785e-07
lm() = linear model (modelo de regressão
linear).
M ~ T = fórmula dizendo que o mediador M é a
variável dependente e o tratamento T é a
explicativa.
data = df = usa os dados do data frame
df.
O resultado (lm object) é guardado em
med_model.
Mi= alpha + betaTi + erroi
Intercepto (alpha): valor médio de M no grupo de controle (T=0).
Coeficiente de T (beta): diferença média de M
entre os tratados (T=1) e os controles.
→ É o efeito do tratamento sobre o mediador.
Na análise de mediação, o primeiro passo é estimar como o tratamento afeta o mediador.
Se beta for estatisticamente diferente de 0, significa que T realmente influencia M.
Essa relação é necessária para que M possa mediar o efeito de T sobre Y.
Exemplo
Se summary(med_model) der:
(Intercept) 0.02
T 0.48
→ Em média, o tratamento aumenta M em cerca de 0.48 unidades.
Resumo em uma frase
Esse código ajusta a regressão M ~ T, que mede quanto o tratamento T altera o mediador M, sendo o primeiro passo para decompor o efeito causal total em direto e indireto.
O que o modelo estima
A equação ajustada é:
M^i=−0.0309+0.6004 Ti
M é o mediador.
T é o tratamento (0 = controle, 1 = tratado).
Coeficientes
| Termo | Estimativa | Interpretação |
|---|---|---|
| (Intercept) | –0.03 (p = 0.70) | Valor médio de M no grupo de controle. Estatisticamente igual a zero: em quem não recebeu o tratamento, M fica em torno de 0. |
| T | 0.60 (p ≈ 3.8e-07) | Diferença média de M entre tratados e controles. Ou seja, receber o tratamento aumenta M em ≈ 0.6 unidades. Esse é o efeito do tratamento sobre o mediador. |
O p-valor muito baixo (p < 0.001) indica que esse aumento de ~0.6 é altamente significativo.
Ajuste do modelo
R² = 0.083: cerca de 8 % da variação de M é explicada pelo tratamento.
É comum ter R² modestos em dados simulados com ruído.
F-statistic = 27, p ≈ 3.8e-07: confirma que o modelo é globalmente significativo.
Interpretação substantiva na análise de mediação
Este é o primeiro passo da decomposição causal:
Mostra que o tratamento realmente afeta o mediador.
Esse é um pré-requisito para que haja efeito indireto (T → M → Y).
Em palavras:
Em média, receber o tratamento aumenta o mediador M em aproximadamente 0,6 unidades, diferença que não se deve ao acaso.
Resumo em uma frase
O tratamento aumenta significativamente o mediador M em ~0,6 unidades, confirmando que existe um caminho causal T → M — o pré-requisito essencial para identificar um efeito indireto na análise de mediação.
O modelo é
Mi= alpha + betaTi + erroi
onde:
Mi: valor do mediador para a observação i
Ti: 0 (controle) ou 1 (tratamento)
Quando T = 0, a equação vira:
Mi= alpha+ erroi
Logo, alpha (o intercepto) é a média esperada de M no grupo de controle, ou seja, quando não há tratamento.
No seu resultado:
(Intercept) = -0.0309
p-value = 0.701
Então podemos dizer:
Em quem não recebeu o tratamento, o mediador M tem valor médio praticamente zero (diferença tão pequena que pode ser atribuída ao acaso).
Serve como referência: o efeito de T é medido em relação a esse nível “baseline”.
Simplifica a interpretação de \beta:
→ O coeficiente 0.60 de T significa que o grupo tratado tem, em média, M = –0.03 + 0.60 ≈ 0.57, ou seja, cerca de 0.6 pontos a mais que o controle.
Resumo:
O intercepto é a média do mediador M quando não há tratamento.
Como –0.03 não difere de 0 de forma significativa, concluímos que sem tratamento M fica em torno de zero.
O intercepto α é o valor médio de M quando T = 0, ou seja, quando a unidade está no grupo de controle.
O coeficiente beta mostra quanto M muda em média quando passamos de T = 0 (controle) para T = 1 (tratamento).
Portanto:
M não é o controle; é o resultado (variável dependente) do modelo de mediação.
O grupo de controle é identificado por T = 0.
out_model = lm(Y ~ T + M, data = df)
summary(out_model) # Y, X e M são arbitrariamente definidos
##
## Call:
## lm(formula = Y ~ T + M, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.76979 -0.69241 -0.01046 0.59424 3.10311
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.08333 0.08535 12.692 < 2e-16 ***
## T 0.60413 0.12818 4.713 3.76e-06 ***
## M 0.65196 0.06153 10.596 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.062 on 297 degrees of freedom
## Multiple R-squared: 0.3748, Adjusted R-squared: 0.3706
## F-statistic: 89.03 on 2 and 297 DF, p-value: < 2.2e-16
Ajusta um modelo de regressão linear em que:
Y é a variável dependente (o desfecho de interesse).
T é o tratamento.
M é o mediador.
Em notação: Yi=alpha+t′Ti+yMi+erroi
2. Por que incluímos T e M juntos
Queremos separar:
Efeito direto de T em Y (t′): parte de Y explicada por T independente de M.
Efeito indireto via M: quanto T muda Y por meio de M.
Para isso, precisamos ver como T afeta Y controlando M.
3. Como interpretar os coeficientes
| Termo | O que mede | Interpretação conceitual |
|---|---|---|
| (Intercept) | Valor médio de Y quando T=0 e M=0. | É apenas a linha de base. |
| T | Efeito direto de T sobre Y, mantendo M constante. | Mostra se T afeta Y por caminhos que não passam por M. |
| M | Efeito de M sobre Y, mantendo T constante. | Indica se M transmite o efeito de T para Y. |
Importante:
O efeito indireto é obtido multiplicando:
(coef de T em M)×(coef de M em Y)
O efeito total é a soma de direto + indireto.
4. Conexão com a etapa anterior
Primeiro modelo (M ~ T): mediu o impacto de T em M
(≈0.6).
Segundo modelo (Y ~ T + M): permite decompor o
efeito de T em Y:
5. Exemplo com números hipotéticos
Suponha que summary(out_model) mostre:
Coefficients:
(Intercept) 1.0
T 0.3
M 0.7
Efeito indireto = 0.6 (de T→M) × 0.7 (de M→Y) ≈ 0.42
Efeito direto = 0.3
Efeito total ≈ 0.42 + 0.3 = 0.72
Ou seja, grande parte do efeito do tratamento sobre Y se dá via M.
Resumo em uma frase
O modelo Y ~ T + M estima o efeito direto de T e o
efeito de M sobre o desfecho Y, permitindo calcular a parte do impacto
do tratamento que é mediada por M e a parte que é direta, completando a
análise de mediação.
Vamos interpretar esse resultado em etapas, ligando com a lógica de mediação causal.
Y^=1.083+0.604 T+0.652 M
Y: desfecho (resultado)
T: tratamento (0 = controle; 1 = tratado)
M: mediador
| Coeficiente | Valor |
|---|---|
| Intercepto (1.083) | Valor médio de Y quando T = 0 e M = 0. É a linha de base do desfecho. |
| T (0.604) | Efeito direto do tratamento sobre Y controlando M. Ou seja, mesmo quando o mediador M é mantido constante, o tratamento aumenta Y em ≈0.6 unidades. |
| M (0.652) | Efeito do mediador sobre Y, para um dado nível de T. Cada aumento de 1 unidade em M está associado a um aumento de ≈0.65 unidades em Y. |
Todos os coeficientes são altamente significativos (p < 0.001).
Da etapa anterior (M ~ T):
Agora:
Efeito indireto = 0.60 × 0.65 ≈ 0.39
Efeito direto: 0.60 (coeficiente de T aqui).
Efeito indireto: 0.39 (calculado acima).
Efeito total = direto + indireto ≈ 0.99.
Isso significa que:
O tratamento aumenta Y em cerca de 1 unidade no total.
Desse total, aproximadamente 40% (0.39/0.99) se deve à via T → M → Y.
Os outros 60% vêm de caminhos diretos T → Y que não passam por M.
R² = 0.375: o modelo explica cerca de 37% da variação de Y — bastante bom para dados simulados com ruído.
F-statistic p < 2.2e-16: confirma que o conjunto de preditores é altamente significativo.
O tratamento tem um efeito total de aproximadamente 1 unidade sobre
Y.
Esse impacto se decompõe em:
≈0.60 unidades de efeito direto (não via M);
≈0.39 unidades de efeito indireto (via aumento de M).
Em termos causais: T influencia M, que por sua vez influencia Y, e boa parte do impacto de T em Y acontece através desse mecanismo mediador.
Suponha que:
T (tratamento) = participação de um eleitor em um debate público on-line promovido por um partido.
M (mediador) = interesse político do eleitor, medido em uma escala padronizada.
Y (desfecho) = intenção de comparecer às urnas (por exemplo, 0 a 10).
O que a análise sugere:
| Efeito | Interpretação prática |
|---|---|
| Efeito de T sobre M (≈0.60) | Participar do debate aumenta o interesse político em ~0,6 ponto. |
| Efeito de M sobre Y (≈0.65) | Cada 1 ponto a mais de interesse político aumenta a intenção de votar em ~0,65 ponto. |
| Efeito indireto T→M→Y (≈0.39) | Parte do efeito de participar do debate sobre a intenção de votar vem porque a participação elevou o interesse político. |
| Efeito direto de T sobre Y (≈0.60) | Mesmo sem considerar a mudança de interesse, o simples fato de participar do debate eleva a intenção de voto em ~0,6 ponto (ex.: por criar compromissos sociais, aumentar confiança no processo etc.). |
| Efeito total (≈1.0) | Somando tudo, quem participa do debate apresenta, em média, um ponto a mais na intenção de votar em comparação a quem não participa. |
Participar de um debate on-line aumenta em cerca de 1 ponto a
intenção de votar.
Aproximadamente 40 % desse efeito se dá indiretamente, porque o debate eleva o interesse político; os 60 % restantes vêm de mecanismos diretos, como maior confiança e engajamento imediato.
Resumo geral
Esse exemplo mostra, de maneira substantiva, o que o seu modelo de mediação revelou:
O tratamento atua de dois modos — diretamente sobre o resultado e indiretamente, ao modificar um mediador-chave que também influencia o resultado.
Agora, você vai integrar as duas regressões que estimou
(med_model e out_model) em uma única análise
de mediação causal.
# Mediação
med_out = mediate(med_model, out_model, treat = "T", mediator = "M", boot = TRUE)
## Running nonparametric bootstrap
summary(med_out)
##
## Causal Mediation Analysis
##
## Nonparametric Bootstrap Confidence Intervals with the Percentile Method
##
## Estimate 95% CI Lower 95% CI Upper p-value
## ACME 0.39146 0.23509 0.58208 < 2.2e-16 ***
## ADE 0.60413 0.34938 0.86663 < 2.2e-16 ***
## Total Effect 0.99558 0.71972 1.26602 < 2.2e-16 ***
## Prop. Mediated 0.39319 0.25287 0.59097 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Sample Size Used: 300
##
##
## Simulations: 1000
Vamos entender cada parte:
med_out = mediate(med_model, out_model, treat = "T", mediator = "M", boot = TRUE)
summary(med_out)
mediate() (do pacote mediation)
combina:
med_model : modelo do mediador (M ~ T)
out_model : modelo do desfecho (Y ~ T + M)
treat = "T" : identifica a variável de
tratamento.
mediator = "M" : identifica o mediador.
boot = TRUE : usa bootstrap para calcular
intervalos de confiança robustos (recomendado).
O objeto med_out guarda as estimativas;
summary(med_out) imprime os resultados.
O summary(med_out) mostra (nomes em inglês padrão):
| Quantidade | Significado | Interpretação |
|---|---|---|
| ACME (Average Causal Mediation Effect) | Efeito indireto (T → M → Y) | Quanto do efeito total de T em Y passa via M. |
| ADE (Average Direct Effect) | Efeito direto (T → Y, mantendo M fixo) | Parte do efeito de T que não passa por M. |
| Total Effect | ACME + ADE | Impacto total de T em Y. |
| Prop. Mediated | ACME ÷ Total | Proporção do efeito total explicada pelo mediador. |
Ele também traz:
Erros-padrão,
Intervalos de confiança (por bootstrap),
p-valores.
Você já tinha:
| Caminho | Valor aproximado |
|---|---|
| Efeito de T em M | 0.60 |
| Efeito de M em Y | 0.65 |
| Efeito direto de T em Y (controlando M) | 0.60 |
Da conta manual:
Indireto ≈ 0.60 × 0.65 ≈ 0.39
Direto ≈ 0.60
Total ≈ 0.99.
O mediate() fará exatamente essa decomposição de forma
formal e com intervalos de confiança.
summary(med_out)Você vai encontrar algo parecido com:
Causal Mediation Analysis
ACME (indirect effect): 0.39 95% CI [0.30, 0.48]
ADE (direct effect): 0.60 95% CI [0.42, 0.78]
Total Effect: 0.99 95% CI [0.83, 1.15]
Prop. Mediated: 0.40
Isso significa:
0.39 unidades (≈40 %) do efeito total do tratamento em Y acontecem porque T aumenta M, que por sua vez aumenta Y.
0.60 unidades (≈60 %) do efeito total vêm de mecanismos diretos, que não passam pelo mediador.
Resumo em uma frase
Essa etapa aplica o método mediate() para estimar
formalmente o efeito direto, o efeito indireto (mediação) e a proporção
mediada, fornecendo intervalos de confiança e p-valores que consolidam
toda a análise causal.
explicando os números e trazendo um exemplo substantivo em Ciência Política.
| Medida | Valor | Interpretação |
|---|---|---|
| ACME (Average Causal Mediation Effect) | 0.39 | Efeito indireto: quanto do impacto do tratamento (T) em Y se dá por meio do mediador M. |
| ADE (Average Direct Effect) | 0.60 | Efeito direto: quanto do impacto de T em Y não passa pelo mediador M. |
| Total Effect | 0.99 | Soma de ACME + ADE: efeito total do tratamento sobre Y. |
| Prop. Mediated | 0.39 | Proporção do efeito total que é explicada pela via mediadora M. |
As colunas de intervalo de confiança (95 %) mostram a incerteza das estimativas, e os p-valores muito pequenos (<2.2e-16) indicam que todos os efeitos são estatisticamente diferentes de zero.
Em palavras:
O tratamento aumenta o desfecho Y em cerca de 1 ponto no total.
Aproximadamente 40 % desse efeito ocorre indiretamente, através de mudanças no mediador M; os 60 % restantes vêm de mecanismos diretos.
Imagine um estudo sobre participação política on-line:
T (tratamento): participar de um debate on-line organizado por um partido.
M (mediador): interesse político do eleitor, medido em escala padronizada.
Y (desfecho): intenção de comparecer às urnas (0 a 10).
Aplicando a interpretação dos números:
| Efeito | Explicação prática |
|---|---|
| ACME ≈ 0.39 | Participar do debate aumenta o interesse político, e esse maior interesse leva a um acréscimo de ~0.4 ponto na intenção de votar. |
| ADE ≈ 0.60 | Mesmo mantendo o interesse político fixo, a simples participação no debate gera um aumento direto de ~0.6 ponto na intenção de voto (por exemplo, por criar compromissos sociais, aumentar confiança no processo eleitoral ou dar maior visibilidade ao eleitor). |
| Total Effect ≈ 0.99 | No conjunto, quem participa do debate tem, em média, um ponto a mais na intenção de votar do que quem não participa. |
| Prop. Mediated ≈ 0.39 | Cerca de 40 % do impacto total decorre da via T → M → Y. |
O tratamento funciona de dois modos:
Diretamente, gerando engajamento imediato.
Indiretamente, ao aumentar o interesse político, que por sua vez eleva a intenção de votar.
Em termos de desenho de políticas públicas, isso mostra que uma intervenção voltada a despertar interesse político é uma peça importante (responde por 40 % do impacto), mas não esgota todo o caminho causal: o próprio ato de participar do debate também exerce um efeito direto e relevante.
Esse é exatamente o tipo de evidência que a análise de mediação busca: quais mecanismos explicam a eficácia de uma intervenção e em que proporção cada um contribui para o resultado final.
O ‘mediate()’ possui comandos que permintem trazer o resultado de do ACE, ADE, Total Effect e Prob. mediated, caso não queira analisar pela tabela da regrassão.
Excelente ponto — o professor está mostrando como ligar os cálculos
manuais com os resultados formais do mediate().
mediate)coef(out_model)["T"] ### isso corresponde ao NDE (efeito direto), que não passa pelo mecanismo
## T
## 0.6041279
summary(med_out)$z.avg ### Prova (ADE no mediate)
## [1] 0.6041279
No out_model (Y ~ T + M):
Esse é o coeficiente de T em Y quando controlamos M.
Interpretação: é o efeito de T sobre Y não passando pelo mediador.
No mediate(), esse mesmo número aparece como ADE
(Average Direct Effect), acessado por: summary(med_out)$z.avg
mediate)coef(med_model)["T"] * coef(out_model)["M"]
## T
## 0.3914552
### isso correspondeo ao NIE (efeito indireto, que passa pelo mecanismo causal)
### reparem que é a porção de T que explica M com a porção de M que explica Y
summary(med_out)$d.avg ### Prova (ACME no mediate)
## [1] 0.3914552
É calculado como: coef(med_model)[“T”] * coef(out_model)[“M”]
coef(med_model)["T"]: efeito de T sobre M (primeiro
modelo).
coef(out_model)["M"]: efeito de M sobre Y (segundo
modelo).
O produto é o efeito indireto: quanto T aumenta M, que por sua vez aumenta Y.
No mediate(), esse valor aparece como ACME (Average
Causal Mediation Effect): summary(med_out)$d.avg
Para provar que a intuição “manual” bate com a estatística formal
do pacote mediation.
O mediate() é mais robusto porque gera ICs via
bootstrap e lida com não-linearidades, mas a essência está nessa conta
simples.
O professor está comparando:
NDE ≈ coef(T em Y | M) ↔︎ ADE no mediate()
NIE ≈ coef(T em M) × coef(M em Y) ↔︎ ACME no
mediate()
Isso mostra que o modelo de mediação é, no fundo, uma
decomposição de efeitos:
Efeito Total = NDE+ NIE
É o efeito total estimado do tratamento (T) sobre o resultado (Y), que combina tanto a parte direta quanto a indireta.
summary(med_out)$tau.coef
## [1] 0.9955831
#### OU melhor, NDE + NIE
coef(out_model)["T"] + coef(med_model)["T"] * coef(out_model)["M"]
## T
## 0.9955831
Por que isso é importante?
Estamos mostrando que os três números fundamentais se encadeiam:
NDE / ADE = impacto direto de T em Y, não passando por M.
NIE / ACME = impacto indireto, via M.
Total Effect = soma dos dois.
Ou seja, o mediate() só formaliza aquilo que já está
implícito nos dois modelos lineares (M ~ T e
Y ~ T + M).
Resumo:
O efeito total pode ser obtido de duas maneiras:
Diretamente com tau.coef do
mediate().
Ou decompondo como NDE + NIE.
Essa é a prova de que a decomposição da mediação está funcionando
corretamente.
ade.1 = coef(out_model)["T"]
ade.2 = summary(med_out)$z.avg
acme.1 = coef(med_model)["T"] * coef(out_model)["M"]
acme.2 = summary(med_out)$d.avg
et.1 = summary(med_out)$tau.coef
et.2 = coef(out_model)["T"] + coef(med_model)["T"] * coef(out_model)["M"]
df_est = tibble(
Tipo = rep(c("NDE", "NIE", "Efeito Total"), each = 2),
Estimativa = c(ade.1, ade.2, acme.1, acme.2, et.1, et.2),
Método = rep(c("Regressão", "Mediação"), times = 3))
# Data frame
mediation_graph = ggplot(df_est, aes(x = Tipo, y = Estimativa, fill = Método)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.6), width = 0.5) +
scale_fill_manual(values = c("Regressão" = "#0072B2", "Mediação" = "#D55E00")) +
labs(title = "Comparação entre estimativas de efeitos causais",
x = "Tipo de Efeito",
y = "Estimativa",
fill = "") +
theme_minimal(base_size = 14) +
theme(axis.text.x = element_text(size = 10),
axis.text.y = element_text(size = 12),
axis.title = element_text(size = 14),
plot.title = element_text(size = 14),
plot.subtitle = element_text(size = 13),
strip.text.x = element_text(size = 10),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line(colour = "black"),
legend.text = element_text(size = 14),
legend.position = "bottom")
mediation_graph
O que vemos no gráfico
Efeito Total
As duas barras (laranja e azul) são praticamente idênticas, em torno de 1.
Isso mostra que tanto o método da mediação quanto o cálculo direto de regressão dão o mesmo efeito global do tratamento em Y.
NDE (Natural Direct Effect)
Também coincidem (~0.6).
Indica que o efeito direto estimado pelo mediate() e
pelo coeficiente de T no out_model são
equivalentes.
NIE (Natural Indirect Effect)
De novo, praticamente iguais (~0.39).
Ou seja, o efeito indireto (T→M→Y) é consistente tanto pelo cálculo manual (produto dos coeficientes) quanto pelo método formal de mediação.
Robustez: o gráfico demonstra que os resultados
obtidos manualmente (regressões) e pelo pacote mediation
convergem. Isso reforça que a decomposição em efeitos direto e indireto
está correta.
Confiança: como os dois caminhos dão a mesma resposta, você pode interpretar os efeitos sabendo que não dependem do “jeito” de calcular.
Substantivamente:
O tratamento aumenta Y em ~1 unidade no total.
Desse total, ~0.6 vem de efeito direto, e ~0.39 via mediador.
Cerca de 40% do efeito total é explicado pelo mecanismo mediador.
Resumo em uma frase
O gráfico mostra que os efeitos total, direto e indireto estimados pelo modelo de mediação formal e pelo cálculo manual via regressão são praticamente idênticos — confirmando a validade da decomposição causal e dando mais confiança na interpretação dos mecanismos.