Replication: A Contribution to the Empirics of Economic Growth by Mankiw, Romer, and Weil (1992)
Introduction
R Libraries and dataset
library(tibble) # nice dataframes
library(stargazer) # regression tables
library(ggplot2) # nice graphs
library(dplyr) # data manipulation
library(car) # test linear hypotheses
library(skimr) # descriptive statistics
library(haven) # reading stata data
options(warn = -1)
options(scipen = 10000)
options(repr.plot.width = 6, repr.plot.height = 4)
Please cite as:
Hlavac, Marek (2018). stargazer: Well-Formatted Regression and Summary Statistics Tables.
R package version 5.2.2. https://CRAN.R-project.org/package=stargazer
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
Loading required package: carData
Attaching package: ‘car’
The following object is masked from ‘package:dplyr’:
recode
mrw_data <- read_dta("https://github.com/quarcs-lab/data-quarcs/raw/master/mrw1992/mrw2.dta")
skim(mrw_data)
── Data Summary ────────────────────────
Values
Name mrw_data
Number of rows 121
Number of columns 12
_______________________
Column type frequency:
character 2
numeric 10
________________________
Group variables None
── Variable type: character ────────────────────────────────────────────────────
skim_variable n_missing complete_rate min max empty n_unique whitespace
1 country 0 1 4 19 0 121 0
2 region 0 1 4 12 0 6 0
── Variable type: numeric ──────────────────────────────────────────────────────
skim_variable n_missing complete_rate mean sd p0 p25
1 number 0 1 61 35.1 1 31
2 n 0 1 0.810 0.394 0 1
3 i 0 1 0.620 0.487 0 0
4 o 0 1 0.182 0.387 0 0
5 rgdpw60 5 0.959 3682. 7493. 383 973.
6 rgdpw85 13 0.893 5683. 5689. 412 1209.
7 gdpgrowth 4 0.967 4.09 1.89 -0.900 2.80
8 popgrowth 14 0.884 2.28 0.999 0.300 1.70
9 i_y 0 1 18.2 7.85 4.10 12
10 school 3 0.975 5.53 3.53 0.400 2.40
p50 p75 p100 hist
1 61 91 121 ▇▇▇▇▇
2 1 1 1 ▂▁▁▁▇
3 1 1 1 ▅▁▁▁▇
4 0 0 1 ▇▁▁▁▂
5 1962 4274. 77881 ▇▁▁▁▁
6 3484. 7719. 25635 ▇▂▂▁▁
7 3.90 5.30 9.20 ▁▅▇▃▁
8 2.40 2.90 6.80 ▅▇▅▁▁
9 17.7 24.1 36.9 ▅▇▇▅▂
10 4.95 8.17 12.1 ▇▆▅▅▅
mrw_data <- mrw_data %>%
rename(non_oil = n,
oecd = o,
intermediate = i,
gdp_60 = rgdpw60,
gdp_85 = rgdpw85,
gdp_growth_60_85 = gdpgrowth,
pop_growth_60_85 = popgrowth,
inv_gdp = i_y,
school = school)
delta_gamma <- 0.05
mrw_data <- mrw_data %>%
mutate(ln_gdp_85 = log(gdp_85),
ln_gdp_60 = log(gdp_60),
ln_gdp_growth = ln_gdp_85 - ln_gdp_60,
ln_inv_gdp = log(inv_gdp/100),
non_oil = factor(non_oil),
intermediate = factor(intermediate),
oecd = factor(oecd),
ln_ndg = log(pop_growth_60_85/100 + delta_gamma),
ln_school = log(school/100)) %>%
select(country, region, ln_gdp_85, ln_gdp_60, ln_inv_gdp,
non_oil, intermediate, oecd,
ln_ndg, ln_school, gdp_growth_60_85, ln_gdp_growth)
skim(mrw_data)
── Data Summary ────────────────────────
Values
Name mrw_data
Number of rows 121
Number of columns 12
_______________________
Column type frequency:
character 2
factor 3
numeric 7
________________________
Group variables None
── Variable type: character ────────────────────────────────────────────────────
skim_variable n_missing complete_rate min max empty n_unique whitespace
1 country 0 1 4 19 0 121 0
2 region 0 1 4 12 0 6 0
── Variable type: factor ───────────────────────────────────────────────────────
skim_variable n_missing complete_rate ordered n_unique top_counts
1 non_oil 0 1 FALSE 2 1: 98, 0: 23
2 intermediate 0 1 FALSE 2 1: 75, 0: 46
3 oecd 0 1 FALSE 2 0: 99, 1: 22
── Variable type: numeric ──────────────────────────────────────────────────────
skim_variable n_missing complete_rate mean sd p0 p25 p50
1 ln_gdp_85 13 0.893 8.11 1.09 6.02 7.10 8.15
2 ln_gdp_60 5 0.959 7.65 0.957 5.95 6.88 7.58
3 ln_inv_gdp 0 1 -1.82 0.495 -3.19 -2.12 -1.73
4 ln_ndg 14 0.884 -2.63 0.138 -2.94 -2.70 -2.60
5 ln_school 3 0.975 -3.20 0.911 -5.52 -3.73 -3.01
6 gdp_growth_60_85 4 0.967 4.09 1.89 -0.900 2.80 3.90
7 ln_gdp_growth 16 0.868 0.449 0.476 -1.11 0.132 0.454
p75 p100 hist
1 8.95 10.2 ▅▇▇▆▇
2 8.36 11.3 ▇▇▆▁▁
3 -1.42 -0.997 ▁▂▅▇▆
4 -2.54 -2.14 ▂▃▇▁▁
5 -2.50 -2.11 ▂▂▃▅▇
6 5.30 9.20 ▁▅▇▃▁
7 0.734 1.66 ▁▂▇▇▂
Data samples
non_oil <- mrw_data %>%
filter(non_oil == 1)
intermediate <- mrw_data %>%
filter(intermediate == 1)
oecd <- mrw_data %>%
filter(oecd == 1)
Additional samples for further exploration
africa <- mrw_data %>%
filter(region == "Africa")
asia <- mrw_data %>%
filter(region == "Asia")
europe <- mrw_data %>%
filter(region == "Europe")
latinAmerica <- mrw_data %>%
filter(region == "LatinAmerica")
northAmerica <- mrw_data %>%
filter(region == "NorthAmerica")
oceania <- mrw_data %>%
filter(region == "Oceania")
Textbook Solow model
Quantitative implications
Econometric specification
Unrestricted Regression
solow_oecd <- lm(ln_gdp_85 ~ ln_inv_gdp + ln_ndg, data = oecd)
solow_int <- lm(ln_gdp_85 ~ ln_inv_gdp + ln_ndg, data = intermediate)
solow_noil <- lm(ln_gdp_85 ~ ln_inv_gdp + ln_ndg, data = non_oil)
stargazer(solow_noil, solow_int, solow_oecd, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(I / GDP)",
"log(n+delta+g)",
"Constant"),
dep.var.labels = "Log(GDP) 1985",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 1 - Unrestricted Models",
style = "qje")
Table 1 - Unrestricted Models
=======================================================
Log(GDP) 1985
Non-Oil Intermediate OECD
(1) (2) (3)
-------------------------------------------------------
log(I / GDP) 1.42*** 1.32*** 0.50
(0.14) (0.17) (0.43)
log(n+delta+g) -1.99*** -2.02*** -0.74
(0.56) (0.53) (0.85)
Constant 5.43*** 5.35*** 8.02***
(1.58) (1.54) (2.52)
N 98 75 22
Adjusted R2 0.59 0.59 0.01
=======================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Restricted Regression
solow_noil_r <- lm(ln_gdp_85 ~ I(ln_inv_gdp - ln_ndg), data = non_oil)
solow_int_r <- lm(ln_gdp_85 ~ I(ln_inv_gdp - ln_ndg), data = intermediate)
solow_oecd_r <- lm(ln_gdp_85 ~ I(ln_inv_gdp - ln_ndg), data = oecd)
stargazer(solow_noil_r, solow_int_r, solow_oecd_r, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(I / GDP)- log(n+delta+g)",
"Constant"),
dep.var.labels = "Log(GDP) 1985",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 1 - Restricted Models",
style = "qje")
Table 1 - Restricted Models
=====================================================================
Log(GDP) 1985
Non-Oil Intermediate OECD
(1) (2) (3)
---------------------------------------------------------------------
log(I / GDP)- log(n+delta+g) 1.49*** 1.43*** 0.55
(0.12) (0.14) (0.37)
Constant 6.87*** 7.09*** 8.62***
(0.12) (0.15) (0.53)
N 98 75 22
Adjusted R2 0.59 0.59 0.06
=====================================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Test of Restriction
linearHypothesis(solow_noil, "ln_inv_gdp = - ln_ndg")
linearHypothesis(solow_int, "ln_inv_gdp = - ln_ndg")
linearHypothesis(solow_oecd, "ln_inv_gdp = - ln_ndg")
Implied alpha
C <- coef(solow_noil_r)[2]
alpha_solow_noil_r <- C/(1+C)
alpha_solow_noil_r <- round(alpha_solow_noil_r, 2)
print(paste("Implied alpha (Non oil):", alpha_solow_noil_r))
[1] "Implied alpha (Non oil): 0.6"
C <- coef(solow_int_r)[2]
alpha_solow_int_r <- C/(1+C)
alpha_solow_int_r <- round(alpha_solow_int_r, 2)
print(paste("Implied alpha (Intermediate):", alpha_solow_int_r))
[1] "Implied alpha (Intermediate): 0.59"
C <- coef(solow_oecd_r)[2]
alpha_solow_oecd_r <- C/(1+C)
alpha_solow_oecd_r <- round(alpha_solow_oecd_r, 2)
print(paste("Implied alpha (OECD):", alpha_solow_oecd_r))
[1] "Implied alpha (OECD): 0.36"
Augmented Solow model
Unrestricted regression
augsolow_noil <- lm(ln_gdp_85 ~ ln_inv_gdp + ln_ndg + ln_school, data = non_oil)
augsolow_int <- lm(ln_gdp_85 ~ ln_inv_gdp + ln_ndg + ln_school, data = intermediate)
augsolow_oecd <- lm(ln_gdp_85 ~ ln_inv_gdp + ln_ndg + ln_school, data = oecd)
stargazer(augsolow_noil, augsolow_int, augsolow_oecd, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(I / GDP)",
"log(n+delta+g)",
"log(school)",
"Constant"),
dep.var.labels = "Log(GDP) 1985",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 2 - Unrestricted Models",
style = "qje")
Table 2 - Unrestricted Models
=======================================================
Log(GDP) 1985
Non-Oil Intermediate OECD
(1) (2) (3)
-------------------------------------------------------
log(I / GDP) 0.70*** 0.70*** 0.28
(0.13) (0.15) (0.39)
log(n+delta+g) -1.75*** -1.50*** -1.08
(0.42) (0.40) (0.76)
log(school) 0.65*** 0.73*** 0.77**
(0.07) (0.10) (0.29)
Constant 6.84*** 7.79*** 8.64***
(1.18) (1.19) (2.21)
N 98 75 22
Adjusted R2 0.78 0.77 0.24
=======================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Restricted regression
augsolow_noil_r <- lm(ln_gdp_85 ~ I(ln_inv_gdp - ln_ndg) + I(ln_school - ln_ndg), data = non_oil)
augsolow_int_r <- lm(ln_gdp_85 ~ I(ln_inv_gdp - ln_ndg) + I(ln_school - ln_ndg), data = intermediate)
augsolow_oecd_r <- lm(ln_gdp_85 ~ I(ln_inv_gdp - ln_ndg) + I(ln_school - ln_ndg), data = oecd)
stargazer(augsolow_noil_r, augsolow_int_r, augsolow_oecd_r, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(I / GDP)- log(n+delta+g)",
"log(school)- log(n+delta+g)",
"Constant"),
dep.var.labels = "Log(GDP) 1985",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 2 - Restricted Models",
style = "qje")
Table 2 - Restricted Models
=====================================================================
Log(GDP) 1985
Non-Oil Intermediate OECD
(1) (2) (3)
---------------------------------------------------------------------
log(I / GDP)- log(n+delta+g) 0.74*** 0.71*** 0.28
(0.12) (0.14) (0.33)
log(school)- log(n+delta+g) 0.66*** 0.73*** 0.77**
(0.07) (0.09) (0.28)
Constant 7.85*** 7.97*** 8.72***
(0.14) (0.15) (0.47)
N 98 75 22
Adjusted R2 0.78 0.77 0.28
=====================================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Test of restriction
linearHypothesis(augsolow_oecd, "ln_inv_gdp + ln_ndg + ln_school = 0")
linearHypothesis(augsolow_noil, "ln_inv_gdp + ln_ndg + ln_school = 0")
linearHypothesis(augsolow_int, "ln_inv_gdp + ln_ndg + ln_school = 0")
Implied alpha and beta
c2 <- round(coef(augsolow_noil_r)[2], 2)
c2
c3 <- round(coef(augsolow_noil_r)[3], 2)
c3
x = c2 / (c2+c3+1)
x = round(x, 2)
print(paste("Implied alpha (Non oil):", x))
y = c3 / (c2+c3+1)
y = round(y, 2)
print(paste("Implied beta (Non oil):", y))
[1] "Implied alpha (Non oil): 0.31"
[1] "Implied beta (Non oil): 0.28"
c2 <- round(coef(augsolow_int_r)[2], 2)
c2
c3 <- round(coef(augsolow_int_r)[3], 2)
c3
x = c2 / (c2+c3+1)
x = round(x, 2)
print(paste("Implied alpha (Intermediate):", x))
y = c3 / (c2+c3+1)
y = round(y, 2)
print(paste("Implied beta (Intermediate):", y))
[1] "Implied alpha (Intermediate): 0.29"
[1] "Implied beta (Intermediate): 0.3"
c2 <- round(coef(augsolow_oecd_r)[2], 2)
c2
c3 <- round(coef(augsolow_oecd_r)[3], 2)
c3
x = c2 / (c2+c3+1)
x = round(x, 2)
print(paste("Implied alpha (OECD):", x))
y = c3 / (c2+c3+1)
y = round(y, 2)
print(paste("Implied beta (OECD):", y))
[1] "Implied alpha (OECD): 0.14"
[1] "Implied beta (OECD): 0.38"
Convergence
Unconditional convergence
ucc_noil <- lm(ln_gdp_growth ~ ln_gdp_60, data = non_oil)
ucc_int <- lm(ln_gdp_growth ~ ln_gdp_60, data = intermediate)
ucc_oecd <- lm(ln_gdp_growth ~ ln_gdp_60, data = oecd)
stargazer(ucc_noil, ucc_int, ucc_oecd, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(GDP '60)",
"Constant"),
dep.var.labels = "Log(GDP '85) - Log(GDP '60)",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 3 - Unconditional Convergence",
style = "qje")
Table 3 - Unconditional Convergence
=====================================================
Log(GDP '85) - Log(GDP '60)
Non-Oil Intermediate OECD
(1) (2) (3)
-----------------------------------------------------
log(GDP '60) 0.09* -0.004 -0.34***
(0.05) (0.05) (0.08)
Constant -0.27 0.59 3.69***
(0.38) (0.43) (0.68)
N 98 75 22
Adjusted R2 0.03 -0.01 0.46
=====================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Implied speed of convergence
# Implied speed of convergence and halflife
speed = -log(1+coef(ucc_noil)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 5)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Non-oil):", speed))
print(paste("Implied halflife of unconditional (Non-oil):", halfLife))
[1] "Implied speed of unconditional (Non-oil): -0.0036"
[1] "Implied halflife of unconditional (Non-oil): -192"
# Implied speed of convergence and halflife
speed = - log(1+coef(ucc_int)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 5)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Intermediate):", speed))
print(paste("Implied halflife of unconditional (Intermediate):", halfLife))
[1] "Implied speed of unconditional (Intermediate): 0.00017"
[1] "Implied halflife of unconditional (Intermediate): 4083"
# Implied speed of convergence and halflife
speed = - log(1+coef(ucc_oecd)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (OECD):", speed))
print(paste("Implied halflife of unconditional (OECD):", halfLife))
[1] "Implied speed of unconditional (OECD): 0.0167"
[1] "Implied halflife of unconditional (OECD): 42"
Conditional convergence
cc_noil <- lm(ln_gdp_growth ~ ln_gdp_60 + ln_inv_gdp + ln_ndg, data = non_oil)
cc_int <- lm(ln_gdp_growth ~ ln_gdp_60 + ln_inv_gdp + ln_ndg, data = intermediate)
cc_oecd <- lm(ln_gdp_growth ~ ln_gdp_60 + ln_inv_gdp + ln_ndg, data = oecd)
stargazer(cc_noil, cc_int, cc_oecd, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(GDP '60)",
"log(I / GDP)",
"log(n+delta+g)",
"Constant"),
dep.var.labels = "Log(GDP '85) - Log(GDP '60)",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 4 - Conditional Convergence",
style = "qje")
Table 4 - Conditional Convergence
=======================================================
Log(GDP '85) - Log(GDP '60)
Non-Oil Intermediate OECD
(1) (2) (3)
-------------------------------------------------------
log(GDP '60) -0.14*** -0.23*** -0.35***
(0.05) (0.06) (0.07)
log(I / GDP) 0.65*** 0.65*** 0.39**
(0.09) (0.10) (0.18)
log(n+delta+g) -0.30 -0.46 -0.77**
(0.30) (0.31) (0.35)
Constant 1.92** 2.25** 2.14*
(0.83) (0.85) (1.18)
N 98 75 22
Adjusted R2 0.38 0.35 0.62
=======================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Implied speed of convergence
# Implied speed of convergence and halflife
speed = -log(1+coef(cc_noil)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 5)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Non-oil):", speed))
print(paste("Implied halflife of unconditional (Non-oil):", halfLife))
[1] "Implied speed of unconditional (Non-oil): 0.00607"
[1] "Implied halflife of unconditional (Non-oil): 114"
# Implied speed of convergence and halflife
speed = - log(1+coef(cc_int)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Intermediate):", speed))
print(paste("Implied halflife of unconditional (Intermediate):", halfLife))
[1] "Implied speed of unconditional (Intermediate): 0.0103"
[1] "Implied halflife of unconditional (Intermediate): 67"
# Implied speed of convergence and halflife
speed = -log(1+coef(cc_oecd)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (OECD):", speed))
print(paste("Implied halflife of unconditional (OECD):", halfLife))
[1] "Implied speed of unconditional (OECD): 0.0172"
[1] "Implied halflife of unconditional (OECD): 40"
Augmented conditional convergence
augcc_noil <- lm(ln_gdp_growth ~ ln_gdp_60 + ln_inv_gdp + ln_ndg + ln_school, data = non_oil)
augcc_int <- lm(ln_gdp_growth ~ ln_gdp_60 + ln_inv_gdp + ln_ndg + ln_school, data = intermediate)
augcc_oecd <- lm(ln_gdp_growth ~ ln_gdp_60 + ln_inv_gdp + ln_ndg + ln_school, data = oecd)
stargazer(augcc_noil, augcc_int, augcc_oecd, digits=2, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(GDP '60)",
"log(I / GDP)",
"log(n+delta+g)",
"log(school)",
"Constant"),
dep.var.labels = "Log(GDP '85) - Log(GDP '60)",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 5 - Augmented Conditional Convergence",
style = "qje")
Table 5 - Augmented Conditional Convergence
=======================================================
Log(GDP '85) - Log(GDP '60)
Non-Oil Intermediate OECD
(1) (2) (3)
-------------------------------------------------------
log(GDP '60) -0.29*** -0.37*** -0.40***
(0.06) (0.07) (0.07)
log(I / GDP) 0.52*** 0.54*** 0.33*
(0.09) (0.10) (0.17)
log(n+delta+g) -0.51* -0.54* -0.86**
(0.29) (0.29) (0.34)
log(school) 0.23*** 0.27*** 0.23
(0.06) (0.08) (0.15)
Constant 3.02*** 3.71*** 2.76**
(0.83) (0.91) (1.20)
N 98 75 22
Adjusted R2 0.46 0.43 0.65
=======================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Implied speed of convergence
# Implied speed of convergence and halflife
speed = -log(1+coef(augcc_noil)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Non-oil):", speed))
print(paste("Implied halflife of unconditional (Non-oil):", halfLife))
[1] "Implied speed of unconditional (Non-oil): 0.0136"
[1] "Implied halflife of unconditional (Non-oil): 51"
# Implied speed of convergence and halflife
speed = - log(1+coef(augcc_int)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Intermediate):", speed))
print(paste("Implied halflife of unconditional (Intermediate):", halfLife))
[1] "Implied speed of unconditional (Intermediate): 0.0182"
[1] "Implied halflife of unconditional (Intermediate): 38"
# Implied speed of convergence and halflife
speed = -log(1+coef(augcc_oecd)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (OECD):", speed))
print(paste("Implied halflife of unconditional (OECD):", halfLife))
[1] "Implied speed of unconditional (OECD): 0.0203"
[1] "Implied halflife of unconditional (OECD): 34"
Restricted augmented conditional convergence
augcc_noil_r <- lm(ln_gdp_growth ~ ln_gdp_60 + I(ln_inv_gdp - ln_ndg) + I(ln_school - ln_ndg), data = non_oil)
augcc_int_r <- lm(ln_gdp_growth ~ ln_gdp_60 + I(ln_inv_gdp - ln_ndg) + I(ln_school - ln_ndg), data = intermediate)
augcc_oecd_r <- lm(ln_gdp_growth ~ ln_gdp_60 + I(ln_inv_gdp - ln_ndg) + I(ln_school - ln_ndg), data = oecd)
stargazer(augcc_noil_r, augcc_int_r, augcc_oecd_r, digits=3, type = "text",
column.labels = c("Non-Oil",
"Intermediate",
"OECD"),
covariate.labels = c("log(GDP '60)",
"log(I / GDP) - log(n+delta+g)",
"log(school) - log(n+delta+g)",
"Constant"),
dep.var.labels = "Log(GDP '85) - Log(GDP '60)",
omit.stat = c("f",
"rsq",
"ser"),
title = "Table 6 - Restricted Augmented Conditional Convergence",
style = "qje")
Table 6 - Restricted Augmented Conditional Convergence
======================================================================
Log(GDP '85) - Log(GDP '60)
Non-Oil Intermediate OECD
(1) (2) (3)
----------------------------------------------------------------------
log(GDP '60) -0.298*** -0.372*** -0.402***
(0.060) (0.067) (0.069)
log(I / GDP) - log(n+delta+g) 0.501*** 0.506*** 0.395**
(0.082) (0.095) (0.152)
log(school) - log(n+delta+g) 0.235*** 0.266*** 0.241
(0.059) (0.080) (0.142)
Constant 2.457*** 3.090*** 3.554***
(0.473) (0.530) (0.634)
N 98 75 22
Adjusted R2 0.465 0.437 0.659
======================================================================
Notes: ***Significant at the 1 percent level.
**Significant at the 5 percent level.
*Significant at the 10 percent level.
Test of restriction
linearHypothesis(augcc_noil, "ln_inv_gdp + ln_ndg + ln_school = 0")
linearHypothesis(augcc_int, "ln_inv_gdp + ln_ndg + ln_school = 0")
linearHypothesis(augcc_oecd, "ln_inv_gdp + ln_ndg + ln_school = 0")
Implied speed of convergence
# Implied speed of convergence and halflife
speed = -log(1+coef(augcc_noil_r)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Non-oil):", speed))
print(paste("Implied halflife of unconditional (Non-oil):", halfLife))
[1] "Implied speed of unconditional (Non-oil): 0.0141"
[1] "Implied halflife of unconditional (Non-oil): 49"
# Implied speed of convergence and halflife
speed = -log(1+coef(augcc_int_r)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (Intermediate):", speed))
print(paste("Implied halflife of unconditional (Intermediate):", halfLife))
[1] "Implied speed of unconditional (Intermediate): 0.0186"
[1] "Implied halflife of unconditional (Intermediate): 37"
# Implied speed of convergence and halflife
speed = -log(1+coef(augcc_oecd_r)[2])/(1985-1960)
halfLife = log(2)/speed
speed = round(speed, 4)
halfLife = round(halfLife)
print(paste("Implied speed of unconditional (OECD):", speed))
print(paste("Implied halflife of unconditional (OECD):", halfLife))
[1] "Implied speed of unconditional (OECD): 0.0206"
[1] "Implied halflife of unconditional (OECD): 34"
Figures: Unconditional vs conditional convergence
ggplot(intermediate, aes(x = ln_gdp_60, y = ln_gdp_growth)) +
geom_point(shape = 1) +
geom_smooth(method=lm, se=FALSE, color = "red") +
theme_bw() +
ggtitle("A: Unconditional") +
ylab("Log Growth rate: 1960 - 85") +
xlab("Log output per working age adult: 1960")
`geom_smooth()` using formula 'y ~ x'
y2 <- lm(ln_gdp_growth ~ ln_inv_gdp + ln_ndg, data = intermediate)$residuals
x2 <- lm(ln_gdp_60 ~ ln_inv_gdp + ln_ndg, data = intermediate)$residuals
panel_b <- tibble(y2, x2)
ggplot(panel_b, aes(x = x2, y = y2)) +
geom_point(shape = 1) +
geom_smooth(method=lm, se=FALSE, color = "red") +
theme_bw() +
ggtitle("B: Conditional on Saving and Population Growth") +
ylab("Log Growth rate: 1960 - 85") +
xlab("Log output per working age adult: 1960")
`geom_smooth()` using formula 'y ~ x'
y3 <- lm(ln_gdp_growth ~ ln_inv_gdp + ln_ndg + ln_school, data = intermediate)$residuals
x3 <- lm(ln_gdp_60 ~ ln_inv_gdp + ln_ndg + ln_school, data = intermediate)$residuals
panel_c <- tibble(y3, x3)
ggplot(panel_c, aes(x = x3, y = y3)) +
geom_point(shape = 1) +
geom_smooth(method=lm, se=FALSE, color = "red") +
theme_bw() +
ggtitle("C: Conditional on Saving and Population Growth and Human Capital") +
ylab("Log Growth rate: 1960 - 85") +
xlab("Log output per working age adult: 1960")
`geom_smooth()` using formula 'y ~ x'