The Chinese Growth Differential

This months dramatic volatility in the Chinese stock market has raised the question once more about after twenty years of breakneck economic growth, China’s growth trajectory is sustainable. Many consider a correction of some sort to be inevitable (see for example Brad Delong here). One strategy to look for signs that this is happening is to look at various indicators of economic activity within China, as James Hamilton has done. It is also useful, though, to step back a bit to see what we think Chinese growth ought to look like given what we know about economic growth in the rest of the world.

I’ve done this by creating an empirical model of economic growth for all countries except for China. The model looks like this:

gyt-t0 = yit0 + Xit + Dt + Dr

where gyt-t0 is annual (geometric) growth in real GDP per capita over a five year period, yit0 is the initial level of real GDP per capita for that five year period, and Xit are the five-year averages of the other determinants of economic growth. Dt and Dr are period and region fixed effects, respectively. I’ve done this two ways, both including and excluding time and region effects. Naturally, country fixed effects would be nice, but including them effectively precludes me from being able to predict how Chinese growth might differ from growth elsewhere. So to be clear, any distinctive “Chinese” growth effect is captured in the “East Asia” dummy.

These are what I’d call “appropriately naive Barro regressions.” They follow in the spirit of Barro’s classic Determinants of Economic Growth in modeling economic growth as a function of initial per capita GDP in levels plus measures of human capital, government policy, macroeconomic conditions, and regime type. They differ in that they do not even attempt to untangle issues of causality. No three-stage least squares using lags, colonial history, and regional dummies as instruments, or anything of the sort. Hence these regressions are “naive,” but that is “appropriate.”

Using data from the World Development Indicators augmented by some additional variables from the QoG dataset, I estimated the two models described above for all countries in the world except for China. I then predicted what Chinese growth would look like using actual data from China. This gives us yearly predictions: in any year, given China’s level of per capita GDP and other variables, what is our best guess about its rate of growth in that year?

I have plotted the resulting predictions here. The black series is the prediction that includes region and time effects, and the blue series ignores these. The red solid line is China’s actual economic growth.
As you can see, since 1991 China has grown far faster than the appropriately naive model predicts. What is also true, though, is that the differences between China’s predicted and actual growth rates are narrowing considerably since 2011. This might be interpreted as a reversion to the “predicted” growth path based on the cross-national experience of the past forty years. What we observe, then, is a “Chinese growth differential.”
That differential was lower in 2014 than it had been since the aftermath of Tiananmen.

There are some other interesting things to note. The standard neoclassical growth model predicts convergence, in which countries growth rates slow as their GDPs rise. As Barro showed, the data do not support this simple story; they instead support a story of conditional convergence in which countries growth rates slow conditional on macroeconomic and political conditions (although see Rodrik recently and Quah not-so-recently for other views). The blue and black lines in the first graph above show a gentle increase in predicted growth rates. One interpretation of this is that, in a conditional convergence world, changes in living standards in China have actually outpacing the increases in GDP as determinants of economic growth. A wealthier China in 2010 should grow faster than China of 1990 due to the rapid increases in health and education.

What does this mean? Recall that this prediction model cannot account for anything particular to China. So as a result it cannot tell us if any such Chinese particularity is durable or not, or if recent growth has been atypical relative to what China’s growth should be like. The estimated differential is relative to a counterfactual of all other countries’ growth experiences, not relative to some counterfactual version of China.

But if we hold that caveat aside, as well as the problems of causal identification in naive (but appropriate!) growth regressions, it confirms that slower Chinese growth is to be expected. The interesting part is how this interacts with current events, in particular China’s stock market crisis and its political fallout. None of the above predictions suggests that a stock collapse is inevitable, but such a collapse might indeed hasten the shift toward to a more modest growth path. Check back in six months to see if that is the understatement of the year.


For R code to produce these graphs, please see the first comment. Here are the full model results for Model 1 and Model 2.

