// Allbus 2018
use xr19 sex age isced97 eastwest german pt09 pt10 wghtpew bik using "ZA5272_v1-0-0.dta", clear
// Outcome: Trust in media
recode pt09 pt10 (-9 = .)
alpha pt09 pt10
scores trust = mean(pt09 pt10), nv(1)
label var trust "Trust in media"
drop pt09 pt10
// Treatment: Internet use
gen internet = (xr19 == 1) if !inlist(xr19, -9, -8)
label define internet 1 "Internet user" 0 "Internet non-user"
label val internet internet
drop xr19
// Gender
gen female = (sex == 2)
label var female "Female sex"
drop sex
// Age
recode age (-32 = .)
label var age "Age"
// Education
recode isced97 (-32 = .)
label define isced97 1 "Basic" 2 "Lower secondary" 3 "Upper secondary" 4 "Post-secondary" 5 "Tertiary first" 6 "Tertiary second", modify
label var isced97 "Education"
// East
generate east = (eastwest == 2)
label var east "Eastern Germany"
drop eastwest
// German
recode german (1 = 0) (2 = 0) (3 = 1) (-50 = 1), gen(foreign)
label var foreign "Foreign citizen"
drop german
// Region
recode bik (-34 = .)
label define bik 1 "-1,999 inh." ///
2 "2,000-4,999 inh." ///
3 "5,000-19,999 inh." ///
4 "Zone 1-4, -50,000 inh." ///
5 "Zone 2-4, -100,000 inh." ///
6 "Zone 1, -100,000 inh." ///
7 "Zone 2-4, -500,000 inh." ///
8 "Zone 1, -500,000 inh." ///
9 "Zone 2-4, 499,999+ inh." ///
10 "Zone 1, 499,999+ inh.", modify
label var bik "Commuting zone"
// Keep only complete cases
keep if !missing(trust, internet, female, age, isced97, east, foreign, bik)
// See how imbalanced covariates are
// Generate dummies for first table
foreach x of varlist isced97 bik { // Plug in categorical variables here
qui tab `x', gen(`x'x) // Create dummy variables
foreach var of varlist `x'x* {
local lab `: var label `var''
*di "`lab'" // Display label
*di strpos("`lab'", "==")
local i = strpos("`lab'", "==") + 2
local lab `: di substr("`lab'", `i', .)'
di "`lab'"
label var `var' " `lab'" // Add space to label
}
}
// Calculate means
eststo clear
estpost tabstat trust female isced97x* age foreign east bikx*, by(internet) ///
statistics(mean sd) ///
columns(statistics) ///
casewise
// Look at table
esttab, unstack cells(mean(fmt(2)) sd(fmt(2) par keep(trust age))) nonumber ///
label collabels("Mean (SD)/Prop.") modelwidth(25) varwidth(25) ///
refcat(isced97x1 "Education:" bikx1 "Communting zone:", nol)
drop isced97x* bikx* // Drop variables created for table
eststo clear
// Alternative approach
// Run desired model first
qui teffects ipw (trust) (internet east##(c.age##c.age) female foreign ib3.isced97 i.bik, logit)
// Table of covariates
tebalance summarize, baseline // Same table as created above
matrix before = r(table)
matrix list before
// Table of covariates after weighting
tebalance summarize
matrix after = r(table)
matrix list after
// Merge tables
matrix both = before, after
matrix list both
// Look at table
esttab matrix(both, fmt(2)), ///
label nomtitle ///
coeflabel(1.east "Eastern Germany" ///
age "Age" ///
c.age#c.age "Age X age" ///
1.east#c.age "Eastern Germany X age" ///
1.east#c.age#c.age "Eastern Germany X age X age") ///
refcat(1.isced97 "Education:" 2.bik "Commuting zone:", nol) ///
varwidth(30) modelwidth(18) ///
collabel("Control (mean)" "Treated (mean)" "Control (var.)" "Treated (var.)" "Std. diff." "Std. diff. weighted" "Var. ratio" "Var. ratio weighted")
// Omnibus test: tests hypothesis that treatment model balances the covariates
tebalance overid
// Check overlap
teffects overlap, xtitle(Propensity score Internet non-user) ///
ytitle(Density) ///
legend(order(1 "Internet non-user" 2 "Internet user") pos(2) ring(0))
// IPTW
eststo: teffects ipw (trust) (internet east##(c.age##c.age) female foreign ib3.isced97 i.bik, logit), ate
eststo: teffects ipw (trust) (internet east##(c.age##c.age) female foreign ib3.isced97 i.bik, logit), atet
// Doing things by hand:
// Calculate weight for IPTW, ATE
logit internet east##(c.age##c.age) female foreign ib3.isced97 i.bik
predict probab
generate wate = .
replace wate = 1/probab if internet == 1
replace wate = 1/(1 - probab) if internet == 0
// Calculate weight for IPTW, ATT
generate watt = .
replace watt = 1 if internet == 1
replace watt = probab/(1 - probab) if internet == 0
// IPTW by hand
eststo: regress trust i.internet [pw = wate]
eststo: regress trust i.internet [pw = watt]
esttab, b(2) se(2) keep(main:) drop(_cons) rename(r1vs0.internet 1.internet) ///
nobaselevels mtitles("IPTW ATE" "IPTW ATT" "IPTW ATE" "IPTW ATT") ///
mgroup("teffects" "regress", pattern(1 0 1 0))
// Doubly robust
eststo: teffects ipwra (trust east##(c.age##c.age) female foreign ib3.isced97 i.bik) ///
(internet east##(c.age##c.age) female foreign ib3.isced97 i.bik, logit)
eststo: teffects ipwra (trust east##(c.age##c.age) female foreign ib3.isced97 i.bik) ///
(internet east##(c.age##c.age) female foreign ib3.isced97 i.bik, logit), atet
esttab, b(2) se(2) keep(main:) drop(_cons) rename(r1vs0.internet 1.internet) ///
nobaselevels mtitles("IPTW ATE" "IPTW ATT" "IPTW ATE" "IPTW ATT" "IPTW RA ATE" "IPTW RA ATT") ///
mgroup("teffects ipw" "regress" "teffects ipwra", pattern(1 0 1 0 1 0))
// Doubly robust by hand
tempvar internet0a internet1a internet0b internet1b ate att
// ATE
regress trust east##(c.age##c.age) female foreign ib3.isced97 i.bik if !internet [pw = wate]
predict `internet0a'
regress trust east##(c.age##c.age) female foreign ib3.isced97 i.bik if internet [pw = wate]
predict `internet1a'
generate `ate' = (`internet1a' - `internet0a')
summarize `ate'
// ATT
regress trust east##(c.age##c.age) female foreign ib3.isced97 i.bik if !internet [pw = watt]
predict `internet0b'
regress trust east##(c.age##c.age) female foreign ib3.isced97 i.bik if internet [pw = watt]
predict `internet1b'
generate `att' = (`internet1b' - `internet0b')
summarize `att'