************************************************************** *** Veto Player Theory and Reform Making in Western Europe *** European Journal of Political Research *** Stata replication do-file (v1) *** Authors: Angelova, Bäck, Müller, Strobl *** Website: https://staatswissenschaft.univie.ac.at/team/institutsvorstand/wolfgang-c-mueller/ *** Correspondence: daniel.strobl@univie.ac.at *** Date: 2017-08-01 *** v1.1: removed unused variables *************************************************************** /* Variable description (for in-depth description see main text): -------------------------------------------------------------- reformMeasures: count of the number of reform measures per country/year (DV) polMeasure1-4: count of the number of reform measures by policy areas recession: dummy variable indicating negative GDP growth jobCrisis: dummy variable indicating high unemployment (> 11.6 %) alternation: absolute distance between seat-weighted cabinet position and position of cabinets in the previous 4 years (CMP/MARPOR data) ideologicalRange: absolute distance between the most leftist and rightist parties in cabinet ideologicalRangeInst: ideological range between government parties when including institutional veto players in the definition (following Tsebelis 1999) mwc: dummy variable indicating whether cabinet is minimal winning mwcInst: dummy variable indicating minimal winning cabinets when including institutional veto players in the definition (following Tsebelis 1999) yearsToElection: years until next scheduled election electionYear: dummy variable indicating election years fractionDays: Fraction of days cabinet was in office that year */ ******************* *** Preparation *** ******************* clear set more off * install package dependencies (this automatically replaces old packages, so make sure to uncomment if this is unwanted!) ssc install devr2, replace ssc install estout, replace * optionally set your working directory and start logging here * cd "..." * log "VPT_reformdata_replication.smcl" * load the dataset use "VPT_reformdata_SFB_v1.dta" * drop 1 observation without positional data (= Italian Dini cabinet) keep if !missing(ideologicalRange) * make global macros with the variables of the seven main models we'll estimate multiple times global m1_ivars recession jobCrisis mwc yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global m2_ivars alternation mwc yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global m3_ivars ideologicalRange mwc yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global m4_ivars recession jobCrisis alternation mwc yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global m5_ivars recession jobCrisis ideologicalRange mwc yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global m6_ivars recession jobCrisis ideologicalRange alternation mwc yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global m7_ivars recession jobCrisis c.ideologicalRange##i.mwc alternation yearsToElection electionYear fractionDays countryDummies1-countryDummies12 global modlist m1 m2 m3 m4 m5 m6 m7 * set our panel structure xtset country year ******************** *** Descriptives *** ******************** * label stacked variables for plotting label var stackedMeasure1 "Social" // = social policy measures label var stackedMeasure2 "Taxation" // = social + taxation policy measures label var stackedMeasure3 "Labor market" // = social + taxation + labor policy measures label var stackedMeasure4 "Economy" // = social + taxation + labor + economic policy measures * graph of number of reform measures by policy area twoway area stackedMeasure4 stackedMeasure3 stackedMeasure2 stackedMeasure1 year if year >= 1985 & year <= 2005, /// by(country) ylabel(0(25)50) ytitle("Number of reform measures") * Table with descriptives estpost tabstat reformMeasures $m6_ivars, s(mean sd min p25 p50 p75 max) c(s) esttab, cells("mean(fmt(2)) sd(fmt(2)) min(fmt(2)) p50(fmt(2)) max(fmt(2))") label ************************************************ *** Estimate main models (negative binomial) *** ************************************************ // xtset country year foreach mod in $modlist { nbreg reformMeasures $`mod'_ivars, cluster(country) irr est sto `mod'NB } esttab m?NB, label se b(2) scalar(ll aic) sfmt(0) nomtitles replace eform drop(countryDummies*) ************************************** *** Predictive power (main models) *** ************************************** foreach mod in $modlist { est restore `mod'NB estat ic // the devr2 module only works with glm, so we need to reestimate the models. qui glm reformMeasures $`mod'_ivars, cluster(country) link(log) family(nb `e(alpha)') devr2 } **************************************************** *** Estimate and plot effect sizes (main models) *** **************************************************** * helper variables for plotting gen marker = "|" gen ten = 10 * Ideological range predicted est restore m6NB qui su ideologicalRange qui margins, at(ideologicalRange=(`r(min)'(.1)`r(max)')) marginsplot, recast(line) recastci(rarea) plotopts(lwidth(thick)) legend(off) /// addplot(scatter ten ideologicalRange, ms(none) mlab(marker) mlabpos(0)) xlabel(0(1)5) aspectratio(1) title("Model 6") name(range_effect1, replace) est restore m7NB qui su ideologicalRange qui margins, at(ideologicalRange=(`r(min)'(.1)`r(max)') mwc =(0 1)) marginsplot, recast(line) recastci(rarea) plotopts(lwidth(thick)) /// addplot(scatter ten ideologicalRange, ms(none) mlab(marker) mlabpos(0)) xlabel(0(1)5) aspectratio(1) title("Model 7") name(range_effect2, replace) graph close range_effect1 range_effect2 graph combine range_effect1 range_effect2 * Alternation est restore m6NB qui su alternation qui margins, at(alternation=(`r(min)'(.1)`r(max)')) marginsplot, recast(line) recastci(rarea) plotopts(lwidth(thick)) legend(off) /// addplot(scatter ten alternation, ms(none) mlab(marker) mlabpos(0)) aspectratio(1) name(alt_effect, replace) * Average marginal effects (AME table) est restore m6NB margins, dydx(ideologicalRange alternation recession jobCrisis) est restore m7NB margins, dydx(ideologicalRange) at (mwc=(0 1)) margins, dydx(alternation recession jobCrisis) **************************************************************** *** Robustness checks (see online supplementary information) *** **************************************************************** * GEE models (autocorrelation) foreach mod in $modlist { // we need to reestimate ML models to get alpha parameter & exclude Italy due to gaps in time series qui nbreg reformMeasures $`mod'_ivars if country !=8, cluster(country) irr local alpha = e(alpha) xtgee reformMeasures $`mod'_ivars if country !=8, corr(ar1) fam(nb `alpha') robust eform est sto `mod'GEE } esttab m?GEE, label se b(2) scalar(nbalpha) sfmt(0) drop(countryDummies*) nomtitles replace eform * Random effects models (omit country fixed effects) menbreg reformMeasures recession jobCrisis mwc yearsToElection electionYear fractionDays || country:, irr est sto m1RE menbreg reformMeasures alternation mwc yearsToElection electionYear fractionDays || country:, irr est sto m2RE menbreg reformMeasures ideologicalRange mwc yearsToElection electionYear fractionDays || country:, irr est sto m3RE menbreg reformMeasures recession jobCrisis alternation mwc yearsToElection electionYear fractionDays || country:, irr est sto m4RE menbreg reformMeasures recession jobCrisis ideologicalRange mwc yearsToElection electionYear fractionDays || country:, irr est sto m5RE menbreg reformMeasures recession jobCrisis ideologicalRange alternation mwc yearsToElection electionYear fractionDays || country:, irr est sto m6RE menbreg reformMeasures recession jobCrisis c.ideologicalRange##i.mwc alternation yearsToElection electionYear fractionDays || country:, irr est sto m7RE esttab m?RE, label se b(2) scalar(ll aic) sfmt(0) nomtitles replace eform * Models with institutional veto player definition (other variables for ideological range and mwc dummy) nbreg reformMeasures recession jobCrisis mwcInst yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m1NB_inst nbreg reformMeasures alternation mwcInst yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m2NB_inst nbreg reformMeasures ideologicalRangeInst mwcInst yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m3NB_inst nbreg reformMeasures recession jobCrisis alternation mwcInst yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m4NB_inst nbreg reformMeasures recession jobCrisis ideologicalRangeInst mwcInst yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m5NB_inst nbreg reformMeasures recession jobCrisis ideologicalRangeInst alternation mwcInst yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m6NB_inst nbreg reformMeasures recession jobCrisis c.ideologicalRangeInst##i.mwcInst alternation yearsToElection electionYear fractionDays countryDummies1-countryDummies12, cluster(country) irr est sto m7NB_inst esttab m?NB_inst, label se b(2) scalar(ll aic) sfmt(0) nomtitles replace eform drop(countryDummies*) * sub-sample analysis excluding economic measures and years 1987-1992 (for EC countries) from analysis * the variable stackedMeasure3 is used in the plot above and is a count of social, taxation, and labor policy measures preserve drop if !inlist(country,1,4,13) & inrange(year,1987,1992) foreach mod in $modlist { nbreg stackedMeasure3 $`mod'_ivars, cluster(country) irr est sto `mod'NB_noecon } restore esttab m?NB_noecon, label se b(2) scalar(ll aic) sfmt(0) drop(countryDummies*) nomtitles replace eform * close log if you started one above * log close