Tabela de Conteúdos

Atualizado em 04 de Agosto de 2020. O código pode ser baixado aqui.

Introdução

Em algumas situações podemos considerar o efeito indireto de alguma variável sobre um resultado ou resultado. Como exemplo, as más condições de vida em casa na infância podem diminuir os resultados da aprendizagem na escola, o que posteriormente tem um efeito negativo na qualidade de vida posterior, por exemplo, no rendimento vitalício. Noutro caso, podemos considerar uma única variável recolhida em vários momentos, de modo a que exista um efeito da variável no momento 1 no momento 2, e no momento 2 no momento 3. A idéia básica é algo como:

Em outras palavras, {\i1}mathcal{A}) leva a {\i1}mathcal{B}), e depois a {\i}mathcal{B}) leva a {\i}mathcal{C}). Com modelos de mediação, nós postulamos uma variável interveniente entre o caminho de resultado covariável normal (rightarrow) que poderíamos ter na configuração de regressão padrão, e estes modelos nos permitem investigar tais comportamentos. No acima, a variável interveniente, ou mediadora, é a variável matemática (B). É frequente que ainda possamos ter um efeito directo de (A) matemática sobre (C), mas tal como acontece com o modelo em geral, isto seria teoricamente motivado.

A análise da mediação é muito popular nas disciplinas das ciências sociais, embora de forma alguma restrita a estas, e normalmente conduzida sob o disfarce de modelação de equações estruturais (SEM), que por sua vez é uma orientação específica de modelos gráficos mais gerais1. O modelo gráfico de um modelo de mediação pode parecer-se com o seguinte.

>

Neste caso, a e b reflectem o caminho indirecto do efeito do \\i(X) sobre o resultado através do mediador, enquanto c' é o efeito direto de \(\mathrm{X}) sobre o resultado após o caminho indireto ter sido removido (c seria o efeito antes de postar o efeito indireto, e cc' é igual ao efeito indireto). O efeito total de \(\mathrm{X}}) é o efeito indireto e direto combinado.

Devo notar algumas coisas com base no que vejo na consulta através de dezenas de disciplinas. Para começar, parece que muito poucas pessoas que pensam que precisam de um modelo de mediação realmente o fazem. Por exemplo, se você não consegue pensar no seu modelo em termos temporais ou físicos, de tal forma que {X}(mathrm{X}) necessariamente leva ao mediador, o que então necessariamente leva ao resultado, você provavelmente não precisa de um modelo de mediação. Se você pudesse ver as setas indo em qualquer direção, novamente, você provavelmente não precisa de tal modelo. Além disso, se ao descrever o seu modelo, todos pensam que você está falando de uma interação (também conhecida como moderação), você pode não precisar disso. E finalmente, como se pode suspeitar, se não houver uma forte correlação entre as variáveis chave (\mathrm{X}}) e o mediador (caminho a), e se não houver uma forte correlação entre o mediador e o(s) resultado(s) (caminho b), você provavelmente não precisa disto. Embora nada o impeça de fazer análise de mediação, sem tais pré-requisitos, você certamente terá um modelo fraco e provavelmente mais confuso do que você teria.

Em suma, a mediação funciona melhor quando existem conexões causais fortemente implícitas entre as variáveis. Mesmo assim, tal modelo deve ser comparado com um modelo mais simples de não mediação2. Em qualquer caso, existem algumas maneiras muito fáceis de investigar tais modelos em R, e esse é o objetivo aqui, apenas para demonstrar como você pode começar.

Data

Para demonstração de modelos de mediação com os diferentes pacotes, vamos usar o conjunto de dados dos trabalhos que vem com o pacote de mediação. Aqui está a descrição.

Job Search Intervention Study (JOBS II). JOBS II é uma experiência de campo randomizada que investiga a eficácia de uma intervenção de formação profissional em trabalhadores desempregados. O programa foi concebido não só para aumentar o reemprego entre os desempregados, mas também para melhorar a saúde mental das pessoas que procuram emprego. Na experiência de campo do JOBS II, 1.801 trabalhadores desempregados receberam um questionário de pré-triagem e foram então designados aleatoriamente para grupos de tratamento e controle. Os participantes do grupo de tratamento participaram de oficinas de habilidades de trabalho. Nas oficinas, os respondentes aprenderam habilidades de busca de emprego e estratégias para lidar com os contratempos no processo de busca de emprego. Aqueles na condição de controle receberam um folheto descrevendo dicas para a procura de emprego. Em entrevistas de acompanhamento, as duas variáveis-chave de resultado foram uma medida contínua de sintomas depressivos baseada na Hopkins Symptom Checklist, e uma variável binária, representando se o respondente tinha se tornado empregado.

