1 Intro

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.

1.1 Ground Truth

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.

2 PWT 9.1 Data

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)

2.1 Step 1: Select only Countries with pop > 1mm

The 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,]

2.2 Step 2: Find the Countries with No cwtfp Data

We 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",]

2.3 Step 3: NNS Causation Method

NNS 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]

2.3.1 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

2.4 Step 4: Granger Causality

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]

2.4.1 Granger: Countries NOT to show 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

2.5 Step 5: Generalized Correlations and Kernel Causality generalCorr

Vinod (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

2.5.1 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???

2.6 Step 2a: Let’s Try Population pop

Below 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

2.7 Step 2a: Let’s Try 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.

2.8 Step 2a: Let’s Try pop…again…and yet again with Granger

Below 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.

3 Finding Other Causative Variables

Reviewing the literature may offer some ability to narrow down this search based on economic theory, or find other contributing factors besides population size.

3.1 Rodrik (2008)

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",]

3.1.1 NNS

pwt_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

3.1.2 generalCorr

gc <- 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

3.1.3 Granger

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.

3.2 Hall and Jones (1999)

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.

3.2.1 Step 6: Incorporate Longitudinal Data

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")

World Latitudes

3.2.2 Determine the Clusters

There are 146 countries, so we shall simply divide them into 3 groups of approximately 48 countries per group.

3.2.3 Group 1: -40 to 11.375 Latitude Countries

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)

3.2.4 Group 2: 11.375 to 35.5 Latitude Countries

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)

3.2.5 Group 3: Greater than 35.5 Latitude Countries

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)

3.2.6 ANOVA of 3 Groups’ Growth Rates

# 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.

3.2.7 Does This Hold Since 2000?

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.

3.2.8 Year by Year Average Growth Rates for Each Group

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?

4 Summary

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.

5 References

  • 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.