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:
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))
df_7014 %>% select(country, rgdpoPop, cconPop, n, g, s_proxy)
On commence par observer notre base de données pour comprendre la relation entre nos variables avant de passer à l’estimation.
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 |
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 |
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.