Aqui está uma descrição das variáveis nesta demonstração. Há outras disponíveis que você também pode querer brincar com.

  • econ_hard: Nível de dificuldade económica com valores de 1 a 5.
  • sexo: Variável indicadora para sexo. 1 = feminino
  • idade: Idade em anos.
  • educação: Factor com cinco categorias para o nível de escolaridade.
  • emprego_escolha: Uma escala contínua medindo o nível de auto-eficácia da procura de emprego com valores de 1 a 5. A variável mediadora.
  • depress2: Medida de sintomas depressivos pós-tratamento. A variável de resultado.
  • tratar: Variável indicadora de se o participante foi seleccionado aleatoriamente para o programa de formação JOBS II. 1 = atribuição à participação.
data(jobs, package = 'mediation')

Modelo

Dados estes dados os modelos para o mediador e o resultado são os seguintes:

>

Assim esperamos que o treinamento de habilidades de trabalho tenha um efeito negativo sobre a depressão (ou seja, um aumento do bem-estar), mas pelo menos parte disso seria devido a um efeito positivo na procura de emprego.

Como um modelo gráfico, podemos descrevê-lo sucintamente da seguinte forma.

Packages

Vamos olhar para os seguintes pacotes para demonstrar como se pode conduzir uma análise de mediação em R:

  • mediação
  • lavaan
  • psych
  • brms

Embora estes sejam o foco, também vou notar algumas outras alternativas, incluindo Python e Stata.

mediação

Começaremos com o pacote de mediação, pois basicamente não requer mais capacidade de programação para conduzir do que se possui já a partir da execução de modelos de regressão padrão em R. O pacote fornece o efeito de mediação causal médio, definido como segue no arquivo de ajuda e artigos do Imai3:

O efeito de mediação causal médio (ACME) representa a diferença esperada no resultado potencial quando o mediador tomou o valor que perceberia sob a condição de tratamento em oposição à condição de controle, enquanto o estado do tratamento em si é mantido constante.

Note como esta definição é focada nos valores esperados ou previstos condicional ao valor do tratamento. Esta noção de contrafactuais, ou como seria a observação sob o cenário oposto, tem uma longa história na modelagem neste ponto. Pense desta forma, se alguém estiver no grupo de tratamento, eles teriam um valor específico para o mediador e, dado que, então, teriam um valor específico esperado para o resultado. No entanto, poderíamos colocar a mesma observação que estar no grupo de controle também, e avaliar o efeito sobre o resultado através do mediador da mesma forma. Podemos avaliar os resultados potenciais mantendo o tratamento constante. Pensar em mudanças nos resultados dado o valor do mediador não faz nenhuma suposição sobre o tipo de modelo. É assim que o pacote de mediação é capaz de incorporar diferentes modelos para o mediador vs. o resultado. Por exemplo, o mediador pode ser binário, requerendo um modelo de regressão logística, enquanto o modelo de resultado pode ser um modelo de sobrevivência.

No nosso exemplo, vamos ficar pelos modelos lineares padrão (normais). Note também, que enquanto nosso tratamento é uma variável binária, isto se generaliza para o caso contínuo, onde consideramos o resultado de um movimento de uma unidade sobre o ‘tratamento’. Para que o pacote de mediação funcione, nós simplesmente executamos os nossos respectivos modelos para o mediador e resultado, depois usamos a função mediadora para obter o resultado final.

library(mediation)model_mediator <- lm(job_seek ~ treat + econ_hard + sex + age, data = jobs)model_outcome <- lm(depress2 ~ treat + econ_hard + sex + age + job_seek, data = jobs)# Estimation via quasi-Bayesian approximation?mediatemediation_result <- mediate( model_mediator, model_outcome, sims = 500, treat = "treat", mediator = "job_seek")detach(package:mediation)detach(package:MASS)

summary(mediation_result)plot(mediation_result)
Estimativa 95% CI Inferior 95% CI Superior p-valor
ACME -0.016 -0.038 0.009 0.220
ADE -0.045 -0.127 0.047 0.292
Efeito Total -0.061 -0,149 0,027 0,188
Prop. mediado 0.226 -3.222 1.596 0.344

Os resultados acima demonstram que a ACME não é estatisticamente distinta de zero, ou nenhuma mediação. O efeito directo médio é negativo mas também não é estatisticamente notável, nem o efeito total (efeito indirecto + efeito directo). Também é fornecida a ‘proporção mediada’, que é a razão entre o efeito indireto e o total. No entanto, esta não é uma proporção, e pode até ser negativa, e por isso é na maioria das vezes um número sem sentido.

