B.2 Código para o Cálculo de Estimativas
B.2.4 Pareamento e Balanceamento dos Modelos Ajustados com PAC
De forma análoga ao que foi feito acima, tomemos agora os modelos ajustados na subseção B.2.2 para pareamento e verificação do balanceamento no banco pareado, mas incorporando o PAC. Note que o banco das crianças terá uma observação a menos em relação ao caso IID. O banco dos adultos ainda é o mesmo, mas o vetor de escores preditos usado para pareamento é outro
set.seed(2017)
par.cp = Match(Tr = ym.c.p$crit, X = esc.cp, M = 1, caliper = 0.2, replace = T, ties = F)
set.seed(2017)
par.ap = Match(Tr = ym.adu$crit, X = esc.ap, M = 1, caliper = 0.2, replace = T, ties = F)
par.cp$index.control; which(duplicated(par.cp$index.control) == F) par.ap$index.control; which(duplicated(par.ap$index.control) == F) par.cp$ndrops.matches #Todos os indivíduos tratados são pareados. par.ap$ndrops.matches #Todos os indivíduos tratados são pareados. ym.par.cp = ym.c.p[c(par.cp$index.treated, par.cp$index.control),] ym.par.ap = ym.adu[c(par.ap$index.treated, par.ap$index.control),]
Como estamos considerando o PAC, um objeto alternativo que contenha as suas informações apenas para os dados pareados deve ser criado, para ambos os grupos etários. Antes de criá-lo, devemos remover as observações que são únicas em suas províncias (1º nível de estratificação) no banco pareado, como feito para o banco completo
count(ym.par.cp$f5) #Apenas um indivíduo representa a província de Aden. count(ym.par.ap$f5) #No grupo dos adultos, todas as províncias têm dois
#ou mais indivíduos representando cada uma.
which(ym.par.cp$f5 == "aden") #Indivíduo da linha 144 do banco pareado, #que é controle.
ym.par.cp = ym.par.cp[-c(28, 144),] #Como o banco é pareado, eliminamos #também os contrafatuais.
count(ym.par.cp$f5) #Todas as 14 províncias restantes têm pelo menos 2 #indivíduos que as representam cada uma.
ym.par.cp$crit #Os indivíduos tratados agora estão entre as linhas 1 e #117 (inclusive).
Criando o objeto que contém as informações do PAC para os bancos completos (pois inserimos vetores de escores preditos) e pareados de crianças e adultos
d.re.c = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl, nest = TRUE, data = ym.c.p)
d.re.a = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl, nest = TRUE, data = ym.adu)
d.par.c = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl, nest = TRUE, data = ym.par.cp)
d.par.a = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl, nest = TRUE, data = ym.par.ap)
Verificando que o suporte dos escores preditos é comum para indivíduos tratados e controles
par(mfrow = c(1,2))
hist(ym.par.cp[c(1:117),]$esc.cp, breaks = 10, main = "",
xlab = "Escores dos Tratados Pareados", ylab = "Frequência", col = "gray", border = "black", axes = F)
axis(side = 1); axis(side = 2, las = 1, line = -.4)
hist(ym.par.cp[c(118:234),]$esc.cp, breaks = 10, main = "",
xlab = "Escores dos Controles Pareados", ylab = "Frequência", col = "gray", border = "black", axes = F)
axis(side = 1); axis(side = 2, las = 1, line = -.4) par(mfrow = c(1,2))
hist(ym.adu[c(par.ap$index.treated),]$esc.ap, breaks = 10, main = "", xlab = "Escores dos Tratados Pareados", ylab = "Frequência", col = "gray", border = "black", axes = F)
axis(side = 1); axis(side = 2, las = 1, line = -.4)
hist(ym.adu[c(par.ap$index.control),]$esc.ap, breaks = 10, main = "", xlab = "Escores dos Controles Pareados", ylab = "Frequência", col = "gray", border = "black", axes = F)
axis(side = 1); axis(side = 2, las = 1, line = -.4)
Podemos enfim fazer os testes de balanceamento considerando o PAC da pesquisa YNSPMS. Iniciando novamente pelo grupo das crianças, temos que
svychisq(~crit + charit.x.x, design = d.re.c)$statistic svychisq(~crit + cri.d.avi, design = d.re.c)$statistic svychisq(~crit + charit.x.x, design = d.re.c)$p.value svychisq(~crit + cri.d.avi, design = d.re.c)$p.value
svyranktest(esc ~ crit, design = d.re.c, test = "wilcoxon")$statistic svyranktest(esc ~ crit, design = d.re.c, test = "wilcoxon")$p.value svychisq(~crit + charit.x.x, design = d.par.c)$statistic
svychisq(~crit + cri.d.avi, design = d.par.c)$statistic svychisq(~crit + charit.x.x, design = d.par.c)$p.value svychisq(~crit + cri.d.avi, design = d.par.c)$p.value
svyranktest(esc ~ crit, design = d.par.c, test = "wilcoxon")$statistic svyranktest(esc ~ crit, design = d.par.c, test = "wilcoxon")$p.value svyttest(esc ~ crit, design = d.re.c)
svyttest(esc ~ crit, design = d.par.c)
Para o banco pareado, a covariável CRDAI não está balanceada nas classes de indivíduos tratados e controles pareados pelo escore de propensão, pois o teste χ2 rejeita a hipótese nula de independência ao nível nominal de 5%. Neste caso, teremos que refazer a análise desde a modelagem para o escore de propensão, mas agora especificando somente DRC como covariável dentre as presentes no modelo m2.cp. Temos então que
mcp.1 = svyglm(crit ~ charit.x.x, family = binomial(link = logit), design = d.re.c)
summary(mcp.1); esc.cp.1 = fitted.values(mcp.1); count(esc.cp.1) hist(esc.cp.1, breaks = 10, main = "", xlab = "Escores Preditos",
ylab = "Frequência", col = "gray", border = "black", axes = F) axis(side = 1); axis(side = 2, las = 1, line = -.4)
ym.c.p = cbind(ym.c.p, esc.cp.1)
O intercepto e a covariável DRC continuam significativos e o PATFI é respeitado. É muito provável que DRC esteja balanceada ao final dos testes de balanceamento no banco pareado. Para confirmar isto, fazemos
rm(mcp.1) set.seed(2017)
par.cp.1 = Match(Tr = ym.c.p$crit, X = esc.cp.1, M = 1, caliper = 0.2, replace = T, ties = F)
par.cp.1$ndrops.matches #Todos os indivíduos tratados são pareados. par.cp.1$index.control; which(duplicated(par.cp.1$index.control) == F); ym.par.cp.1 = ym.c.p[c(par.cp.1$index.treated, par.cp.1$index.control),] count(ym.par.cp.1$f5) #No novo banco pareado, temos um único in-
#divíduo pertencente à província da Cidade #de Sana’a.
which(ym.par.cp$f5 == "sana’a city") #Indivíduo da linha 6 do banco #pareado, que é tratado.
ym.par.cp = ym.par.cp[-c(6, 124),] #Como o banco é pareado, eliminamos #também os contrafatuais.
count(ym.par.cp$f5) #Todas as 13 províncias restantes têm pelo menos 2 #indivíduos que as representam cada uma.
ym.par.cp$crit #Os indivíduos tratados agora estão entre as linhas 1 e #117, inclusive.
par(mfrow = c(1,2))
hist(ym.par.cp[c(1:117),]$esc.cp.1, breaks = 10, main = "",
xlab = "Escores dos Tratados Pareados", ylab = "Frequência", col = "gray", border = "black", axes = F)
axis(side = 1); axis(side = 2, las = 1, line = -.4)
hist(ym.par.cp[c(118:234),]$esc.cp.1, breaks = 10, main = "", xlab = "Escores dos Controles Pareados", ylab = "Frequência", col = "gray", border = "black", axes = F)
Recriando os objetos do plano amostral para cada banco e fazendo os testes de balanceamento com o novo modelo, temos
d.re.c = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl, nest = TRUE, data = ym.c.p)
d.par.c = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl, nest = TRUE, data = ym.par.cp.1)
svychisq(~crit + charit.x.x, design = d.re.c)$statistic svychisq(~crit + charit.x.x, design = d.re.c)$p.value
svyranktest(esc ~ crit, design = d.re.c, test = "wilcoxon")$statistic svyranktest(esc ~ crit, design = d.re.c, test = "wilcoxon")$p.value svychisq(~crit + charit.x.x, design = d.par.c)$statistic
svychisq(~crit + charit.x.x, design = d.par.c)$p.value
svyranktest(esc ~ crit, design = d.par.c, test = "wilcoxon")$statistic svyranktest(esc ~ crit, design = d.par.c, test = "wilcoxon")$p.value svyttest(esc ~ crit, design = d.re.c)
svyttest(esc ~ crit, design = d.par.c)
Agora, temos que a covariável DRC está balanceada, o que também ocorria no banco pareado pelo modelo inicial (em que CRDAI estava especificada, mas não balanceada). Com relação aos escores preditos, estes também estão balanceados. Logo, o banco pareado pelos escores do modelo reduzido será utilizado na avaliação de impacto do SWF em TSAT no grupo das crianças, quando consideramos o PAC.
Para o grupo dos adultos, considerando o PAC, temos pelos testes χ2 e MW que d.re.a = svydesign(id = ~f15 + f1, strat = ~f5, weight = ~pl,
nest = TRUE, data = ym.adu)
d.par.a = svydesign(id = ~f15 + f1, strat = ~f5, #Apenas
weight = ~pl, nest = TRUE, #relembrando. data = ym.par.ap)
svychisq(~crit + charit.x.x, design = d.re.a)$statistic svychisq(~crit + poor.x.x, design = d.re.a)$statistic svychisq(~crit + inc, design = d.re.a)$p.value
svychisq(~crit + charit.x.x, design = d.re.a)$p.value svychisq(~crit + poor.x.x, design = d.re.a)$p.value
svyranktest(esc ~ crit, design = d.re.a, test = "wilcoxon")$statistic svyranktest(esc ~ crit, design = d.re.a, test = "wilcoxon")$p.value svychisq(~crit + inc, design = d.par.a)$statistic
svychisq(~crit + charit.x.x, design = d.par.a)$statistic svychisq(~crit + poor.x.x, design = d.par.a)$statistic svychisq(~crit + inc, design = d.par.a)$p.value
svychisq(~crit + charit.x.x, design = d.par.a)$p.value svychisq(~crit + poor.x.x, design = d.par.a)$p.value
svyranktest(esc ~ crit, design = d.par.a, test = "wilcoxon")$statistic svyranktest(esc ~ crit, design = d.par.a, test = "wilcoxon")$p.value svyttest(esc ~ crit, design = d.re.a)
svyttest(esc ~ crit, design = d.par.a)
todas as três covariáveis, bem como os escores preditos, estão balanceados. Logo, o modelo map, em sua especificação original, será usado para a avaliação de impacto do SWF em TSAT neste grupo, quando incorporamos o PAC na análise. Podemos salvar os bancos pareados que de fato estão balanceados
write.csv(ym.par.cp.1, "ynspmsParCriComPA.csv") write.csv(ym.par.ap, "ynspmsParAduComPA.csv")
e enfim prosseguir para os comandos da avaliação de impacto do SWF.