* REPLICATION CODE
* Noam Lupu
* Party Brands and Partisanship
* Revised June 2012


*********************************************************************
* STATA code
**********************************************************************

clear
use "AJPS_brands_data.dta"


** Comparison of treatment groups
mlogit formulario age female income educgrp


** Average treatment effects (Table A3)

* Difference-of-means/proportions
prtest pid if formulario==2 | formulario==1, by(formulario)
prtest pid if formulario==3 | formulario==1, by(formulario)
prtest pid if formulario==4 | formulario==1, by(formulario)
ttest pidstr if formulario==2 | formulario==1, by(formulario) unequal welch
ttest pidstr if formulario==3 | formulario==1, by(formulario) unequal welch
ttest pidstr if formulario==4 | formulario==1, by(formulario) unequal welch
ttest polar if formulario==1 | formulario==2, by(formulario) unequal welch
ttest polar if formulario==1 | formulario==3, by(formulario) unequal welch
ttest polar if formulario==1 | formulario==4, by(formulario) unequal welch
ttest mandate if (formulario==1 | formulario==2), by(formulario) unequal welch
ttest mandate if (formulario==1 | formulario==3), by(formulario) unequal welch
ttest mandate if (formulario==1 | formulario==4), by(formulario) unequal welch

* Wilcoxon rank-order test
ranksum pid if (formulario==2 | formulario==1), by(formulario)
ranksum pid if (formulario==3 | formulario==1), by(formulario)
ranksum pid if (formulario==4 | formulario==1), by(formulario)
ranksum pidstr if (formulario==2 | formulario==1), by(formulario)
ranksum pidstr if (formulario==3 | formulario==1), by(formulario)
ranksum pidstr if (formulario==4 | formulario==1), by(formulario)
ranksum polar if (formulario==1 | formulario==2), by(formulario)
ranksum polar if (formulario==1 | formulario==3), by(formulario)
ranksum polar if (formulario==1 | formulario==4), by(formulario)
ranksum mandate if (formulario==1 | formulario==2), by(formulario)
ranksum mandate if (formulario==1 | formulario==3), by(formulario)
ranksum mandate if (formulario==1 | formulario==4), by(formulario)

* Fligner-Policello rank-order test
fprank pid if (formulario==2 | formulario==1), by(formulario)
fprank pid if (formulario==3 | formulario==1), by(formulario)
fprank pid if (formulario==4 | formulario==1), by(formulario)
fprank pidstr if (formulario==2 | formulario==1), by(formulario)
fprank pidstr if (formulario==3 | formulario==1), by(formulario)
fprank pidstr if (formulario==4 | formulario==1), by(formulario)
fprank polar if (formulario==1 | formulario==2), by(formulario)
fprank polar if (formulario==1 | formulario==3), by(formulario)
fprank polar if (formulario==1 | formulario==4), by(formulario)
fprank mandate if (formulario==1 | formulario==2), by(formulario)
fprank mandate if (formulario==1 | formulario==3), by(formulario)
fprank mandate if (formulario==1 | formulario==4), by(formulario)


** Regression analyses of average treatment effects, without covariates (Table A4)
probit pid frm2 frm3 frm4, robust
reg pidstr frm2 frm3 frm4, robust
oprobit pidstr frm2 frm3 frm4, robust
reg polar frm2 frm3 frm4, robust
reg mandate frm2 frm3 frm4, robust
oprobit mandate frm2 frm3 frm4, robust


** Regression analyses of average treatment effects, with covariates (Table A5)
probit pid frm2 frm3 frm4 info educgrp age female cordoba, robust
reg pidstr frm2 frm3 frm4 info educgrp age female cordoba, robust
oprobit pidstr frm2 frm3 frm4 info educgrp age female cordoba, robust
reg polar frm2 frm3 frm4 info educgrp age female cordoba, robust
reg mandate frm2 frm3 frm4 info educgrp age female cordoba, robust
oprobit mandate frm2 frm3 frm4 info educgrp age female cordoba, robust