Pros

  • Modelos standard R e sintaxe
  • Múltiplos tipos de modelos para ambos mediador e resultado
  • Fornece múltiplos resultados simultaneamente
  • Bom documentação e artigos associados estão disponíveis gratuitamente
  • Pode fazer mediação ‘moderada’

Limitações

  • Uso de MASS4
  • Modelos de efeitos aleatórios simples
  • Funcionalidade talvez limitada com algumas complexidades do modelo
  • Sem capacidades de variáveis latentes

lavaan

No caso específico em que tanto a mediação como os modelos de resultados são modelos lineares padrão com uma distribuição normal para a variável alvo, o efeito indireto é equivalente ao produto dos caminhos a e b do diagrama anterior. O efeito direto é o caminho c'. Uma comparação do efeito direto autônomo, que poderíamos chamar de c, versus este efeito direto estimado no modelo de mediação c', é tal que c - c' = a*b. O que foi mencionado anteriormente pode agora ser mais claro, se ou a ou b são quase zero, então o efeito indireto só pode ser quase zero, então é prudente investigar tais relações de antemão.

Esta abordagem do produto de caminhos (ou diferença nos coeficientes) é a que vamos tomar com o pacote de lavaan, e de fato, a partir desta escrita, esta é a nossa única maneira de lidar com isso. lavaan é especificamente orientada para a modelagem de equações estruturais, tais como análise de fatores, modelos de crescimento e modelos de mediação como estamos conduzindo aqui, e é altamente recomendada para tais modelos. Embora se limite ao caso do modelo linear padrão para avaliar a mediação, é a única das nossas ferramentas que pode incorporar variáveis latentes prontamente5. Por exemplo, poderíamos ter nosso resultado de depressão como uma variável latente subjacente aos itens individuais do questionário. Além disso, também poderíamos incorporar múltiplos mediadores e múltiplos resultados.

Para manter as coisas como temos discutido, eu vou rotular os caminhos a, b e c' na lavaan de acordo com como eles foram retratados anteriormente. Caso contrário a lavaan é muito fácil de usar, e no caso das variáveis observadas, usa a notação padrão da fórmula R para os modelos. Além disso, definimos os efeitos de interesse que queremos calcular com o operador :=. Especificamos o modelo na sua totalidade como uma simples string de caracteres, depois usamos a sem função para fazer a análise.

library(lavaan)sem_model = ' job_seek ~ a*treat + econ_hard + sex + age depress2 ~ c*treat + econ_hard + sex + age + b*job_seek # direct effect direct := c # indirect effect indirect := a*b # total effect total := c + (a*b)'model_sem = sem(sem_model, data=jobs, se='boot', bootstrap=500)summary(model_sem, rsq=T) # compare with ACME in mediation
lavaan 0.6-6 ended normally after 25 iterations Estimator ML Optimization method NLMINB Number of free parameters 11 Number of observations 899 Model Test User Model: Test statistic 0.000 Degrees of freedom 0Parameter Estimates: Standard errors Bootstrap Number of requested bootstrap draws 500 Number of successful bootstrap draws 500Regressions: Estimate Std.Err z-value P(>|z|) job_seek ~ treat (a) 0.066 0.049 1.332 0.183 econ_hard 0.053 0.024 2.242 0.025 sex -0.008 0.047 -0.163 0.870 age 0.005 0.002 1.934 0.053 depress2 ~ treat (c) -0.040 0.044 -0.905 0.365 econ_hard 0.149 0.022 6.908 0.000 sex 0.107 0.038 2.831 0.005 age 0.001 0.002 0.332 0.740 job_seek (b) -0.240 0.030 -8.079 0.000Variances: Estimate Std.Err z-value P(>|z|) .job_seek 0.524 0.030 17.610 0.000 .depress2 0.373 0.022 17.178 0.000R-Square: Estimate job_seek 0.011 depress2 0.120Defined Parameters: Estimate Std.Err z-value P(>|z|) direct -0.040 0.045 -0.904 0.366 indirect -0.016 0.012 -1.324 0.185 total -0.056 0.046 -1.224 0.221

Vemos a mesma saída antes e podemos comparar o nosso parâmetro indirect com o ACME que tínhamos antes, o efeito direct é comparado com o ADE, e o total é comparado com o efeito total anterior. Os valores são essencialmente os mesmos.

Nota também que o output mostra o valor \(R^2\) para ambos os modelos. No caso de job_seek, podemos ver que a razão pela qual não estamos encontrando muito no caminho da mediação é porque os covariáveis envolvidos não explicam nenhuma variação no mediador para começar. Uma investigação preliminar ter-nos-ia poupado o trabalho neste caso.

