Présentation

On cherche aujourd’hui à reproduire la méthode présentée dans l’article de Mankiw, Romer, and Weil (1990). Les auteurs cherchent à estimer le modèle de Solow (1988). Les deux hypothèses que l’ont cherche à tester sont:

Nous allons ici nous limiter à l’estimation du modèle de Solow standard et laisser de côté le modèle augmenté du capital humain, je vous invite à lire l’article pour avoir plus d’informations à ce sujet.

L’équation que nous souhaitons estimer est la suivante:

\[ \ln\left[\frac{Y}{L}\right] = c + \frac{\alpha}{1-\alpha}\ln(s) - \frac{\alpha}{1-\alpha}\ln(n+e+\delta) + \epsilon\] Avec:

La méthode se déroule en trois parties:

  1. Créer notre base de données.
  2. Visualiser nos données à travers des graphiques
  3. Estimer l’équation du modèle

Création de notre base de données

Je commence par déclarer quelques variables utiles pour la suite.

> startDate <- 1970
> middleDate <- 1985
> endDate   <- 2014
> 
> # Je mets ici la liste des pays de l'OCDE, j'en aurai besoin plus tard
> OECD_list <- c("BRA", "CHN", "COL", "CRI", "HUN", "IDN", "IND", "ISL", "LUX", "ZAF", "ARG", "AUS", "AUT", "BEL", "CAN", "CHE", "CHL", "DEU", "DNK", "ESP", "FIN", "FRA", "GBR", "GRC", "IRL", "ISR", "ITA", "JPN", "KOR", "MEX", "NLD", "NOR", "NZL", "POL", "PRT", "SWE", "TUR")

Je télécharge ensuite les données.

url <- getURL('http://mayerowitz.io/download/pwt90.csv')
data <- read.csv(text = url, sep=";")

On isole les variables qui nous intéressent:

df <- as.data.frame(data) %>%
  select(countrycode, country, year, rgdpo, cgdpo, ccon, csh_i, pop, delta, hc)

On crée les variables dont on a besoin

df <- df %>% 
  mutate(s_proxy = (csh_i*cgdpo)/cgdpo, # Taux d'épargne
         rgdpoPop= rgdpo/pop,           # PIB/hab
         cconPop = ccon/pop,            # Conso/hab
         OECD    = ifelse(countrycode %in% OECD_list,1,0)) # Variable indicatrice pour les pays de l'OCDE

On supprime également les données qui précèdent 1970 et les pays pour lesquelles il y a une absence d’observations.

df <- df %>%
  group_by(countrycode) %>%
  filter(!is.na(rgdpo),
         !is.na(delta),
         year >= startDate) %>%
  filter(min(year) == startDate)

On construit 2 bases de données pour les 2 horizons temporels différents : 1970-2014, 1970-1985. On veut donc pour chaque pays avoir la moyenne des variables sur l’horizon temporel choisi.

df_7014 <- df %>%
  group_by(country, countrycode) %>%
  mutate(firstPop  = first(pop),
         lastPop   = last(pop),
         firstGdp  = first(rgdpo),
         lastGdp   = last(rgdpo),
         n = (lastPop/firstPop)^(1/(endDate-startDate)) -1,     #Taux de croissance annuel de la pop
         g = (lastGdp/firstGdp)^(1/(endDate-startDate)) -1) %>% #Taux de croissance annuel du PIB
  # On ne garde que la moyenne sur la période (puisque notre estimation est faire sur des données en coupe):
  summarise_all(mean) %>% 
  mutate(lrgdpoPop = log(rgdpoPop),                   # log(Y/L)
         ls        = log(s_proxy),                    # log(s)
         lngd      = log(n+0.015+delta),              # log(n+e+delta)
         contr     = ls-lngd,                         # log(s)-log(n+g+delta) pour le modèle contraint
         oecd15K      = ifelse(OECD==1,ifelse(rgdpoPop >= 15000,1,0),0),
         lGdpPopFirst = log(firstGdp/firstPop),
         lGdpPopLast  = log(lastGdp/lastPop))

