Interflex

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

Diagnóstico

s1: dummy e efeito marginal linear

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'

s2: Tratamento contínuo e efeito marginal linear

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'

s3: Tratamento Dummy e efeito marginal não linear

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.

Interação com Bins

O segundo passo do diagnóstico é a regressão com termo de interação com bins, a variável moderadora será separada em tercis.

s1: Tratamento dummy com termo de interação

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

s2: Tratamento contínuo com termo de interação

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

s3: Tratamento dummy com termo de interação

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

Kernel

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