Dependent variable:
(1) (2)
log(GDPPC.Initial) -0.520*** -0.702***
(0.093) (0.121)
Fixed Capital Formation 0.154*** 0.153***
(0.010) (0.010)
Gov Final Cons Exp -0.060*** -0.055***
(0.012) (0.011)
Trade/GDP 0.008*** 0.011***
(0.002) (0.002)
Inflation -0.003*** -0.003***
(0.0003) (0.0003)
Life Expectancy 0.036** 0.036*
(0.017) (0.021)
Secondary Enrollment Rate 0.005 0.003
(0.005) (0.006)
Polity2 Score 0.043*** 0.044***
(0.015) (0.017)
Constant -0.054 3.199**
(0.863) (1.244)
Observations 867 867
R2 0.377 0.454
Adjusted R2 0.372 0.438
Residual Std. Error 2.447 (df = 858) 2.314 (df = 841)
F Statistic 65.009*** (df = 8; 858) 27.992*** (df = 25; 841)
Note: *p<0.1; **p<0.05; ***p<0.01

Comments 2

  1. tompepinsky August 27, 2015


    xwalk <- ISO_3166_1[,c("Alpha_3","Numeric")]
    xwalk <- rename(xwalk, c(Alpha_3="ccode_alpha", Numeric="ccode_numeric"))
    xwalk$ccode_numeric <- as.numeric(xwalk$ccode_numeric)

    all <- WDI(country="all", indicator=c("NY.GDP.MKTP.KD","NY.GDP.PCAP.KD","NY.GDP.PCAP.KD.ZG",
    "NE.TRD.GNFS.ZS","SP.DYN.LE00.IN", "SE.SEC.ENRR"), start=1960, end=2015, extra=TRUE, cache=NULL)
    all <- all[all$region!="Aggregates",]
    all <- all[order(all$country,all$year),]
    all <- rename(all, c(NY.GDP.MKTP.KD="GDP", NY.GDP.PCAP.KD="GDPPC", NE.GDI.FTOT.ZS="FCF",
    xwalk <- rename(xwalk, c(Alpha_3="ccode_alpha", Numeric="ccode_numeric"))
    all <- merge(all,xwalk,by="ccode_alpha")
    china <- all[all$country=="China",]
    nonchina <- all[all$country!="China",]
    nonchina <- nonchina[order(nonchina$ccode_numeric),]

    # now let's get the additional data from QOG dataset

    qog.dat <- read_qog("standard", "time-series")
    all <- qog.dat[c("cname","ccodealp","ccodewb","year","p_polity2","ht_region")]
    all =1960,]
    all <- rename(all, c(ccodewb="ccode_numeric"))

    nonchina <- merge(nonchina, all, by=c("ccode_numeric","year"))
    nonchina <- nonchina[order(nonchina$ccode_numeric,nonchina$year),]

    Level <-cut(nonchina$year,seq(1960,2015,by=5),right=F)
    id <- c("GDP","GDPPC","GovFCE","FCF","Inflation","Trade","LifeExp","SecEnroll","FCF","p_polity2","ht_region")

    # create averages
    averages <- aggregate(nonchina[id],list(nonchina$cname,Level),na.rm=TRUE,mean)
    averages <- rename(averages, c(Group.1="cname"))
    averages$cname <- factor(averages$cname)
    averages <- averages[order(averages$cname,averages$Group.2),]
    averages$period <- rep(seq(1:11),length(levels(averages$cname)))

    #create initial and final
    initial <- nonchina[nonchina$year %in% seq(1960,2015,by=5),]
    initial$cname <- factor(initial$cname)
    initial <- initial[order(initial$cname,initial$year),]
    initial$period <- rep(seq(1:11),length(levels(initial$cname)))
    initial <- initial[,names(initial) %in% c("cname","period","GDPPC","GDP")]
    initial <- rename(initial, c(GDPPC = "GDPPC.Initial", GDP="GDP.Initial"))
    final <- nonchina[nonchina$year %in% seq(1964,2019,by=5),]
    final$cname <- factor(final$cname)
    final <- final[order(final$cname,final$year),]
    final$period <- rep(seq(1:11),length(levels(final$cname)))
    final <- final[,names(final) %in% c("cname","period","GDPPC","GDP")]
    final <- rename(final, c(GDPPC = "GDPPC.Final", GDP="GDP.Final"))

    # merge and calculate geom growth rate
    data <- merge(initial, final, by=c("period","cname"))
    data$growth <- 100*((data$GDPPC.Final/data$GDPPC.Initial)^(1/5) – 1)
    data <- merge(averages,data, by=c("period","cname"))
    data <- data[order(data$cname,data$period),]

    # now set up the china dataframe
    china.qog <- all[all$cname=="China",]
    china <- merge(china,china.qog,by="year")
    china <- rename(china, c(GDPPC="GDPPC.Initial", GDP="GDP.Initial"))
    china$period <- rep(1:11, each=5)
    china$growth <- 100*(china$GDPPC.Initial/lag(china$GDPPC.Initial, k=-1)-1)

    # interpolate education for missing years
    china[china$year==1998,]$SecEnroll<-approx(x = china$year, y = china$SecEnroll, xout = 1998)$y
    china[china$year==2004,]$SecEnroll<-approx(x = china$year, y = china$SecEnroll, xout = 2004)$y
    china[china$year==2005,]$SecEnroll<-approx(x = china$year, y = china$SecEnroll, xout = 2005)$y

    # extrapolate some variables for 2014
    china[china$year==2014,]$GovFCE1990,]), data.frame(year=2014))
    china[china$year==2014,]$LifeExp1990,]), data.frame(year=2014))
    china[china$year==2014,]$SecEnroll1990,]), data.frame(year=2014))
    china[china$year==2014,]$FCF1990,]), data.frame(year=2014))
    china[china$year==2013,]$p_polity2<- -7
    china[china$year==2014,]$p_polity2<- -7

    # estimate basic models
    fit1 <- lm(growth~log(GDPPC.Initial)+FCF+GovFCE+Trade+Inflation+LifeExp+SecEnroll+p_polity2,data=data)
    fit2 <- lm(growth~log(GDPPC.Initial)+FCF+GovFCE+Trade+Inflation+LifeExp+SecEnroll+p_polity2

    # predict using chinese data
    topredict =1987,]
    topredict$predgrowth1 <- predict(fit1, topredict, = TRUE)$fit
    topredict$predgrowth2 <- predict(fit2, topredict, = TRUE)$fit

    # and now we plot
    plot(toplot$growth, type="l", xaxt="n", yaxt="n", ylim=c(0,max(toplot$growth+1)),
    xlab="", ylab="Yearly Growth Rate", col="red", lwd=2)
    lines(toplot$predgrowth1, lwd=2, lty=2, col="blue")
    lines(toplot$predgrowth2, lwd=2, lty=2, col="black")
    text(21, 14, "Actual Chinese Economic Growth", col="red")
    text(21, 6.3, "Predicted Growth Trajectory 2", col="black")
    text(21, 3, "Predicted Growth Trajectory 1", col="blue")
    axis(1, at=c(seq(1,28,1)), labels=c(seq(1987,2014,by=1)))
    axis(2, at=c(seq(0,15,3)), labels=c(seq(0,15,3)))

    plot(toplot$growth-toplot$predgrowth2, type="l", xaxt="n", yaxt="n", ylim=c(-1,max(toplot$growth-toplot$predgrowth2)+1),
    xlab="", ylab="Actual – Predicted Growth", col="red", lwd=2)
    axis(1, at=c(seq(1,28,1)), labels=c(seq(1987,2014,by=1)))
    axis(2, at=c(seq(0,10,2)), labels=c(seq(0,10,2)))
    text(21, 9, "The Chinese Growth Differential", col="red")

  2. dartthrowingchimp August 27, 2015

    I’m surprised you don’t mention the considerable uncertainty about the veracity of China’s reported growth rates. Given that uncertainty, it’s impossible to know how much of the gap you observe is a function of China’s circumstances and policies and how much is just an artifact of fudged numbers. The exercise is still interesting; I just wonder if the divergence was ever really as wide as these estimates imply, and if the gap has already closed.

Comments are closed.