Pros

  • Can handle multiple mediators
  • Can handle multiple ‘treatments’
  • Can handle multiple outcomes
  • Can use latent variables
  • Some multilevel support
  • Can do moderate mediation and mediated moderação (embora não para variáveis latentes)

Limitações

  • Requer uma codificação adicional para estimar o efeito indirecto
  • Efeitos aleatórios únicos
  • Embora os modelos pudessem incorporar variáveis binárias ou ordinais para o mediador/resultados, não existe uma forma directa de calcular o efeito indirecto na forma do pacote de mediação nessas definições.
  • >

PedidoSEM

>

O pacote por medidaSEM funciona de forma muito semelhante ao pacote de mediação. O bom disso em relação ao pacote de mediação é que o pacote SEM por via hermética pode lidar com tipos adicionais de modelos, assim como fornecer saída adicional (por exemplo, resultados padronizados), opções adicionais (por exemplo, resíduos correlatos de vários grupos) e visualização do modelo.

library(piecewiseSEM)model_mediator <- lm(job_seek ~ treat + econ_hard + sex + age, data = jobs)model_outcome <- lm(depress2 ~ treat + econ_hard + sex + age + job_seek, data = jobs)mediation_result <- psem(model_mediator, model_outcome, data = jobs)summary(mediation_result)
Structural Equation Model of mediation_result Call: job_seek ~ treat + econ_hard + sex + age depress2 ~ treat + econ_hard + sex + age + job_seek AIC BIC 26.000 88.417---Tests of directed separation: No independence claims present. Tests of directed separation not possible.Global goodness-of-fit: Fisher's C = 0 with P-value = 1 and on 0 degrees of freedom---Coefficients: Response Predictor Estimate Std.Error DF Crit.Value P.Value Std.Estimate job_seek treat 0.0656 0.0515 894 1.2748 0.2027 0.0425 job_seek econ_hard 0.0532 0.0246 894 2.1612 0.0309 0.0720 * job_seek sex -0.0076 0.0487 894 -0.1567 0.8755 -0.0052 job_seek age 0.0046 0.0023 894 1.9779 0.0482 0.0658 * depress2 treat -0.0403 0.0435 893 -0.9255 0.3550 -0.0291 depress2 econ_hard 0.1485 0.0208 893 7.1323 0.0000 0.2248 *** depress2 sex 0.1068 0.0411 893 2.5957 0.0096 0.0818 ** depress2 age 0.0006 0.0020 893 0.3306 0.7410 0.0104 depress2 job_seek -0.2400 0.0282 893 -8.4960 0.0000 -0.2682 *** Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05---Individual R-squared: Response method R.squared job_seek none 0.01 depress2 none 0.12

Podemos usar seus recursos de plotagem para criar uma visualização rápida do modelo.

plot(mediation_result)

Felizmente, não há uma maneira automática de calcular os efeitos indiretos no momento, então seria necessário inicializar os resultados manualmente.

Pros

  • Modelos standard R e sintaxe
  • Múltiplos tipos de modelos tanto para mediador como para resultado
  • alguns resultados ao estilo SEM (por exemplo ajuste, coeficientes padronizados, AIC)
  • Plotagem rápida de resultados
  • Pode manipular múltiplos mediadores, ‘tratamentos’, e resultados

Limitações

  • Não calcula automaticamente os efeitos indirectos
  • Sem capacidades de variáveis latentes

psic

O pacote psicológico aproveita o facto de, no caso do modelo linear padrão, se poder obter os resultados através dos modelos de regressão apropriados baseados apenas nas matrizes de covariância. É muito semelhante à lavaan, embora usando uma abordagem normal de mínimos quadrados em oposição à máxima verosimilhança. O bom aqui é uma sintaxe que permite focar apenas no efeito de interesse, ou incluir tudo, o que é bom se você estava interessado nos efeitos indiretos para as dificuldades econômicas, idade e sexo também.

Para esta demonstração vamos usar a versão limpa usando o -, em vez de +, para os efeitos de não tratamento. Isto só significa que eles estão incluídos com os modelos, mas os resultados não são mostrados em relação a eles. O mediador é identificado com (). Outro bônus é um gráfico rápido dos resultados, mostrando a diferença entre os efeitos diretos não ajustados e ajustados, e o intervalo de inicialização apropriado.

library(psych)mediation_psych = mediate( depress2 ~ treat + (job_seek) - econ_hard - sex - age, data = jobs, n.iter = 500)

