The objective of this analysis is to try to capture any causative effects in the Penn World Table data on Real GDP rdgpe. We will use several techniques available on a theoretical ground truth, and then apply these techniques on other variables of interest.
The ground truth we have identified is that Real GDP causes Total Factor Productivity ctfp. Why is this? The contention is that ctfp is essentially measuring economies of scale, and in order to invoke those economies of scale, a country must first achieve scale! Thus, we assume rdgpe causes ctfp.
A note on the difference between cwtfp and ctfp. The difference between cwtfp and tfp is that ctfp is based on relative real GDP from the output side, while cwtfp is based on relative real domestic absorption, and cwtfp levels are generally lower than their ctfp counterparts [Feenstra (2015)].
Our results are robust to either measure of Total Factor Productivity.
Download and load the pwt9 package in R. Other required R packages are called throughout, they include:
data.table, NNS, generalCorr, and lmtest.
library(data.table)
library(pwt9)
# Load pwt data into R
data("pwt9.1")
# Create a data.table of pwt data
pwt <- data.table(pwt9.1)
pop > 1mmThe first year of US data is 1954, so we need to eliminate the other years, and only select countries with 1mm people or more.
# Subset based on population > 1mm and Year >= 1954
pwt_1 <- pwt[pop > 1 & year >= 1954,]
cwtfp DataWe need to eliminate the US from consideration because its value is set to 1 for all dates, and thus offers no insights to causative effects.
# Create lists of countries only with full sets of observations for cwtfp and rgdpe
cwtfp_countries <- pwt_1[, sum(is.na(cwtfp))/.N, by = country]
full_cwtfp_countries <- cwtfp_countries[V1==0, country]
rgdpe_countries <- pwt_1[, sum(is.na(rgdpe))/.N, by = country]
full_rgdpe_countries <- rgdpe_countries[V1==0, country]
There are only 51 countries with complete datasets for cwtfp and rgdpe.
# Intersecting Countries List
Reduce(intersect, list(full_cwtfp_countries, full_rgdpe_countries))
## [1] "Argentina" "Australia"
## [3] "Austria" "Belgium"
## [5] "Bahrain" "Bolivia (Plurinational State of)"
## [7] "Brazil" "Botswana"
## [9] "Canada" "Switzerland"
## [11] "Colombia" "Costa Rica"
## [13] "Germany" "Denmark"
## [15] "Ecuador" "Egypt"
## [17] "Spain" "Finland"
## [19] "France" "Gabon"
## [21] "United Kingdom" "Guatemala"
## [23] "India" "Ireland"
## [25] "Israel" "Italy"
## [27] "Jordan" "Japan"
## [29] "Kenya" "Kuwait"
## [31] "Sri Lanka" "Morocco"
## [33] "Mexico" "Mauritius"
## [35] "Namibia" "Netherlands"
## [37] "Norway" "New Zealand"
## [39] "Peru" "Philippines"
## [41] "Portugal" "Qatar"
## [43] "Sweden" "Eswatini"
## [45] "Thailand" "Trinidad and Tobago"
## [47] "Turkey" "Uruguay"
## [49] "United States of America" "Venezuela (Bolivarian Republic of)"
## [51] "South Africa"
# Subset based on complete observations and exclude USA
pwt_2 <- pwt_1[country%in%Reduce(intersect, list(full_cwtfp_countries, full_rgdpe_countries)),]
pwt_2 <- pwt_2[isocode!="USA",]
NNS Causation MethodNNS causality tries to determine the conditional probability of two events by first normalizing past innovations of itself (per the Granger insight) such that: \[x^* = f(x_{t-1}, x_{t-2},...,x_{t-n})\] \[y^* = f(y_{t-1}, y_{t-2},...,y_{t-n})\]
and then normalizing each of these new variables to a shared rangespace by:
\[ x^{**} = f(x^*, y^*)\] \[ y^{**} = g(x^*, y^*)\]
Once \(x^{**}\) and \(y^{**}\) are on the shared rangespace, the conditional probability can be ascertained and then the correlation applied to determine causation. Statistically, we are trying to demonstrate that events only occurring given another event (shared rangespace) will then permit correlation as causative.
library(NNS)
# Determine NNS Causal Direction
NNS_Caus <- pwt_2[, NNS_Causation_Direction := names(NNS.caus(rgdpe, cwtfp, tau = 1)[3]), by = country]
#Determine NNS Causal Magnitude
NNS_Caus <- pwt_2[, NNS_Causation := as.numeric(NNS.caus(rgdpe, cwtfp, tau = 1)[3]), by = country]
# Obtain unique country NNS caus results
NNS_Caus[, unique(.SD), .SDcols = c("NNS_Causation", "NNS_Causation_Direction"), by = country]
NNS: Countries NOT to show rdgpe causes cwtfp# Isolate instances of reverse causality
NNS_Caus[NNS_Causation_Direction=="C(y--->x)", unique(country)]
## [1] Gabon Mexico Uruguay
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
According to Granger causality, if a variable \(x\) ``Granger-causes’’ a variable \(y\), then past values of \(x\) should contain information that helps predict \(y\) above and beyond the information contained in past values of \(y\) alone.
library(lmtest)
granger <- pwt_2[, granger_causality := grangertest(rgdpe ~ cwtfp, order = 3)$Pr[2], by = country]
cwtfp causes rdgpe# Isolate instances of insignificance, p > .05
granger[granger_causality > 0.05, unique(country)]
## [1] Australia Austria
## [3] Belgium Bahrain
## [5] Bolivia (Plurinational State of) Brazil
## [7] Botswana Canada
## [9] Colombia Costa Rica
## [11] Germany Denmark
## [13] Ecuador Egypt
## [15] Spain Finland
## [17] France Gabon
## [19] United Kingdom Guatemala
## [21] India Israel
## [23] Italy Jordan
## [25] Japan Kenya
## [27] Kuwait Sri Lanka
## [29] Morocco Mexico
## [31] Mauritius Namibia
## [33] Netherlands Norway
## [35] New Zealand Peru
## [37] Philippines Portugal
## [39] Qatar Sweden
## [41] Eswatini Thailand
## [43] Trinidad and Tobago Turkey
## [45] Venezuela (Bolivarian Republic of) South Africa
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
generalCorrVinod (2014) developed new generalized correlation coefficients so that when \(r^*(Y|X) > r^*(X|Y)\) then \(X\) is the ``kernel cause’’ of \(Y\). Vinod (2015) argues that kernel causality amounts to model selection between two kernel regressions, \(E(Y|X) = g_1(X)\) and \(E(X|Y) = g_2(Y)\).
library(generalCorr)
gc <- pwt_2[, gc_causality := causeSummBlk(cbind(cwtfp, rgdpe))[1], by = country]
## [1] cwtfp causes rgdpe strength= 31.496
## [1] corr= 0.7497 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.4712 p-val= 9e-05
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.2512 p-val= 0.04524
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= 0.3752 p-val= 0.00225
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= 0.3436 p-val= 0.30093
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.0705 p-val= 0.57987
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.2577 p-val= 0.0398
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.8496 p-val= 0
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.8452 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.6259 p-val= 0
## [1] cwtfp causes rgdpe strength= 84.252
## [1] corr= -0.2082 p-val= 0.09877
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= -0.8111 p-val= 0
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= 0.8067 p-val= 0
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= -0.0399 p-val= 0.75416
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.6716 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.2202 p-val= 0.08044
## [1] cwtfp causes rgdpe strength= 50.394
## [1] corr= 0.2011 p-val= 0.11107
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= 0.7368 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.5098 p-val= 2e-05
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.6051 p-val= 0.00106
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.1478 p-val= 0.24368
## [1] rgdpe causes cwtfp strength= -31.496
## [1] corr= -0.8752 p-val= 0
## [1] cwtfp causes rgdpe strength= 31.496
## [1] corr= 0.7024 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.1072 p-val= 0.39912
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= 0.0292 p-val= 0.81863
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.1644 p-val= 0.19423
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= -0.4816 p-val= 0.00015
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= 0.7532 p-val= 0
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= -0.7678 p-val= 0
## [1] cwtfp causes rgdpe strength= 62.205
## [1] corr= -0.51 p-val= 0.00048
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.1058 p-val= 0.40537
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.7624 p-val= 0
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.8394 p-val= 0
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= -0.7904 p-val= 0
## [1] rgdpe causes cwtfp strength= -67.717
## [1] corr= -0.1591 p-val= 0.34013
## [1] cwtfp causes rgdpe strength= 31.496
## [1] corr= 1e-04 p-val= 0.99965
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= 0.4265 p-val= 0.00044
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.1329 p-val= 0.29513
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.4297 p-val= 0.00039
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.1224 p-val= 0.33531
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.4118 p-val= 0.00072
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= -0.7827 p-val= 0.00261
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.4059 p-val= 0.00087
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.9035 p-val= 0
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.0441 p-val= 0.72947
## [1] cwtfp causes rgdpe strength= 37.008
## [1] corr= -0.1857 p-val= 0.23315
## [1] rgdpe causes cwtfp strength= -100
## [1] corr= 0.8206 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.5151 p-val= 1e-05
## [1] cwtfp causes rgdpe strength= 100
## [1] corr= -0.5935 p-val= 0
## [1] rgdpe causes cwtfp strength= -37.008
## [1] corr= -0.5349 p-val= 1e-05
generalCorr: Countries to show rdgpe causes cwtfp# Isolate incidents of rgdpe as kernel cause
gc[gc_causality=="rgdpe", unique(country)]
## [1] Australia Austria
## [3] Belgium Bahrain
## [5] Bolivia (Plurinational State of) Brazil
## [7] Botswana Switzerland
## [9] Costa Rica Germany
## [11] Denmark Ecuador
## [13] Egypt France
## [15] United Kingdom Guatemala
## [17] Ireland Israel
## [19] Italy Jordan
## [21] Japan Kenya
## [23] Sri Lanka Morocco
## [25] Mauritius Namibia
## [27] Norway Peru
## [29] Philippines Portugal
## [31] Qatar Sweden
## [33] Turkey Uruguay
## [35] South Africa
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
So if theoretically rgdpe causes cwtfp, and 3 methodologies agree, then what causes rdgpe???
popBelow are the only countries to show that pop causes rgdpe via NNS.caus(). There are 148 countries in the reduced list of complete datasets for pop and rgdpe.
# Create full observation list for population data
pop_countries <- pwt_1[, sum(is.na(pop))/.N, by = country]
full_pop_countries <- pop_countries[V1==0, country]
# Intersecting Countries List
Reduce(intersect, list(full_pop_countries, full_rgdpe_countries))
## [1] "Angola" "Albania"
## [3] "United Arab Emirates" "Argentina"
## [5] "Armenia" "Australia"
## [7] "Austria" "Azerbaijan"
## [9] "Burundi" "Belgium"
## [11] "Benin" "Burkina Faso"
## [13] "Bangladesh" "Bulgaria"
## [15] "Bahrain" "Bosnia and Herzegovina"
## [17] "Belarus" "Bolivia (Plurinational State of)"
## [19] "Brazil" "Botswana"
## [21] "Central African Republic" "Canada"
## [23] "Switzerland" "Chile"
## [25] "China" "Cote d'Ivoire"
## [27] "Cameroon" "Congo, Democratic Republic"
## [29] "Congo" "Colombia"
## [31] "Costa Rica" "Czech Republic"
## [33] "Germany" "Denmark"
## [35] "Dominican Republic" "Algeria"
## [37] "Ecuador" "Egypt"
## [39] "Spain" "Estonia"
## [41] "Ethiopia" "Finland"
## [43] "France" "Gabon"
## [45] "United Kingdom" "Georgia"
## [47] "Ghana" "Guinea"
## [49] "Gambia" "Guinea-Bissau"
## [51] "Equatorial Guinea" "Greece"
## [53] "Guatemala" "China, Hong Kong SAR"
## [55] "Honduras" "Croatia"
## [57] "Haiti" "Hungary"
## [59] "Indonesia" "India"
## [61] "Ireland" "Iran (Islamic Republic of)"
## [63] "Iraq" "Israel"
## [65] "Italy" "Jamaica"
## [67] "Jordan" "Japan"
## [69] "Kazakhstan" "Kenya"
## [71] "Kyrgyzstan" "Cambodia"
## [73] "Republic of Korea" "Kuwait"
## [75] "Lao People's DR" "Lebanon"
## [77] "Liberia" "Sri Lanka"
## [79] "Lesotho" "Lithuania"
## [81] "Latvia" "Morocco"
## [83] "Republic of Moldova" "Madagascar"
## [85] "Mexico" "North Macedonia"
## [87] "Mali" "Myanmar"
## [89] "Mongolia" "Mozambique"
## [91] "Mauritania" "Mauritius"
## [93] "Malawi" "Malaysia"
## [95] "Namibia" "Niger"
## [97] "Nigeria" "Nicaragua"
## [99] "Netherlands" "Norway"
## [101] "Nepal" "New Zealand"
## [103] "Oman" "Pakistan"
## [105] "Panama" "Peru"
## [107] "Philippines" "Poland"
## [109] "Portugal" "Paraguay"
## [111] "State of Palestine" "Qatar"
## [113] "Romania" "Russian Federation"
## [115] "Rwanda" "Saudi Arabia"
## [117] "Sudan" "Senegal"
## [119] "Singapore" "Sierra Leone"
## [121] "El Salvador" "Serbia"
## [123] "Slovakia" "Slovenia"
## [125] "Sweden" "Eswatini"
## [127] "Syrian Arab Republic" "Chad"
## [129] "Togo" "Thailand"
## [131] "Tajikistan" "Turkmenistan"
## [133] "Trinidad and Tobago" "Tunisia"
## [135] "Turkey" "Taiwan"
## [137] "U.R. of Tanzania: Mainland" "Uganda"
## [139] "Ukraine" "Uruguay"
## [141] "United States of America" "Uzbekistan"
## [143] "Venezuela (Bolivarian Republic of)" "Viet Nam"
## [145] "Yemen" "South Africa"
## [147] "Zambia" "Zimbabwe"
# Subset full observations of population and rgdpe from earlier list
pwt_2 <- pwt_1[country%in%Reduce(intersect, list(full_pop_countries, full_rgdpe_countries)),]
pwt_2 <- pwt_2[isocode!="USA",]
NNS_Caus <- pwt_2[, NNS_Causation_Direction := names(NNS.caus(pop, rgdpe, tau = 1)[3]), by = country]
NNS_Caus <- pwt_2[, NNS_Causation := as.numeric(NNS.caus(pop, rgdpe, tau = 1)[3]), by = country]
NNS_Caus[, unique(.SD), .SDcols=c("NNS_Causation", "NNS_Causation_Direction"), by = country]
# Isolate instances of pop causing rgdpe
NNS_Caus[NNS_Causation_Direction == "C(x--->y)" & NNS_Causation > 0, unique(country)]
## [1] Angola United Arab Emirates
## [3] Bangladesh Belarus
## [5] Bolivia (Plurinational State of) Central African Republic
## [7] Switzerland Cote d'Ivoire
## [9] Cameroon Costa Rica
## [11] Czech Republic Dominican Republic
## [13] Algeria Estonia
## [15] Ghana Guinea
## [17] Gambia Iran (Islamic Republic of)
## [19] Iraq Kazakhstan
## [21] Latvia Madagascar
## [23] Mexico Mauritania
## [25] Malawi Malaysia
## [27] Niger Nigeria
## [29] Nicaragua Nepal
## [31] Oman Pakistan
## [33] Rwanda Saudi Arabia
## [35] Sierra Leone Serbia
## [37] Slovakia Syrian Arab Republic
## [39] Chad Tajikistan
## [41] Turkmenistan Turkey
## [43] Uzbekistan Venezuela (Bolivarian Republic of)
## [45] South Africa Zambia
## [47] Zimbabwe
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
An overwhelming majority of countries demonstrate that population does NOT cause growth. This makes intuitive sense. Look at China for example, who’s population in 1950 surpassed the U.S.’s current population, thus inferring China should have been as large as the U.S. back in 1950. Obviously, this was not the case, arguing against population as a cause to GDP.
Let’s look at pop growth rates and rgdpe growth rates rather than nominal levels…
# Create growth rate function
rate <- function(x) log((x/shift(x,1)))
# Apply growth rate to population and rgdpe
pwt_2[, c("Pop_rate", "Growth_rate") := lapply(.SD, rate), by = country, .SDcols = c("pop","rgdpe")]
NNS_Caus <- pwt_2[, NNS_Causation_Direction := names(NNS.caus(Pop_rate[-1], Growth_rate[-1], tau = 1)[3]), by = country]
NNS_Caus <- pwt_2[, NNS_Causation := as.numeric(NNS.caus(Pop_rate[-1], Growth_rate[-1], tau = 1)[3]), by = country]
NNS_Caus[, unique(.SD), .SDcols=c("NNS_Causation", "NNS_Causation_Direction"), by = country]
# Isolate instances of pop growth rate causing rgdpe growth
NNS_Caus[NNS_Causation_Direction == "C(x--->y)" & NNS_Causation > 0, unique(country)]
## [1] Australia Burkina Faso Belarus Brazil
## [5] Germany France Guinea Indonesia
## [9] Jordan Japan Kazakhstan Kyrgyzstan
## [13] Sri Lanka North Macedonia Nepal Pakistan
## [17] Romania Senegal Sierra Leone El Salvador
## [21] Serbia Tunisia Taiwan Ukraine
## [25] Uzbekistan Yemen
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
NNS does find an overwhelming majority, of the 148 countries in the complete observation list do NOT show that population growth causes real GDP growth.
Looking at an example, let’s visualize what’s going on. India’s growth rate and population growth rate are presented below, we can see the relationship between the two series. In fact, the correlation is negative for this country!
plot(pwt_2[country=="India", Pop_rate[-1]],pwt_2[country=="India", Growth_rate[-1]])
cor(pwt_2[country=="India", Pop_rate[-1]],pwt_2[country=="India", Growth_rate[-1]])
## [1] -0.5459281
pop…again…Below are the countries to show that pop causes rgdpe via generalCorr.
gc <- pwt_2[, gc_causality := causeSummBlk(cbind(pop, rgdpe))[1], by = country]
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8996 p-val= 0
## [1] rgdpe causes pop strength= -100
## [1] corr= 0.2931 p-val= 0.04317
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9704 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9379 p-val= 0
## [1] rgdpe causes pop strength= -100
## [1] corr= -0.4856 p-val= 0.0088
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9782 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9816 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8394 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9471 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9823 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.963 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9848 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8538 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= -0.7043 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8216 p-val= 0.00192
## [1] rgdpe causes pop strength= -37.008
## [1] corr= -0.8131 p-val= 0
## [1] rgdpe causes pop strength= -100
## [1] corr= -0.681 p-val= 7e-05
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9291 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9288 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9816 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.8784 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9872 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9743 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8831 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7919 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9454 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9842 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.0133 p-val= 0.91693
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9126 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9362 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9533 p-val= 0
## [1] rgdpe causes pop strength= -100
## [1] corr= 0.8377 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.8554 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9641 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9205 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.94 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.925 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9165 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9583 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.7927 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8806 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9696 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9802 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9114 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9618 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= -0.316 p-val= 0.10144
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9039 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7759 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.983 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9086 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.9458 p-val= 0.00433
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9646 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9713 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9488 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9807 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.8666 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9694 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.89 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8858 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8492 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9374 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8474 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8428 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9858 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9304 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8489 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9379 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9407 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.872 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9694 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.0386 p-val= 0.84522
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9123 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8751 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7903 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8696 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9689 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= -0.0532 p-val= 0.70229
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7562 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9339 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.9537 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.7406 p-val= 1e-05
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9464 p-val= 0
## [1] rgdpe causes pop strength= -100
## [1] corr= -0.2617 p-val= 0.17861
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9587 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9768 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9028 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.968 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7359 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8314 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9481 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9678 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9297 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9706 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.952 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8789 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9281 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.6461 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7461 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.95 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9635 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9271 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9707 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8863 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9576 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9093 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8763 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9488 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.626 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9117 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9315 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9837 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8007 p-val= 0.00175
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.036 p-val= 0.78826
## [1] rgdpe causes pop strength= -100
## [1] corr= -0.7166 p-val= 2e-05
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9009 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8517 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8993 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9824 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9674 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.9087 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8615 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.6129 p-val= 0.00053
## [1] rgdpe causes pop strength= -37.008
## [1] corr= 0.7051 p-val= 3e-05
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.7836 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9761 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9713 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.7694 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9351 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9455 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8672 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.4072 p-val= 0.03149
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8861 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.5549 p-val= 0.00011
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9735 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9046 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8894 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.893 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9668 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= -0.236 p-val= 0.22673
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.811 p-val= 0
## [1] pop causes rgdpe strength= 82.677
## [1] corr= 0.9066 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8369 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8621 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.845 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.9708 p-val= 0
## [1] pop causes rgdpe strength= 100
## [1] corr= 0.8021 p-val= 0
## [1] pop causes rgdpe strength= 37.008
## [1] corr= 0.5889 p-val= 0
# Isolate incidents of rgdpe as kernel cause
gc[gc_causality=="rgdpe", unique(country)]
## [1] Albania Armenia Bosnia and Herzegovina
## [4] Belarus Czech Republic Republic of Moldova
## [7] Russian Federation Slovakia
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
And let’s see if this holds for population growth rates and real GDP growth rates.
gc <- pwt_2[, gc_causality := causeSummBlk(cbind(Pop_rate[-1], Growth_rate[-1]))[1], by = country]
## [1] causes strength= -100
## Error in out[i - 1, 1] <- nam[i]: number of items to replace is not a multiple of replacement length
# Isolate incidents of Growth_rate as kernel cause
gc[gc_causality=="Growth_rate", unique(country)]
## factor(0)
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
For some internal algorithm reasons, the generalCorr method is generating errors related when using these normalized variables.
pop…again…and yet again with GrangerBelow are the only countries to show that pop causes rgdpe via Granger.
granger <- pwt_2[, granger_causality := grangertest(rgdpe ~ pop, order = 1)$Pr[2], by = country]
# Isolate instances of significance, p < .05
granger[granger_causality < 0.05, unique(country)]
## [1] Angola Argentina
## [3] Armenia Azerbaijan
## [5] Burundi Benin
## [7] Bulgaria Bosnia and Herzegovina
## [9] Belarus Botswana
## [11] Central African Republic Congo
## [13] Egypt Estonia
## [15] Georgia Gambia
## [17] Greece China, Hong Kong SAR
## [19] Croatia Haiti
## [21] Iran (Islamic Republic of) Japan
## [23] Kazakhstan Kyrgyzstan
## [25] Cambodia Republic of Korea
## [27] Lithuania Latvia
## [29] Republic of Moldova North Macedonia
## [31] Mauritania Malawi
## [33] Namibia State of Palestine
## [35] Romania Russian Federation
## [37] Singapore Sierra Leone
## [39] Serbia Slovakia
## [41] Eswatini Chad
## [43] Togo Tajikistan
## [45] Turkmenistan Tunisia
## [47] Taiwan Uganda
## [49] Ukraine Uzbekistan
## [51] Zambia
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
And we will try Granger on the population growth rate and real GDP growth rate…
granger <- pwt_2[, granger_causality := grangertest(Growth_rate[-1] ~ Pop_rate[-1], order = 1)$Pr[2], by = country]
# Isolate instances of significance, p < .05
granger[granger_causality < 0.05, unique(country)]
## [1] Azerbaijan Bosnia and Herzegovina Belarus
## [4] Germany Denmark France
## [7] Georgia China, Hong Kong SAR Hungary
## [10] India Israel Cambodia
## [13] Liberia Sri Lanka Mali
## [16] Myanmar Mozambique Mauritania
## [19] Namibia Netherlands Rwanda
## [22] Turkmenistan Tunisia Taiwan
## [25] Ukraine Uzbekistan Viet Nam
## [28] Zimbabwe
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
Granger only finds significance for population growth causing real GDP growth in 28 of the 148 countries.
Reviewing the literature may offer some ability to narrow down this search based on economic theory, or find other contributing factors besides population size.
Rodrik shows that undervaluation of the currency (a high real exchange rate \(RER\)) stimulates economic growth. He finds this is true particularly for developing countries. His finding is robust to using different measures of the real exchange rate and different estimation techniques.
We will use our techniques to see if these findings continue to demonstrate robustness. He suggests: \[\ln RER_{it} = \ln (XRAT_{it} / PPP_{it})\] where \(XRAT\) and \(PPP\) are expressed as national currency units per U.S. dollar. However, Rodrik then states,
“The variable \(p\) in the Penn World Tables (called the”price level of GDP“) is equivalent to \(RER\). I have used \(p\) here as this series is more complete than \(XRAT\) and \(PPP\).”
This measure, shows that values of \(RER\) greater than one indicate that the value of the currency is lower (more depreciated) than indicated by purchasing power parity.
We will use the inverse of the pl_gdpo variable included in the PWT which is simply (Exchange rate / PPP).
There are 148 countries with complete datasets for pl_gdpo and rgdpe.
pl_gdpo_countries <- pwt_1[, sum(is.na(pl_gdpo))/.N, by = country]
full_pl_gdpo_countries <- pl_gdpo_countries[V1==0, country]
Reduce(intersect, list(full_pl_gdpo_countries, full_rgdpe_countries))
## [1] "Angola" "Albania"
## [3] "United Arab Emirates" "Argentina"
## [5] "Armenia" "Australia"
## [7] "Austria" "Azerbaijan"
## [9] "Burundi" "Belgium"
## [11] "Benin" "Burkina Faso"
## [13] "Bangladesh" "Bulgaria"
## [15] "Bahrain" "Bosnia and Herzegovina"
## [17] "Belarus" "Bolivia (Plurinational State of)"
## [19] "Brazil" "Botswana"
## [21] "Central African Republic" "Canada"
## [23] "Switzerland" "Chile"
## [25] "China" "Cote d'Ivoire"
## [27] "Cameroon" "Congo, Democratic Republic"
## [29] "Congo" "Colombia"
## [31] "Costa Rica" "Czech Republic"
## [33] "Germany" "Denmark"
## [35] "Dominican Republic" "Algeria"
## [37] "Ecuador" "Egypt"
## [39] "Spain" "Estonia"
## [41] "Ethiopia" "Finland"
## [43] "France" "Gabon"
## [45] "United Kingdom" "Georgia"
## [47] "Ghana" "Guinea"
## [49] "Gambia" "Guinea-Bissau"
## [51] "Equatorial Guinea" "Greece"
## [53] "Guatemala" "China, Hong Kong SAR"
## [55] "Honduras" "Croatia"
## [57] "Haiti" "Hungary"
## [59] "Indonesia" "India"
## [61] "Ireland" "Iran (Islamic Republic of)"
## [63] "Iraq" "Israel"
## [65] "Italy" "Jamaica"
## [67] "Jordan" "Japan"
## [69] "Kazakhstan" "Kenya"
## [71] "Kyrgyzstan" "Cambodia"
## [73] "Republic of Korea" "Kuwait"
## [75] "Lao People's DR" "Lebanon"
## [77] "Liberia" "Sri Lanka"
## [79] "Lesotho" "Lithuania"
## [81] "Latvia" "Morocco"
## [83] "Republic of Moldova" "Madagascar"
## [85] "Mexico" "North Macedonia"
## [87] "Mali" "Myanmar"
## [89] "Mongolia" "Mozambique"
## [91] "Mauritania" "Mauritius"
## [93] "Malawi" "Malaysia"
## [95] "Namibia" "Niger"
## [97] "Nigeria" "Nicaragua"
## [99] "Netherlands" "Norway"
## [101] "Nepal" "New Zealand"
## [103] "Oman" "Pakistan"
## [105] "Panama" "Peru"
## [107] "Philippines" "Poland"
## [109] "Portugal" "Paraguay"
## [111] "State of Palestine" "Qatar"
## [113] "Romania" "Russian Federation"
## [115] "Rwanda" "Saudi Arabia"
## [117] "Sudan" "Senegal"
## [119] "Singapore" "Sierra Leone"
## [121] "El Salvador" "Serbia"
## [123] "Slovakia" "Slovenia"
## [125] "Sweden" "Eswatini"
## [127] "Syrian Arab Republic" "Chad"
## [129] "Togo" "Thailand"
## [131] "Tajikistan" "Turkmenistan"
## [133] "Trinidad and Tobago" "Tunisia"
## [135] "Turkey" "Taiwan"
## [137] "U.R. of Tanzania: Mainland" "Uganda"
## [139] "Ukraine" "Uruguay"
## [141] "United States of America" "Uzbekistan"
## [143] "Venezuela (Bolivarian Republic of)" "Viet Nam"
## [145] "Yemen" "South Africa"
## [147] "Zambia" "Zimbabwe"
pwt_2 <- pwt_1[country%in%Reduce(intersect, list(full_pl_gdpo_countries, full_rgdpe_countries)),]
pwt_2 <- pwt_2[isocode!="USA",]
NNSpwt_2[, "Growth_rate" := lapply(.SD, rate), by = country, .SDcols = "rgdpe"]
pwt_2$pl_gdpo <- pwt_2$pl_gdpo^-1
NNS_Caus <- pwt_2[, NNS_Causation_Direction := names(NNS.caus(pl_gdpo[-1], Growth_rate[-1], tau = 3)[3]), by = country]
NNS_Caus <- pwt_2[, NNS_Causation := as.numeric(NNS.caus(pl_gdpo[-1], Growth_rate[-1], tau = 3)[3]), by = country]
NNS_Caus[, unique(.SD), .SDcols=c("NNS_Causation", "NNS_Causation_Direction"), by = country]
NNS_Caus[NNS_Causation_Direction == "C(x--->y)" & NNS_Causation > 0, unique(country)]
## [1] Australia Austria
## [3] Belgium Bangladesh
## [5] Brazil Canada
## [7] Switzerland China
## [9] Colombia Spain
## [11] Finland Guinea
## [13] Hungary Indonesia
## [15] Iran (Islamic Republic of) Republic of Korea
## [17] Sri Lanka Madagascar
## [19] Mexico Mali
## [21] Netherlands New Zealand
## [23] Panama Poland
## [25] Portugal State of Palestine
## [27] Romania Sudan
## [29] Singapore Sweden
## [31] Syrian Arab Republic Viet Nam
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
generalCorrgc <- pwt_2[, gc_causality := causeSummBlk(cbind(pl_gdpo[-1], Growth_rate[-1]))[1], by = country]
## [1] causes strength= -84.252
## Error in out[i - 1, 1] <- nam[i]: number of items to replace is not a multiple of replacement length
# Isolate incidents of Growth_rate as kernel cause
gc[gc_causality=="Growth_rate", unique(country)]
## factor(0)
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
granger <- pwt_2[, granger_causality := grangertest(Growth_rate[-1] ~ pl_gdpo[-1], order = 1)$Pr[2], by = country]
# Isolate instances of significance, p < .05
granger[granger_causality < 0.05, unique(country)]
## [1] Armenia Azerbaijan Bangladesh
## [4] Botswana Canada Germany
## [7] Denmark France Georgia
## [10] Greece China, Hong Kong SAR Israel
## [13] Italy Japan Kyrgyzstan
## [16] Cambodia Lao People's DR Sri Lanka
## [19] Namibia Nepal Saudi Arabia
## [22] Senegal Eswatini Tajikistan
## [25] Turkmenistan Taiwan Viet Nam
## 182 Levels: Aruba Angola Anguilla Albania United Arab Emirates ... Zimbabwe
Again, the generalCorr method is generating errors while Granger is showing significance for only 27 of the 148 countries.
Output per worker varies enormously across countries. Why? On an accounting basis their analysis shows that differences in physical capital and educational attainment can only partially explain the variation in output per worker. They find a large amount of variation in the level of the Solow residual across countries. At a deeper level, they document that the differences in capital accumulation, productivity, and therefore output per worker are driven by differences in institutions and government policies, which they call ``social infrastructure’’. They treat social infrastructure as endogenous, determined historically by location and other factors captured in part by language.
We can cluster the rdgpe by location, or latitude, and test to see if there are statistically significant differences in the distributions of the average member nation. We will cluster the countries by latitude and then transform rdgpe to a growth rate for normalization across countries.
The geographic data was downloaded from https://lab.lmnixon.org/4th/worldcapitals.html, and stored locally as a .csv file named ``capitals.csv’’.
capitals <- read.csv(file = "capitals.csv", sep = ",")
capitals$Longitude <- as.numeric(gsub("[NE]$", "",gsub("^(.*)[WS]$", "-\\1", capitals$Longitude)))
capitals$Latitude <- as.numeric(gsub("[NE]$", "",gsub("^(.*)[WS]$", "-\\1", capitals$Latitude)))
country_list <- sort(unique(pwt[country%in%capitals$Country,]$country))
pwt_3 <- pwt[country%in%country_list, ]
colnames(capitals) <- tolower(colnames(capitals))
pwt_3 <- merge(pwt_3, capitals, by="country")
tail(pwt_3)
pwt_3[, "growth_rate" := lapply(.SD, rate), by = country, .SDcols = "rgdpe"]
pwt_3[, "mean_growth_rate" := lapply(.SD, mean, na.rm = TRUE), by = country, .SDcols = "growth_rate"]
plot(pwt_3$latitude, pwt_3$mean_growth_rate, xlab="Latitude", ylab = "Growth Rate")
There are 146 countries, so we shall simply divide them into 3 groups of approximately 48 countries per group.
unique(pwt_3[latitude<11.375, country])
## [1] "Angola" "Argentina"
## [3] "Australia" "Benin"
## [5] "Botswana" "Brazil"
## [7] "Brunei Darussalam" "Burundi"
## [9] "Cambodia" "Cameroon"
## [11] "Central African Republic" "Chile"
## [13] "Colombia" "Congo"
## [15] "Costa Rica" "Cote d'Ivoire"
## [17] "Djibouti" "Ecuador"
## [19] "Equatorial Guinea" "Ethiopia"
## [21] "Fiji" "Gabon"
## [23] "Ghana" "Guinea"
## [25] "Indonesia" "Kenya"
## [27] "Lesotho" "Liberia"
## [29] "Madagascar" "Malawi"
## [31] "Malaysia" "Maldives"
## [33] "Mauritania" "Mozambique"
## [35] "Namibia" "New Zealand"
## [37] "Nigeria" "Panama"
## [39] "Paraguay" "Peru"
## [41] "Sao Tome and Principe" "Sierra Leone"
## [43] "South Africa" "Suriname"
## [45] "Togo" "Uganda"
## [47] "Uruguay" "Zambia"
## [49] "Zimbabwe"
group_1_growth <- mean(pwt_3[latitude<0, ]$mean_growth_rate)
unique(pwt_3[latitude>=11.375 & latitude<35.5, country])
## [1] "Antigua and Barbuda" "Aruba"
## [3] "Bahamas" "Bahrain"
## [5] "Bangladesh" "Barbados"
## [7] "Belize" "Bhutan"
## [9] "British Virgin Islands" "Burkina Faso"
## [11] "Cayman Islands" "Chad"
## [13] "Cyprus" "Dominica"
## [15] "Egypt" "El Salvador"
## [17] "Gambia" "Guatemala"
## [19] "Guinea-Bissau" "Haiti"
## [21] "Honduras" "India"
## [23] "Iran (Islamic Republic of)" "Iraq"
## [25] "Israel" "Jamaica"
## [27] "Jordan" "Kuwait"
## [29] "Lebanon" "Mali"
## [31] "Mexico" "Myanmar"
## [33] "Nepal" "Nicaragua"
## [35] "Niger" "Oman"
## [37] "Pakistan" "Philippines"
## [39] "Qatar" "Saint Kitts and Nevis"
## [41] "Saint Lucia" "Saudi Arabia"
## [43] "Senegal" "Sudan"
## [45] "Syrian Arab Republic" "Thailand"
## [47] "United Arab Emirates" "Viet Nam"
group_2_growth <- mean(pwt_3[latitude>=11.375 & latitude<35.5, ]$mean_growth_rate)
unique(pwt_3[latitude>=35.5, country])
## [1] "Albania" "Algeria"
## [3] "Armenia" "Austria"
## [5] "Azerbaijan" "Belarus"
## [7] "Belgium" "Bosnia and Herzegovina"
## [9] "Bulgaria" "Canada"
## [11] "China" "Croatia"
## [13] "Czech Republic" "Denmark"
## [15] "Estonia" "Finland"
## [17] "France" "Georgia"
## [19] "Germany" "Greece"
## [21] "Hungary" "Iceland"
## [23] "Ireland" "Italy"
## [25] "Kazakhstan" "Kyrgyzstan"
## [27] "Latvia" "Lithuania"
## [29] "Luxembourg" "Malta"
## [31] "Netherlands" "Norway"
## [33] "Poland" "Portugal"
## [35] "Republic of Korea" "Romania"
## [37] "Russian Federation" "Slovakia"
## [39] "Slovenia" "Spain"
## [41] "Sweden" "Switzerland"
## [43] "Tajikistan" "Tunisia"
## [45] "Turkey" "Turkmenistan"
## [47] "Ukraine" "United States of America"
## [49] "Uzbekistan"
group_3_growth <- mean(pwt_3[latitude>=35.5, ]$mean_growth_rate)
We can see those direct differences in average growth rates for each of these groups, especially the Northern group 3.
plot(pwt_3$latitude, pwt_3$mean_growth_rate, xlab="Latitude", ylab = "Growth Rate",
col = ifelse(pwt_3$latitude<11.375, 'red',
ifelse(pwt_3$latitude<35.5, 'blue', 'purple')))
segments(min(pwt_3$latitude), group_1_growth, 11.375, group_1_growth, col = 'red', lwd = 3)
segments(11.375, group_2_growth, 35.5, group_2_growth, col = 'blue', lwd = 3)
segments(35.5, group_3_growth, max(pwt_3$latitude), group_3_growth, col = 'purple', lwd = 3)
# Add group labels to PWT
pwt_4 <- pwt_3
pwt_4[latitude<11.375, "group" := 1]
pwt_4[latitude>=11.375 & latitude<35.5, "group" := 2]
pwt_4[latitude>=35.5, "group" := 3]
anova_fit <- aov(growth_rate ~ as.factor(group), data = pwt_4)
# Summary of the analysis
summary(anova_fit)
## Df Sum Sq Mean Sq F value Pr(>F)
## as.factor(group) 2 0.10 0.04940 6.967 0.000948 ***
## Residuals 7989 56.65 0.00709
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 1936 observations deleted due to missingness
TukeyHSD(anova_fit)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = growth_rate ~ as.factor(group), data = pwt_4)
##
## $`as.factor(group)`
## diff lwr upr p adj
## 2-1 0.004356783 -0.0009289692 0.0096425344 0.1297363
## 3-1 -0.004476332 -0.0099153152 0.0009626506 0.1305302
## 3-2 -0.008833115 -0.0143817438 -0.0032844859 0.0005612
There is indeed a significant difference in means for growth rates for group 3, while groups 1 and 2 do not appear to be different. Therefore, location appears to offer an explanation of growth, thus supporting Hall and Jones’ social infrastructure contention.
Causal analysis as performed in the previous section will be ineffectual given the categorical nature of the location variable as proxied by latitude against the panel data of the country’s growth.
pwt_5 <- pwt_4[pwt_4$year >= 2000,]
pwt_5[, "growth_rate" := lapply(.SD, rate), by = country, .SDcols = "rgdpe"]
pwt_5[, "mean_growth_rate" := lapply(.SD, mean, na.rm = TRUE), by = country, .SDcols = "growth_rate"]
plot(pwt_5$latitude, pwt_5$mean_growth_rate, xlab="Latitude", ylab = "Growth Rate")
group_1_growth <- mean(pwt_5[latitude<11.375, ]$mean_growth_rate)
group_2_growth <- mean(pwt_5[latitude>=11.375 & latitude<35.5, ]$mean_growth_rate)
group_3_growth <- mean(pwt_5[latitude>=35.5, ]$mean_growth_rate)
plot(pwt_5$latitude, pwt_5$mean_growth_rate, xlab="Latitude", ylab = "Growth Rate",
col = ifelse(pwt_5$latitude<11.375, 'red',
ifelse(pwt_5$latitude<35.5, 'blue', 'purple')))
segments(min(pwt_5$latitude), group_1_growth, 11.375, group_1_growth, col = 'red', lwd = 3)
segments(11.375, group_2_growth, 35.5, group_2_growth, col = 'blue', lwd = 3)
segments(35.5, group_3_growth, max(pwt_5$latitude), group_3_growth, col = 'purple', lwd = 3)
anova_fit <- aov(growth_rate ~ as.factor(group), data = pwt_5)
# Summary of the analysis
summary(anova_fit)
## Df Sum Sq Mean Sq F value Pr(>F)
## as.factor(group) 2 0.039 0.019447 3.603 0.0274 *
## Residuals 2479 13.380 0.005397
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 146 observations deleted due to missingness
TukeyHSD(anova_fit)
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = growth_rate ~ as.factor(group), data = pwt_5)
##
## $`as.factor(group)`
## diff lwr upr p adj
## 2-1 -0.002024647 -0.01051048 0.0064611866 0.8415778
## 3-1 -0.009200986 -0.01764297 -0.0007590076 0.0286892
## 3-2 -0.007176340 -0.01566217 0.0013094940 0.1165417
There is still significant difference in mean growth rates since 2000, and closer inspection via the Tukey test shows it is a negative difference in group 3, the Northern countries.
What if we examine the trajectory of the p-values in the difference between groups 1 and 3 year by year…
The red horizontal line represents the \(p=0.05\) level of significance for the difference in means between groups 1 and 3.
p_value <- numeric()
for(i in unique(pwt_4$year)){
index <- which(i==unique(pwt_4$year))
pwt_5 <- pwt_4[pwt_4$year >= i, ]
pwt_5[, "mean_growth_rate" := lapply(.SD, mean, na.rm = TRUE), by = country,
.SDcols = "growth_rate"]
group_1_growth <- mean(pwt_5[latitude<11.375, ]$mean_growth_rate)
group_2_growth <- mean(pwt_5[latitude>=11.375 & latitude<35.5, ]$mean_growth_rate)
group_3_growth <- mean(pwt_5[latitude>=35.5, ]$mean_growth_rate)
anova_fit <- aov(mean_growth_rate ~ as.factor(group), data = pwt_5)
a <- TukeyHSD(anova_fit)
p_value[index] <- a[[1]][2,4]
}
plot(head(unique(pwt_4$year), length(na.omit(p_value))), na.omit(p_value),
xlab = "Year", ylab = "p-value for Group 3-1 Difference")
abline(h=0.05, col='red')
We fail to reject the differences in group means over the last several years. Maybe this is the convergence they were speaking of and can contribute to GDP growth?
Below are the key findings from this analysis:
All 3 causation methods find rgdpe causes cwtfp.
NNS and Granger do not find population or population growth rates to cause real GDP or real GDP growth respectively.
generalCorr does find population to cause real GDP levels.
NNS finds a majority of countries real exchange rates \((RER)\) NOT to cause real GDP growth. This does not support Rodrick 2008.
Granger finds an overwhelming majority of countries real exchange rates \((RER)\) to NOT cause real GDP growth. This does not support Rodrick 2008.
Location does indeed have some lingering effects on real GDP growth, however, they are diminishing and not significant over the last several years supporting the convergence argument.
Feenstra, Robert C., Robert Inklaar, and Marcel P. Timmer (2015) ``The next generation of the Penn World Table.’’ American Economic Review, 105, no. 10, 3150-82.
Hall, Robert E., and Jones, Charles I. (1999) ``Why Do Some Countries Produce So Much More Output Per Worker Than Others?’’ The Quarterly Journal of Economics, Vol. 114, No. 1 (Feb., 1999), pp. 83-116.
Rodrik, Dani. ``The Real Exchange Rate and Economic Growth.’’ Brookings Papers on Economic Activity 2008, no. 2 (2008): 365-412. https://doi.org/10.1353/eca.0.0020.
Vinod, H. (2014) Matrix Algebra Topics in Statistics and Economics Using R'', inHandbook of Statistics’’, Volume 32, Ch. 4, 2014, Pages 143-176, https://doi.org/10.1016/B978-0-444-63431-3.00004-8.
Vinod, H. (2015) ``Generalized Correlation and Kernel Causality with Applications in Development Economics,’’ Communications in Statistics - Simulation and Computation, accepted Nov. 10, 2015, http://dx.doi.org/10.1080/03610918.2015.1122048.
Viole, F., and Nawrocki, D. (2013) ``Non-Linear Scaling Normalization with Variance Retention,’’ Available at SSRN, https://ssrn.com/abstract=2262358.
Viole, F., and Nawrocki, D. (2013) ``Causation,’’ Available at SSRN, https://ssrn.com/abstract=2273756.