** Complier average causal effects (Table A6)
gen time2 = 0 if time!=.
replace time2 = 1 if time>1 & time!=. & frm2==1
gen time3 = 0 if time!=.
replace time3 = 1 if time>1 & time!=. & frm3==1
gen time4 = 0 if time!=.
replace time4 = 1 if time>1 & time!=. & frm4==1

ivregress 2sls pid (time2 time3 time4 = frm2 frm3 frm4), robust


** Conditional average treatment effects (age)  **CORRECTED**
gen agegrp=1 if age<35 & age!=.
replace agegrp=2 if age>34 & age<66 & age!=.
replace agegrp=3 if age>65 & age!=.

anova pid agegrp##frm2 if formulario==1 | formulario==2
test  (_cons + i1.agegrp + i1.frm2 + i1.agegrp#i1.frm2) - (_cons + i1.agegrp + i0.frm2 + i1.agegrp#i0.frm2) = (_cons + i3.agegrp + i1.frm2 + i3.agegrp#i1.frm2) - (_cons + i3.agegrp + i0.frm2 + i3.agegrp#i0.frm2)

anova pid agegrp##frm3 if formulario==1 | formulario==3
test  (_cons + i1.agegrp + i1.frm3 + i1.agegrp#i1.frm3) - (_cons + i1.agegrp + i0.frm3 + i1.agegrp#i0.frm3) = (_cons + i3.agegrp + i1.frm3 + i3.agegrp#i1.frm3) - (_cons + i3.agegrp + i0.frm3 + i3.agegrp#i0.frm3)

anova pidstr agegrp##frm2 if formulario==1 | formulario==2
test  (_cons + i1.agegrp + i1.frm2 + i1.agegrp#i1.frm2) - (_cons + i1.agegrp + i0.frm2 + i1.agegrp#i0.frm2) = (_cons + i3.agegrp + i1.frm2 + i3.agegrp#i1.frm2) - (_cons + i3.agegrp + i0.frm2 + i3.agegrp#i0.frm2)

anova pidstr agegrp##frm3 if formulario==1 | formulario==3
test  (_cons + i1.agegrp + i1.frm3 + i1.agegrp#i1.frm3) - (_cons + i1.agegrp + i0.frm3 + i1.agegrp#i0.frm3) = (_cons + i3.agegrp + i1.frm3 + i3.agegrp#i1.frm3) - (_cons + i3.agegrp + i0.frm3 + i3.agegrp#i0.frm3)


** Conditional average treatment effects (political information)  **CORRECTED**
anova pid info##frm2 if formulario==1 | formulario==2
test  (_cons + i0.info + i1.frm2 + i0.info#i1.frm2) - (_cons + i0.info + i0.frm2 + i0.info#i0.frm2) = (_cons + i2.info + i1.frm2 + i2.info#i1.frm2) - (_cons + i2.info + i0.frm2 + i2.info#i0.frm2)

anova pid info##frm3 if formulario==1 | formulario==3
test  (_cons + i0.info + i1.frm3 + i0.info#i1.frm3) - (_cons + i0.info + i0.frm3 + i0.info#i0.frm3) = (_cons + i2.info + i1.frm3 + i2.info#i1.frm3) - (_cons + i2.info + i0.frm3 + i2.info#i0.frm3)

anova pidstr info##frm2 if formulario==1 | formulario==2
test  (_cons + i0.info + i1.frm2 + i0.info#i1.frm2) - (_cons + i0.info + i0.frm2 + i0.info#i0.frm2) = (_cons + i2.info + i1.frm2 + i2.info#i1.frm2) - (_cons + i2.info + i0.frm2 + i2.info#i0.frm2)

anova pidstr info##frm3 if formulario==1 | formulario==3
test  (_cons + i0.info + i1.frm3 + i0.info#i1.frm3) - (_cons + i0.info + i0.frm3 + i0.info#i0.frm3) = (_cons + i2.info + i1.frm3 + i2.info#i1.frm3) - (_cons + i2.info + i0.frm3 + i2.info#i0.frm3)


** Export data for analysis in R
outsheet using "AJPS_brands_replication.txt", comma replace



*********************************************************************
* R code
**********************************************************************

library(mediation)
library(RItools)

survey <- read.delim(file="AJPS_brands_replication.txt", , sep = ",", header=T)
attach(survey)

s <- 1000


# Hansen and Bowers omnibus balance test
balance <- xBalance(formulario ~ age + female + educgrp + income, data=survey, report="all")
balance


# Delete observations with missing values
med.pid.polar2 <- as.data.frame(na.omit(subset(survey, formulario==1 | formulario==2, select=c(pid, polar, frm2, info, educgrp, female, age, cordoba))))
med.pid.polar3 <- as.data.frame(na.omit(subset(survey, formulario==1 | formulario==3, select=c(pid, polar, frm3, info, educgrp, female, age, cordoba))))
med.pid.polar4 <- as.data.frame(na.omit(subset(survey, formulario==1 | formulario==4, select=c(pid, polar, frm4, info, educgrp, female, age, cordoba))))
med.pid.mandate2 <- as.data.frame(na.omit(subset(survey, formulario==1 | formulario==2, select=c(pid, mandate, frm2, info, educgrp, female, age, cordoba))))
med.pid.mandate3 <- as.data.frame(na.omit(subset(survey, formulario==1 | formulario==3, select=c(pid, mandate, frm3, info, educgrp, female, age, cordoba))))
med.pid.mandate4 <- as.data.frame(na.omit(subset(survey, formulario==1 | formulario==4, select=c(pid, mandate, frm4, info, educgrp, female, age, cordoba))))


# Average causal mediation effects (Table A7)
model.m <- lm(polar ~ frm2 + info + educgrp + female + age + cordoba, data=med.pid.polar2)
model.y <- glm(pid ~ frm2 + polar + info + educgrp + female + age + cordoba, data=med.pid.polar2, family=binomial(link="probit"))
out1 <- mediate(model.m, model.y, sims=s, boot=TRUE, treat="frm2", mediator="polar")
summary(out1)

model.m <- lm(polar ~ frm3 + info + educgrp + female + age + cordoba, data=med.pid.polar3)
model.y <- glm(pid ~ frm3 + polar + info + educgrp + female + age + cordoba, data=med.pid.polar3, family=binomial(link="probit"))
out2 <- mediate(model.m, model.y, sims=s, boot = TRUE, treat="frm3", mediator="polar")
summary(out2)

model.m <- lm(polar ~ frm4 + info + educgrp + female + age + cordoba, data=med.pid.polar4)
model.y <- glm(pid ~ frm4 + polar + info + educgrp + female + age + cordoba, data=med.pid.polar4, family=binomial(link="probit"))
out3 <- mediate(model.m, model.y, sims=s, boot = TRUE, treat="frm4", mediator="polar")
summary(out3)

model.m <- lm(mandate ~ frm2 + info + educgrp + female + age + cordoba, data=med.pid.mandate2)
model.y <- glm(pid ~ frm2 + mandate + info + educgrp + female + age + cordoba, data=med.pid.mandate2, family=binomial(link="probit"))
out4 <- mediate(model.m, model.y, sims=s, boot = TRUE, treat="frm2", mediator="mandate")
summary(out4)

model.m <- lm(mandate ~ frm3 + info + educgrp + female + age + cordoba, data=med.pid.mandate3)
model.y <- glm(pid ~ frm3 + mandate + info + educgrp + female + age + cordoba, data=med.pid.mandate3, family=binomial(link="probit"))
out5 <- mediate(model.m, model.y, sims=s, boot = TRUE, treat="frm3", mediator="mandate")
summary(out5)

model.m <- lm(mandate ~ frm4 + info + educgrp + female + age + cordoba, data=med.pid.mandate4)
model.y <- glm(pid ~ frm4 + mandate + info + educgrp + female + age + cordoba, data=med.pid.mandate4, family=binomial(link="probit"))
out6 <- mediate(model.m, model.y, sims=s, boot = TRUE, treat="frm4", mediator="mandate")
summary(out6)