mediation_psych
Mediation/Moderation Analysis Call: mediate(y = depress2 ~ treat + (job_seek) - econ_hard - sex - age, data = jobs, n.iter = 500)The DV (Y) was depress2* . The IV (X) was treat* . The mediating variable(s) = job_seek* . Variable(s) partialled out were econ_hard sex ageTotal effect(c) of treat* on depress2* = -0.06 S.E. = 0.05 t = -1.24 df= 895 with p = 0.21Direct effect (c') of treat* on depress2* removing job_seek* = -0.04 S.E. = 0.15 t = 14.91 df= 893 with p = 4.6e-45Indirect effect (ab) of treat* on depress2* through job_seek* = -0.02 Mean bootstrapped indirect effect = -0.02 with standard error = 0.01 Lower CI = -0.04 Upper CI = 0.01R = 1.07 R2 = 1.15 F = -3510.4 on 2 and 893 DF p-value: 1 To see the longer output, specify short = FALSE in the print statement or ask for the summary
summary(mediation_psych)
Call: mediate(y = depress2 ~ treat + (job_seek) - econ_hard - sex - age, data = jobs, n.iter = 500)Direct effect estimates (traditional regression) (c') depress2* se t df ProbIntercept 2.21 0.15 14.91 893 4.60e-45treat -0.04 0.04 -0.93 893 3.55e-01job_seek -0.24 0.03 -8.50 893 8.14e-17R = 1.07 R2 = 1.15 F = -3510.4 on 2 and 893 DF p-value: 1 Total effect estimates (c) depress2* se t df Probtreat -0.06 0.05 -1.24 895 0.215 'a' effect estimates job_seek se t df ProbIntercept 3.67 0.13 29.33 894 5.65e-133treat 0.07 0.05 1.27 894 2.03e-01 'b' effect estimates depress2* se t df Probjob_seek -0.24 0.03 -8.5 894 7.83e-17 'ab' effect estimates (through mediators) depress2* boot sd lower uppertreat -0.02 -0.02 0.01 -0.04 0.01

Os mesmos resultados, embalagem diferente, mas possivelmente o caminho mais fácil até agora, já que só requeria uma chamada de função. O pacote psicológico também lida com múltiplos mediadores e resultados como um bônus.

Pros

  • Sintaxeasiest, basicamente um modelo de uma linha
  • Plotagem rápida de resultados
  • Pode lidar com múltiplos mediadores, ‘tratamentos’, e resultados
  • Pode fazer mediação ‘moderada’

Limitações

  • Limitado ao modelo linear padrão (lm)
  • Uso da MASSA

brms

Para a nossa próxima demonstração chegamos ao que eu sinto ser o pacote mais poderoso, brms. O nome significa Bayesian Regression Modeling com Stan, e Stan é uma poderosa linguagem de programação probabilística para a análise Bayesiana. Eu não vou entrar em detalhes sobre a análise Bayesiana, mas fique à vontade para ver meu documento que faz.

Geralmente fazemos como fizemos antes, especificando o modelo mediador e o modelo de resultados. brms não faz nada de especial para análise de mediação, mas sua função de hipóteses pode nos permitir testar a abordagem produto-de-caminhos. Além disso, o pacote sjstats fornecerá essencialmente os resultados da mesma forma que o pacote de mediação faz para nós e, de qualquer forma, o pacote de mediação é basicamente uma tentativa de uma solução Bayesiana usando métodos frequentistas. Se tivéssemos distribuições diferentes para o resultado e mediador, teríamos um tempo relativamente fácil de obter estes valores médios de previsão e suas diferenças, já que as abordagens Bayesianas estão sempre pensando em distribuições preditivas posteriores. Em qualquer caso, aqui está o código.

library(brms)model_mediator <- bf(job_seek ~ treat + econ_hard + sex + age)model_outcome <- bf(depress2 ~ treat + job_seek + econ_hard + sex + age)med_result = brm( model_mediator + model_outcome + set_rescor(FALSE), data = jobs)save(med_result, file = 'data/mediation_brms.RData')
load('data/mediation_brms.RData')summary(med_result)
 Family: MV(gaussian, gaussian) Links: mu = identity; sigma = identity mu = identity; sigma = identity Formula: job_seek ~ treat + econ_hard + sex + age depress2 ~ treat + job_seek + econ_hard + sex + age Data: jobs (Number of observations: 899) Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1; total post-warmup samples = 4000Population-Level Effects: Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESSjobseek_Intercept 3.67 0.12 3.43 3.91 1.00 6699 3749depress2_Intercept 2.21 0.15 1.92 2.50 1.00 6174 3091jobseek_treat 0.07 0.05 -0.03 0.17 1.00 6322 2709jobseek_econ_hard 0.05 0.02 0.00 0.10 1.00 6266 2656jobseek_sex -0.01 0.05 -0.10 0.09 1.00 5741 2655jobseek_age 0.00 0.00 0.00 0.01 1.00 6539 2846depress2_treat -0.04 0.04 -0.12 0.04 1.00 5458 3102depress2_job_seek -0.24 0.03 -0.30 -0.18 1.00 5950 2938depress2_econ_hard 0.15 0.02 0.11 0.19 1.00 7543 3102depress2_sex 0.11 0.04 0.03 0.19 1.00 5599 2699depress2_age 0.00 0.00 -0.00 0.00 1.00 4555 2887Family Specific Parameters: Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESSsigma_jobseek 0.73 0.02 0.69 0.76 1.00 6639 3276sigma_depress2 0.61 0.01 0.59 0.64 1.00 6145 2987Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESSand Tail_ESS are effective sample size measures, and Rhat is the potentialscale reduction factor on split chains (at convergence, Rhat = 1).
# using brms we can calculate the indirect effect as follows# hypothesis(med_result, 'jobseek_treat*depress2_job_seek = 0')# sjstats provides similar printing as the mediation package# print(sjstats::mediation(med_result), digits=4)sjstats::mediation(med_result) %>% kable_df()
efeito valor hdi.baixo hdi.high
direct -0.039 -0.112 0.031
indirect -0.015 -0.036 0.005
mediador -0.240 -0.286 -0.193
total -0.055 -0.133 0.017
proporção mediada 0.277 -0.813 1.366

Na saída, qualquer coisa com jobseek_* é um resultado para o modelo mediador, enquanto que depress2_* é para o resultado. Temos a mesma velha história neste ponto, mas com a abordagem Bayesiana temos coisas mais divertidas para ver. Por exemplo, podemos ver que não estamos realmente capturando bem o desvirtuamento do resultado da depressão. Nossos valores previstos vs. os observados não combinam muito bem. Nós somos um pouco melhores para o mediador, mas talvez ainda um pouco altos com algumas das nossas previsões baseadas em modelos.

pp_check(med_result, resp = 'depress2') + ggtitle('Depression Outcome')

pp_check(med_result, resp = 'jobseek') + ggtitle('Mediator')

Pros

  • Sintaxe de vanguarda
  • Extremamente poderosa… Os modelos são na sua maioria limitados à imaginação
  • Basicamente faz o que o pacote de mediação aproxima-se
  • Todos os benefícios da inferência Bayesiana: diagnósticos, verificações preditivas posteriores, comparação de modelos, etc.

Limitações

  • Slower para estimar
  • Cálculos “à mão” necessários para ir além do modelo linear padrão, mas esta já é uma abordagem comum da perspectiva Bayesiana
  • Algo conforto com a abordagem Bayesiana necessária

Mais complexidade

Alguns dos pacotes mencionados podem lidar com modelos mais complexos ou fornecer abordagens adicionais para investigar efeitos indiretos.

Interacções

Alguns modelos envolvem interacções quer para o modelo de mediação quer para o resultado, e infelizmente isto é frequentemente referido como moderação mediada ou mediação moderada. Pessoalmente não vejo a vantagem de dar nomes ambíguos ao que de outra forma poderia ser um conceito simples (se ainda não for um modelo tão simples), mas esse navio navegou há muito tempo. Não vou entrar em detalhes, mas a idéia é que você pode ter um termo de interação em algum lugar no modelo, e a interação pode envolver a variável de tratamento, o mediador, ou ambos.

Suffice it to say, já que estamos usando ferramentas de modelagem padrão como lm e extensões dele, incorporar interações é trivial para todos os pacotes acima, mas o tipo de abordagem do produto de caminhos não se mantém (a*b != c').

Modelos Lineares Generalizados

Em alguns casos, nosso mediador ou resultado pode ser binário, contador, ou algo onde assumir uma distribuição normal pode não ser a melhor idéia. Ou podemos querer investigar relações não lineares entre o tratamento/mediador/resultado. Ou podemos ter dados que tenham observações correlacionadas, como medições repetidas ou similares. O pacote de mediação orgulha-se disso em particular, mas o brms pode fazer qualquer coisa e mais, embora você possa ter que fazer um pouco mais de trabalho para realmente calcular o resultado. lavaan pode realmente fazer um conjunto limitado de modelos para variáveis binárias e ordinais, mas obter a estimativa indireta apropriada exigiria uma abordagem muito entediante à mão.

Dados ausentes

Muitas vezes quando lidamos com tais dados, especialmente nas ciências sociais, faltam dados em qualquer uma das covariáveis. Às vezes podemos deixá-los cair se não houver muitos, mas em outros casos vamos querer fazer algo a respeito. Os pacotes lavaan, psych e brms fornecem uma ou mais maneiras de lidar com a situação (por exemplo, imputação múltipla).

Alternatives

Temos representado os modelos como redes de nós, com arcos/redes/percursos conectando-os. Nossa discussão gira em torno do que são chamados de Gráficos Acíclicos Direcionados (DAG), onde as setas só podem ir em uma direção, sem laços de feedback. O resultado de qualquer variável de resultado é uma função das setas que a precedem, e condicionalmente independente das outras. Alguns modelos teóricos podem relaxar isso, e outros podem não ter nenhuma seta, ou seja, são não direcionados, de modo que estamos interessados apenas nas conexões (por exemplo, com algumas redes sociais).

bnlearn

O pacote bnlearn permite a investigação de gráficos direcionados, parcialmente direcionados, e não direcionados. Em termos de DAGs, podemos usá-lo essencialmente para duplicar os modelos de mediação que temos vindo a discutir. O bom é que este pacote irá testar eficientemente os caminhos para inclusão ao invés de assumi-los, mas ainda podemos impor restrições teóricas conforme necessário. Não só podemos então procurar os caminhos de interesse de uma forma baseada em princípios com as redes bayesianas e a teoria do gráfico causal de Pearl como base, como também teremos ferramentas para evitar ainda mais o sobreajuste via validação cruzada.

Para o modelo inicial, vamos garantir que existem caminhos entre tratamento – mediador, tratamento – resultado, e mediador – resultado (a lista branca). Vamos proibir caminhos sem sentido como ter setas para o tratamento (que foi atribuído aleatoriamente), sexo, dificuldades económicas e idade (a lista negra). Caso contrário, veremos o que os dados sugerem.

whitelist = data.frame( from = c('treat', 'treat', 'job_seek'), to = c('job_seek', 'depress2', 'depress2'))blacklist = expand.grid( from = colnames(mediation_result$model.y$model), to = c('treat', 'sex', 'age', 'econ_hard'))# For simpler output we'll use treatment and sex as numeric (explained later)library(dplyr)jobs_trim = jobs %>% select(depress2, treat, econ_hard, sex, age, job_seek) %>% mutate( treat = as.numeric(jobs$treat), sex = as.numeric(jobs$sex) )# extract path coefficients if desired# parameters = bn.fit(model, jobs_trim)# parameters$job_seek# parameters$econ_hard# parameters$depress2

library(bnlearn)model = gs(jobs_trim, whitelist = whitelist, blacklist = blacklist)plot(model)

Vemos na trama que as coisas mudaram um pouco. Por exemplo, a idade agora só se refere à auto-eficácia na procura de emprego, e o sexo só tem efeito na depressão.

Se restringirmos os caminhos para serem apenas o que são nos nossos exemplos anteriores, obteríamos os mesmos resultados.

library(bnlearn)whitelist = data.frame( from = c('treat', 'age', 'sex', 'econ_hard', 'treat', 'job_seek', 'age', 'sex', 'econ_hard'), to = c('job_seek', 'job_seek','job_seek','job_seek', 'depress2', 'depress2', 'depress2', 'depress2', 'depress2'))blacklist = expand.grid( from = colnames(mediation_result$model.y$model), to = c('treat', 'sex', 'age', 'econ_hard')) model = gs(jobs_trim, whitelist = whitelist, blacklist = blacklist)plot(model)

parameters = bn.fit(model, jobs_trim)parameters$depress2$coefficients
 (Intercept) treat econ_hard sex age job_seek 2.2076414333 -0.0402647000 0.1485433818 0.1068048699 0.0006488642 -0.2399549527 
parameters$job_seek$coefficients
 (Intercept) treat econ_hard sex age 3.670584908 0.065615003 0.053162413 -0.007637336 0.004586492 

O principal a notar é que os parâmetros estimados são iguais ao que obtivemos com os pacotes anteriores. É essencialmente equivalente a usar lavaan com o estimador de máxima verosimilhança padrão.

Se usarmos tratamento e sexo como fatores, bnlearn produzirá modelos condicionais que são diferentes, dependendo do valor do fator tomado. Em outras palavras, um teria um modelo separado para quando treatment == 'treatment' e um para quando treatment == control. No nosso caso, isto seria idêntico a permitir que tudo interaja com o tratamento, por exemplo lm( job_seek ~ treat * (econ_hard + sex + age)), e do mesmo modo para o modelo de depressão. Isto estender-se-ia a qualquer variável binária potencial (por exemplo, incluindo sexo). Se o mediador é uma variável binária, isto é provavelmente o que gostaríamos de fazer.

Python

CSCAR director Kerby Shedden deu um workshop Python sobre modelos de mediação, por isso eu mostro aqui a implementação de modelos estatísmicos. Ele segue a abordagem Imai e assim pode ser visto como a versão Python do pacote de mediação. A saída é essencialmente a mesma que você teria usando o tratamento como variável fator, onde você obtém resultados separados para cada categoria de tratamento. Isto é desnecessário para a nossa demonstração, por isso pode apenas comparar os resultados ‘médios’ com os resultados do pacote de mediação anterior.

import statsmodels.api as smfrom statsmodels.stats.mediation import Mediationimport numpy as npimport pandas as pdoutcome_model = sm.OLS.from_formula("depress2 ~ treat + econ_hard + sex + age + job_seek", data = jobs)mediator_model = sm.OLS.from_formula("job_seek ~ treat + econ_hard + sex + age", data = jobs)med = Mediation(outcome_model, mediator_model, "treat", "job_seek")med_result = med.fit(n_rep = 500)print(np.round(med_result.summary(), decimals = 3))
 Estimate Lower CI bound Upper CI bound P-valueACME (control) -0.016 -0.048 0.014 0.332ACME (treated) -0.016 -0.048 0.014 0.332ADE (control) -0.043 -0.130 0.044 0.308ADE (treated) -0.043 -0.130 0.044 0.308Total effect -0.059 -0.144 0.029 0.208Prop. mediated (control) 0.241 -1.710 2.254 0.364Prop. mediated (treated) 0.241 -1.710 2.254 0.364ACME (average) -0.016 -0.048 0.014 0.332ADE (average) -0.043 -0.130 0.044 0.308Prop. mediated (average) 0.241 -1.710 2.254 0.364

Stata

Finalmente, eu forneço uma opção na Stata usando o seu comando sem. Stata facilita a obtenção dos efeitos indiretos neste exemplo, mas o faz para cada covariada, então a saída é um pouco verbosa para dizer o mínimo6. Para aqueles trabalhando com Stata, eles não precisam de um pacote SEM separado para obter estes tipos de resultados.

use "data\jobs.dta"sem (job_seek <- treat econ_hard sex age) (depress2 <- treat econ_hard sex age job_seek), cformat(%9.3f) pformat(%5.2f)estat teffects, compact cformat(%9.3f) pformat(%5.2f)

Sumário

Modelos com efeitos indiretos requerem cuidadosa consideração teórica a ser empregada na análise dos dados. Entretanto, se o modelo for apropriado para sua situação de dados, é bastante fácil obter resultados de uma variedade de pacotes em R. Além disso, não é necessário usar um pacote de modelagem de equações estruturais para conduzir uma análise com efeitos indiretos e, de fato, pode-se chegar longe usando a sintaxe padrão de R. Para estritamente observado, ou seja, nenhuma latente, variáveis, nenhuma ferramenta SEM é necessária, ou mesmo recomendada.

\\\49>

Comparação de pacotes resumida

A tabela seguinte pode ajudar a decidir qual pacote usar para suas necessidades dadas suas considerações teóricas.

* aproximadamente, com algumas advertências
mediação lavaan comparação de pacotes resumida psic brms
Automático -*
Múltiplo Treatments☺
Múltiplo Mediadores
Resultados Múltiplos
>Além de SLM†
Efeitos Aleatórios
Valores ausentes -*
Variáveis Latentes > -*
☺ Pode requerer aspectos de reprise do modelo
† Modelo linear padrão, como estimado por lm
  1. Eu tenho um documento muito mais detalhado sobre SEM, incluindo análise de mediação.︎

  2. Por alguma razão você não vê muito isso na prática, e se pergunta o que foi feito para tornar os dados amenizáveis a tal modelo se não fosse justificado.︎

  3. Imai torna seus artigos disponíveis em seu site.︎

  4. MASS foi substituído por outros por mais de uma década neste ponto, e a maioria tende apenas a sujar o seu tidyverse e outros pacotes quando ele é carregado. É um bom pacote (e era ótimo no passado), mas se você quiser usá-lo em um pacote, seria bom não carregá-lo (ou outros pacotes) no ambiente apenas para usar uma função ou duas. Eu só o vejo usado principalmente para mvrnorm (distribuição normal multivariada) e glm.nb, mas existem outros pacotes com essa funcionalidade que proporcionariam benefícios adicionais, e não mascarar funções dplyr, que estão entre as mais comumente usadas na comunidade R.︎

  5. brms está trabalhando nele.︎

  6. As opções no código estão lá para suprimir/minimizar o que pode ser.︎

Compartilhar:

Deixe uma resposta

O seu endereço de email não será publicado.