May 19, 2016

Random graphs (83): Quadratic by continuous interaction


unzipfile ZA4582_v1-0-0.dta.zip

use ZA4582_v1-0-0.dta, clear

// Fix variables
// Life satisfaction
recode v545 ( 0 =  0 "Completely dissatisfied") ///
            (10 = 10 "Completely satisfied") ///
            (96 = .a "Not asked") ///
            (99 = .b "No response") ///
           , gen(lsat)
label var lsat "Life satisfaction"

// Household income (OECD)
recode v924 (99996 = .d "Can't be determined") ///
            (99997 = .a "Refused") ///
            (    0 =  0 "No income") ///
            (99998 = .b "Don't know") ///
            (99999 = .c "No response") ///
           , gen(income)
label var income "Income"

// Age, truncated at 99.9th percentile
recode v729 (997 = .a "Refused") ///
            (999 = .b "No Response"), gen(age)
label var age "Age"
qui centile(age), centile(99.9)
replace  age = r(c_1) if age > r(c_1) & !missing(age)

// Fit model
regress lsat c.age##c.age##c.income

// Calculate income percentiles
centile(income), centile(10 25 50 75 90)
local r10 = r(c_1)
local r25 = r(c_2)
local r50 = r(c_3)
local r75 = r(c_4)
local r90 = r(c_5)

// Calculate margins
margins, at(age=(20 (5) 90) income=(`r10' `r50' `r75' `r90'))

// Plot
marginsplot, recastci(rarea) ciopts(color(gs12)) ///
             ytitle("Predicted life satisfaction") ///
             legend(order(8 "90th percentile" ///
                          7 "75th percentile" ///
                          6 "50th percentile" ///
                          5 "10th percentile") ring(0) pos(11) ///
                   title("Equivalized household income", size(*.7))) ///
             xtitle("Age") ylab(, format(%6.1f)) title("") ///
             note(" " "{it:Source:} German General Social Survey (Allbus), doi: 10.4232/1.12439" ///
                  "{it:Note:} Gray-shaded areas denote 95% confidence intervals.", span)

erase ZA4582_v1-0-0.dta