df_7085 <- df %>%
  group_by(country, countrycode) %>%
  filter(year <= middleDate) %>%
  mutate(firstPop  = first(pop),
         lastPop   = last(pop),
         firstGdp  = first(rgdpo),
         lastGdp   = last(rgdpo),
         n = (lastPop/firstPop)^(1/(middleDate-startDate)) -1,
         g = (lastGdp/firstGdp)^(1/(middleDate-startDate)) -1) %>%
  summarise_all(mean) %>%
  mutate(lrgdpoPop = log(rgdpoPop),
         ls        = log(s_proxy),
         lngd      = log(n+0.02+delta),
         contr     = ls-lngd,
         oecd15K   = ifelse(OECD==1,ifelse(rgdpoPop >= 15000,1,0),0))

Un petit apperçu de la base:

df_7014 %>% select(country, rgdpoPop, cconPop, n, g, s_proxy)

Quelques graphs

On commence par observer notre base de données pour comprendre la relation entre nos variables avant de passer à l’estimation.

Les régressions

Sur la période 1970-2014

fit.all.stand <- lm(lrgdpoPop ~ ls + lngd, data=df_7014) # Tous les pays, pas de contraint
fit.all.oecd <- lm(lrgdpoPop ~ ls + lngd, data=df_7014, subset = (OECD==1)) # OCDE, pas de contrainte
fit.all.constr <- lm(lrgdpoPop ~ contr, data=df_7014) # Tous les pays, modèle contraint
fit.all.constr.oecd <- lm(lrgdpoPop ~ contr, data=df_7014, subset = (OECD==1)) # OCDE, modèle contraint
All cntry OECD All, restricted OECD, restricted
Constante 10.36*** 9.78*** 7.45*** 7.67***
(1.09) (2.15) (0.18) (0.44)
ln(i/gdp) 1.69*** 1.98***
(0.19) (0.50)
ln(n+e+d) -0.44 -1.01
(0.40) (0.68)
ln(i/gdp)-ln(n+e+d) 1.42*** 1.61***
(0.16) (0.34)
R2 0.36 0.41 0.33 0.40
Adj. R2 0.35 0.38 0.33 0.38
Num. obs. 156 37 156 37
RMSE 1.01 0.56 1.03 0.56
***p < 0.001, **p < 0.01, *p < 0.05

Sur la période 1970-1985

fit.all.stand <- lm(lrgdpoPop ~ ls + lngd, data=df_7085)
fit.all.oecd <- lm(lrgdpoPop ~ ls + lngd, data=df_7085, subset = (OECD==1))
fit.all.constr <- lm(lrgdpoPop ~ contr, data=df_7085)
fit.all.constr.oecd <- lm(lrgdpoPop ~ contr, data=df_7085, subset = (OECD==1))
All cntry OECD All, restricted OECD, restricted
Constante 9.87*** 8.85*** 7.83*** 7.50***
(1.08) (1.88) (0.14) (0.33)
ln(i/gdp) 0.95*** 1.64***
(0.14) (0.34)
ln(n+e+d) -0.09 -1.04
(0.43) (0.67)
ln(i/gdp)-ln(n+e+d) 0.86*** 1.49***
(0.13) (0.26)
R2 0.23 0.48 0.22 0.47
Adj. R2 0.22 0.45 0.21 0.46
Num. obs. 156 37 156 37
RMSE 1.11 0.58 1.12 0.57
***p < 0.001, **p < 0.01, *p < 0.05

Bibliography

Mankiw, N.Gregory, David Romer, and David N. Weil. 1990. “A Contribution to the Empirics of Economic Growth.” NBER Working Paper.

Solow, Robert M. 1988. “A Contribution to the Theory of Economic Growth.” Quarterly Journal of Economics.