Neste tutorial vamos aprender como usar o pacote interflex desenvolvido por Hainmueller et al (2020). Acesse o guia desenvolvido pelos autores para mais detalhes sobre o pacote.
Talvez você tenha dificuldade em instalar o pacote na sua máquina. Tente executar o código abaixo, é normal que demore muito.
#instalando interflex
install.packages('interflex', type = "source", repos = 'http://cran.us.r-project.org')
Se não conseguir tente essa outra opção, instale primeiro o devtools se já não estiver instalado.
#instalando interflex do Github
install.packages('devtools', repos = 'http://cran.us.r-project.org')
devtools::install_github('xuyiqing/interflex')
Se não conseguir instalar nenhum dos pacotes, crie uma conta free no RStudio Cloud e tente executar o código lá. A interface é bem similar ao RStudio que temos na nossa máquina.
Após instalar o pacote, o carregue e os dados também. Os autores criaram dados simulados, no guia do pacote você encontrará informações sobre como os dados foram gerados.
# carregando o pacote
library(interflex)
## ## Syntax has changed since v.1.1.1.
## ## See http://bit.ly/interflex for more info.
## ## Comments and suggestions -> yiqingxu@stanford.edu.
#carregando os dados
data(interflex)
# listando os datasets
ls()
## [1] "s1" "s2" "s3" "s4" "s5"
Os autores construíram cinco datasets com dados simulados. Acesse o (guia)[https://yiqingxu.org/software/interaction/RGuide.html] para saber como eles foram gerados e entender mais sobre o pacote. O dataset s1 tem um tratamento dicotômico com efeito marginal linear. No s2 tem um tratamento contínuo com efeito marginal linear. No s3 o tratamento é dicotômico e o efeito marginal não é linear. Os s4 e s5 tem também efeitos fixos.
Veja as primeiras linhas dos datasets s1, s2 e s3 e depois as estatísticas descritivas das variáveis.
head(s1)
## Y D X Z1
## 1 0.2144121 0 2.420043 3.984780
## 2 -1.4206178 1 2.046721 1.775262
## 3 -3.5288275 1 2.820571 3.709726
## 4 -7.5818338 1 4.009808 2.890780
## 5 -2.9622259 1 3.023627 4.782608
## 6 -4.6888431 1 2.350972 2.756555
summary(s1)
## Y D X Z1
## Min. :-15.518 Min. :0.000 Min. :-0.3961 Min. :0.1357
## 1st Qu.: -6.201 1st Qu.:0.000 1st Qu.: 2.2764 1st Qu.:2.2768
## Median : -3.834 Median :0.000 Median : 2.9599 Median :2.9496
## Mean : -4.015 Mean :0.485 Mean : 2.9851 Mean :2.8876
## 3rd Qu.: -1.757 3rd Qu.:1.000 3rd Qu.: 3.7272 3rd Qu.:3.5213
## Max. : 6.158 Max. :1.000 Max. : 6.1959 Max. :5.1537
O primeiro passo do diagnóstico, de acordo com Hainmueller et al (2020), é plotar um gráfico de correlação com uma reta de regressão e uma outra LOESS, devemos comparar as duas. Como o s1 é uma dummy com efeito linear, vamos plotar a relação de X com Y com base no valor de D (0,1), então, serão dois gráficos. Preste atenção na linha de regressão linear e a LOESS e avalie se o efeito marginal é mesmo linear.
#checando a funcao
?inter.raw
#plotando o gráfico
inter.raw(Y = "Y", D = "D", X = "X", data = s1, weights = NULL, Ylabel = "Outcome", Dlabel = "Treatment", Xlabel="Moderator", main = "Raw Plot", cex.main = 1.2)
## Use fully moderated model.
## `geom_smooth()` using formula 'y ~ x'
Quando o tratamento é contínuo plotamos a relação entre ele (D) e Y por tercil da variável moderadora (X). Quando a colocamos em ordem crescente e depois separamos em três intervalos, temos os tercis (baixo, médio e alto). Veja se a relação entre o tratamento e o Y é linear (y ~x) em cada tercil da variável Moderadora (X).
inter.raw(Y = "Y", D = "D", X = "X", data = s2, Ylabel = "Outcome", Dlabel = "Treatment", Xlabel="Moderator", theme.bw = TRUE, show.grid = FALSE)
## Use fully moderated model.
## `geom_smooth()` using formula 'y ~ x'
Veja como a diferença entre a reta de regressão linear (azul) e a reta LOESS (vermelha) fica mais evidente no gráfico abaixo. Veja a seção sobre efeito marginal do guia no (Simulated Examples)[https://yiqingxu.org/software/interaction/RGuide.html] dos autores e tente pensar em como você faria a interação nesse caso.
O segundo passo do diagnóstico é a regressão com termo de interação com bins, a variável moderadora será separada em tercis.
out <- interflex(Y = "Y", D = "D", X = "X", Z = "Z1", data = s1, estimator = 'binning', vartype = "robust", main = "Marginal Effects", ylim = c(-15, 15))
## Baseline group not specified; choose treat = 0 as the baseline group.
## Use a fully moderated model.
out$graph
Para fazer a interação com regressão linear sem bins basta especificar estimator = “linear” dentro da função interflex().
out2 <- interflex(Y = "Y", D = "D", X = "X", Z = "Z1", data = s1, estimator = 'linear', vartype = "robust", main = "Marginal Effects", ylim = c(-15, 15))
## Baseline group not specified; choose treat = 0 as the baseline group.
## Use a fully moderated model.
## Use a linear interaction model
out2$graph
Para aumentar o número de bins usamos o argumento nbins = n, onde n é o número de bins. O argumento Xunif = TRUE deixa a distribuição uniforme da variável moderadora que é plotada na parte inferior do gráfico.
out <- interflex(Y = "Y", D = "D", X = "X", Z = "Z1", data = s1, estimator = 'binning', nbins = 4, theme.bw = TRUE, Xunif = TRUE)
## Baseline group not specified; choose treat = 0 as the baseline group.
## Use a fully moderated model.
out$graph
Com o argumento cutoffs = c(1, 2, 3, 4, 5) podemos ter mais controle sobre onde começa e termina nossos intervalos.
out <- interflex(Y = "Y", D = "D", X = "X", Z = "Z1", data = s2, estimator = 'binning', cutoffs = c(1,2,4,5))
## Use a fully moderated model.
out$graph
O exemplo a seguir difere dos outros, porque o efeito marginal não é linear.
out <- interflex(Y = "Y", D = "D", X = "X", Z = "Z1", data = s3, estimator = 'binning')
## Baseline group not specified; choose treat = 0 as the baseline group.
## Use a fully moderated model.
out$graph
Ao invés de fazer a regressão com bins poderíamos usar o método kernel, todavia ele é muito custoso computacionalmente, por isso, não vou reproduzi-los aqui. Veja como os autores fazem no Guia e tentem reproduzir, não consegui rodar no RStudio Cloud, mas talvez vocês consigam.
Referência:interflex: User’s Guide