Carga de datos

En primer lugar, se cargan los datos correspondientes al índice de crecimiento inclusivo (ICI). Del conjunto total, se consideran dos variables: la economía correspondiente y su ICI general del único año disponible, 2021.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.InclusiveGrowth
ICI <- read.csv("ICI.csv")
ICI.Gen <- ICI[ICI$Category.Label == "Overall index", c(3, 6)]

A continuación, se cargan los conjuntos de datos que incluyen las variables con las que se intenta predecir el ICI: datos económicos de gasto público, balanza de pagos, índice de capacidad productiva (ICP), índice de precios del consumo (IPC), producto interior bruto (PIB) y datos demográficos de población. Para poder unir todos los datos en el mismo conjunto, se crea en cada caso una variable (llamada pais.ano) indicando la dimensión temporal y física de cada dato.

En cuanto al gasto público, se considera el gasto público total.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.GovExpenditures
gasto.publico <- read.csv("GastoPub.csv")
gasto.publico <- gasto.publico[, 1:3]
names(gasto.publico)[3] <- "Total.function"
gasto.publico$Year <- as.factor(gasto.publico$Year)
gasto.publico$pais.ano <- as.factor(paste(gasto.publico$Economy_Label, gasto.publico$Year))

Para los datos de balanza de pagos y, del mismo modo para el resto de variables, se limita la dimensión temporal entre los años 2000 y 2021.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.CurrAccBalance
bpagos <- read.csv("BalanzaPagos.csv")
bpagos <- bpagos[, -c(5:9)]
bpagos <- bpagos[bpagos$Year <= 2021 & bpagos$Year >= 2000, ]
bpagos$Year <- as.factor(bpagos$Year)
bpagos$pais.ano <- as.factor(paste(bpagos$Economy.Label, bpagos$Year))

Se carga el conjunto de datos del índice de capacidad productiva restringiéndose al valor general.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.PCI
ICP <- read.csv("ICP.csv")
ICP.Gen <- ICP[ICP$Category.Label == "Overall index: Productive capacities index", -c(4:5, 7:8)]
ICP.Gen <- ICP.Gen[ICP.Gen$Year <= 2021 & ICP.Gen$Year >= 2000, ]
ICP.Gen$Year <- as.factor(ICP.Gen$Year)
ICP.Gen$pais.ano <- as.factor(paste(ICP.Gen$Economy.Label, ICP.Gen$Year))

Se incorpora el índice de precios del consumo.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.Cpi_A
IPC <- read.csv("IPC.csv")
IPC <- IPC[, -c(5:9)]
IPC <- IPC[IPC$Year <= 2021 & IPC$Year >= 2000, ]
IPC$Year <- as.factor(IPC$Year)
IPC$pais.ano <- as.factor(paste(IPC$Economy.Label, IPC$Year))

Se repite el proceso para obtener el PIB y el PIB per cápita.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.GDPTotal
PIB <- read.csv("PIBTotal.csv")
PIB <- PIB[, -c(5:6, 8:15)]
PIB <- PIB[PIB$Year <= 2021 & PIB$Year >= 2000, ]
PIB$Year <- as.factor(PIB$Year)
PIB$pais.ano <- as.factor(paste(PIB$Economy.Label, PIB$Year))

Por último, se añaden la población total y el porcentaje de población urbana.

# Datos obtenidos de: https://unctadstat.unctad.org/datacentre/dataviewer/US.PopTotal
poblacion <- read.csv("PobTot.csv")
poblacion <- poblacion[, -c(5:6, 8:9)]
poblacion <- poblacion[poblacion$Year <= 2021 & poblacion$Year >= 2000, ]
poblacion$Year <- as.factor(poblacion$Year)
poblacion$pais.ano <- as.factor(paste(poblacion$Economy.Label, poblacion$Year))

Creación del conjunto de datos

Una vez cargados todos los datos, se crea un único conjunto en el que se reúnan todas las variables explicativas. Para ello se utiliza la variable pais.ano como nexo de unión. En cada combinación, se eliminan las variables redundantes y se renombran las útiles de forma explicativa.

En primer lugar, se juntan los datos de IPC y PIB.

datos <- merge(IPC, PIB, by.x = "pais.ano", by.y = "pais.ano", all = TRUE)
datos <- datos[, -c(2:4)]
names(datos)[2:7] <- c("IPC_Base2010", "Year", "Economy", "Economy.Label", "PIB", 
                       "PIB_capita")

Se incorporan las balanzas de pagos.

datos <- merge(datos, bpagos, by.x = "pais.ano", by.y = "pais.ano", all = TRUE)
datos <- datos[, -c(8:10)]
names(datos)[c(3:5, 8)] <- c("Year", "Economy", "Economy.Label", "Balanza_pagos")

Ahora, se incluyen los datos del ICP. Para esta variable, debemos completar los datos de año y economía al haber varios datos que solamente provienen de una variable.

datos <- merge(datos, ICP.Gen, by.x = "pais.ano", by.y = "pais.ano", all = TRUE)
for (i in 1:dim(datos)[1]) {
  if (is.na(datos$Year.x[i])) {
    datos$Year.x[i] = datos$Year.y[i]
    datos$Economy.x[i] = datos$Economy.y[i]
    datos$Economy.Label.x[i] = datos$Economy.Label.y[i]
  }
}
datos <- datos[, -c(9:11)]
names(datos)[c(3:5, 9)] <- c("Year", "Economy", "Economy.Label", "ICP")

Se añaden los datos de gasto público.

datos <- merge(datos, gasto.publico, by.x = "pais.ano", by.y = "pais.ano", all = TRUE)
datos <- datos[, -c(10:11)]
names(datos)[c(3, 10)] <- c("Year", "Gasto_publico_total")

Finalmente, se agregan las poblaciones de cada economía. Como en el caso del ICP, se necesitan completar los datos de año y economía.

datos <- merge(datos, poblacion, by.x = "pais.ano", by.y = "pais.ano", all = TRUE)
for (i in 1:dim(datos)[1]) {
  if (is.na(datos$Year.x[i])) {
    datos$Year.x[i] = datos$Year.y[i]
    datos$Economy.x[i] = datos$Economy.y[i]
    datos$Economy.Label.x[i] = datos$Economy.Label.y[i]
  }
}
datos <- datos[, -c(11:13)]
names(datos)[c(3:5, 11:12)] <- c("Year", "Economy", "Economy.Label",
                                 "Poblacion_mil", "Porcentaje_poblacion_urbana")

Por último, para facilitar el manejo de la información, se convierte la variable de economía a factor (variable categórica).

datos$Economy.Label <- as.factor(datos$Economy.Label)

Cálculo de tasas e incorporación del ICI

Se restringe la dimensión temporal al año 2021 y, para cada variable considerada, se calcula la correspondiente tasa de variación con respecto al año 2020. Así, se incorporan tantas tasas como variables explicativas se habían considerado.

tasas <- datos[datos$Year == 2021, ]
for (i in c(2, 6:12)){
  nombre <- paste0("tasa_", names(datos)[i])
  tasas <- cbind(tasas, datos[,i][datos$Year == 2021]/datos[,i][datos$Year == 2020]-1)
  names(tasas)[dim(tasas)[2]] <- nombre
}

Ahora, se añade el ICI al conjunto de datos y se eliminan columnas sobrantes. Así, se tienen datos de 129 economías.

tasas <- merge(tasas, ICI.Gen) 
tasas <- tasas[, -c(2, 4, 5)]

Se describe el conjunto de variables para conocer cuántos datos perdidos hay y se calcula el coeficiente de correlación entre las variables.

apply(tasas, 2, function(x){sum(is.na(x))}) 
                   Economy.Label                     IPC_Base2010 
                               0                                0 
                             PIB                       PIB_capita 
                               0                                0 
                   Balanza_pagos                              ICP 
                               2                                0 
             Gasto_publico_total                    Poblacion_mil 
                              71                                0 
     Porcentaje_poblacion_urbana                tasa_IPC_Base2010 
                               0                                0 
                        tasa_PIB                  tasa_PIB_capita 
                               0                                0 
              tasa_Balanza_pagos                         tasa_ICP 
                               2                                0 
        tasa_Gasto_publico_total               tasa_Poblacion_mil 
                              72                                0 
tasa_Porcentaje_poblacion_urbana                 Inclusive.growth 
                               0                                0 
cor(tasas[, -1], use = "complete.obs")
                                 IPC_Base2010         PIB  PIB_capita
IPC_Base2010                       1.00000000 -0.09230139 -0.42960442
PIB                               -0.09230139  1.00000000  0.23129997
PIB_capita                        -0.42960442  0.23129997  1.00000000
Balanza_pagos                     -0.02693896 -0.74839862 -0.00446677
ICP                               -0.42158479  0.32948552  0.76539433
Gasto_publico_total               -0.10693052  0.99775156  0.23806178
Poblacion_mil                      0.12809321  0.75442011 -0.03919114
Porcentaje_poblacion_urbana       -0.26504517  0.21103180  0.60271111
tasa_IPC_Base2010                  0.79444680 -0.03291196 -0.33327748
tasa_PIB                           0.20713415 -0.17923843  0.03730975
tasa_PIB_capita                    0.19255310 -0.17756698  0.01108591
tasa_Balanza_pagos                 0.03764690 -0.02302653  0.04429333
tasa_ICP                           0.09599100  0.10456126  0.07390691
tasa_Gasto_publico_total           0.11174846 -0.14004314 -0.23415510
tasa_Poblacion_mil                 0.14097238 -0.02433286  0.18924856
tasa_Porcentaje_poblacion_urbana   0.20615128 -0.12529028 -0.43414029
Inclusive.growth                  -0.59798854  0.14235281  0.87272744
                                 Balanza_pagos          ICP
IPC_Base2010                       -0.02693896 -0.421584789
PIB                                -0.74839862  0.329485520
PIB_capita                         -0.00446677  0.765394328
Balanza_pagos                       1.00000000 -0.076586716
ICP                                -0.07658672  1.000000000
Gasto_publico_total                -0.73264453  0.345018110
Poblacion_mil                      -0.49687761  0.057711154
Porcentaje_poblacion_urbana         0.02966333  0.693527541
tasa_IPC_Base2010                  -0.10562592 -0.310697913
tasa_PIB                            0.03309353 -0.005965853
tasa_PIB_capita                     0.03627488  0.003154808
tasa_Balanza_pagos                  0.02195897 -0.048517876
tasa_ICP                           -0.15078869  0.392461561
tasa_Gasto_publico_total           -0.05174297 -0.046311552
tasa_Poblacion_mil                 -0.02712059 -0.087024048
tasa_Porcentaje_poblacion_urbana   -0.04400833 -0.554681752
Inclusive.growth                    0.05525759  0.797365190
                                 Gasto_publico_total Poblacion_mil
IPC_Base2010                             -0.10693052    0.12809321
PIB                                       0.99775156    0.75442011
PIB_capita                                0.23806178   -0.03919114
Balanza_pagos                            -0.73264453   -0.49687761
ICP                                       0.34501811    0.05771115
Gasto_publico_total                       1.00000000    0.73360598
Poblacion_mil                             0.73360598    1.00000000
Porcentaje_poblacion_urbana               0.22004613    0.05974288
tasa_IPC_Base2010                        -0.04280806    0.03592597
tasa_PIB                                 -0.18527300   -0.22708646
tasa_PIB_capita                          -0.18232650   -0.23359214
tasa_Balanza_pagos                       -0.02462406   -0.03065499
tasa_ICP                                  0.10585207    0.11024626
tasa_Gasto_publico_total                 -0.13090573   -0.13789958
tasa_Poblacion_mil                       -0.03457567    0.04266292
tasa_Porcentaje_poblacion_urbana         -0.13703107    0.10546063
Inclusive.growth                          0.15970338   -0.14926799
                                 Porcentaje_poblacion_urbana
IPC_Base2010                                     -0.26504517
PIB                                               0.21103180
PIB_capita                                        0.60271111
Balanza_pagos                                     0.02966333
ICP                                               0.69352754
Gasto_publico_total                               0.22004613
Poblacion_mil                                     0.05974288
Porcentaje_poblacion_urbana                       1.00000000
tasa_IPC_Base2010                                -0.16215353
tasa_PIB                                          0.08567282
tasa_PIB_capita                                   0.09069797
tasa_Balanza_pagos                               -0.13270350
tasa_ICP                                          0.33637316
tasa_Gasto_publico_total                         -0.14359094
tasa_Poblacion_mil                               -0.04581179
tasa_Porcentaje_poblacion_urbana                 -0.60196746
Inclusive.growth                                  0.60693235
                                 tasa_IPC_Base2010     tasa_PIB
IPC_Base2010                            0.79444680  0.207134152
PIB                                    -0.03291196 -0.179238434
PIB_capita                             -0.33327748  0.037309752
Balanza_pagos                          -0.10562592  0.033093530
ICP                                    -0.31069791 -0.005965853
Gasto_publico_total                    -0.04280806 -0.185272999
Poblacion_mil                           0.03592597 -0.227086463
Porcentaje_poblacion_urbana            -0.16215353  0.085672824
tasa_IPC_Base2010                       1.00000000  0.085899270
tasa_PIB                                0.08589927  1.000000000
tasa_PIB_capita                         0.08267287  0.991203818
tasa_Balanza_pagos                     -0.12177493 -0.086892064
tasa_ICP                                0.01111403  0.286841622
tasa_Gasto_publico_total                0.02152679  0.249234533
tasa_Poblacion_mil                      0.04744582  0.094276672
tasa_Porcentaje_poblacion_urbana        0.01144936  0.034238372
Inclusive.growth                       -0.42695808 -0.052657437
                                 tasa_PIB_capita tasa_Balanza_pagos
IPC_Base2010                         0.192553104         0.03764690
PIB                                 -0.177566981        -0.02302653
PIB_capita                           0.011085907         0.04429333
Balanza_pagos                        0.036274875         0.02195897
ICP                                  0.003154808        -0.04851788
Gasto_publico_total                 -0.182326498        -0.02462406
Poblacion_mil                       -0.233592140        -0.03065499
Porcentaje_poblacion_urbana          0.090697970        -0.13270350
tasa_IPC_Base2010                    0.082672873        -0.12177493
tasa_PIB                             0.991203818        -0.08689206
tasa_PIB_capita                      1.000000000        -0.10338925
tasa_Balanza_pagos                  -0.103389255         1.00000000
tasa_ICP                             0.291481638        -0.13293897
tasa_Gasto_publico_total             0.246158453         0.20026377
tasa_Poblacion_mil                  -0.038078841         0.13818274
tasa_Porcentaje_poblacion_urbana     0.003172748         0.29076813
Inclusive.growth                    -0.039173136        -0.06722025
                                    tasa_ICP tasa_Gasto_publico_total
IPC_Base2010                      0.09599100               0.11174846
PIB                               0.10456126              -0.14004314
PIB_capita                        0.07390691              -0.23415510
Balanza_pagos                    -0.15078869              -0.05174297
ICP                               0.39246156              -0.04631155
Gasto_publico_total               0.10585207              -0.13090573
Poblacion_mil                     0.11024626              -0.13789958
Porcentaje_poblacion_urbana       0.33637316              -0.14359094
tasa_IPC_Base2010                 0.01111403               0.02152679
tasa_PIB                          0.28684162               0.24923453
tasa_PIB_capita                   0.29148164               0.24615845
tasa_Balanza_pagos               -0.13293897               0.20026377
tasa_ICP                          1.00000000               0.06942154
tasa_Gasto_publico_total          0.06942154               1.00000000
tasa_Poblacion_mil               -0.03512085               0.03595882
tasa_Porcentaje_poblacion_urbana -0.19391962               0.15798786
Inclusive.growth                  0.10015089              -0.23594067
                                 tasa_Poblacion_mil
IPC_Base2010                             0.14097238
PIB                                     -0.02433286
PIB_capita                               0.18924856
Balanza_pagos                           -0.02712059
ICP                                     -0.08702405
Gasto_publico_total                     -0.03457567
Poblacion_mil                            0.04266292
Porcentaje_poblacion_urbana             -0.04581179
tasa_IPC_Base2010                        0.04744582
tasa_PIB                                 0.09427667
tasa_PIB_capita                         -0.03807884
tasa_Balanza_pagos                       0.13818274
tasa_ICP                                -0.03512085
tasa_Gasto_publico_total                 0.03595882
tasa_Poblacion_mil                       1.00000000
tasa_Porcentaje_poblacion_urbana         0.24520122
Inclusive.growth                        -0.11764543
                                 tasa_Porcentaje_poblacion_urbana
IPC_Base2010                                          0.206151276
PIB                                                  -0.125290283
PIB_capita                                           -0.434140293
Balanza_pagos                                        -0.044008329
ICP                                                  -0.554681752
Gasto_publico_total                                  -0.137031072
Poblacion_mil                                         0.105460635
Porcentaje_poblacion_urbana                          -0.601967464
tasa_IPC_Base2010                                     0.011449363
tasa_PIB                                              0.034238372
tasa_PIB_capita                                       0.003172748
tasa_Balanza_pagos                                    0.290768127
tasa_ICP                                             -0.193919622
tasa_Gasto_publico_total                              0.157987860
tasa_Poblacion_mil                                    0.245201222
tasa_Porcentaje_poblacion_urbana                      1.000000000
Inclusive.growth                                     -0.513866336
                                 Inclusive.growth
IPC_Base2010                          -0.59798854
PIB                                    0.14235281
PIB_capita                             0.87272744
Balanza_pagos                          0.05525759
ICP                                    0.79736519
Gasto_publico_total                    0.15970338
Poblacion_mil                         -0.14926799
Porcentaje_poblacion_urbana            0.60693235
tasa_IPC_Base2010                     -0.42695808
tasa_PIB                              -0.05265744
tasa_PIB_capita                       -0.03917314
tasa_Balanza_pagos                    -0.06722025
tasa_ICP                               0.10015089
tasa_Gasto_publico_total              -0.23594067
tasa_Poblacion_mil                    -0.11764543
tasa_Porcentaje_poblacion_urbana      -0.51386634
Inclusive.growth                       1.00000000

Al haber más de 70 valores desconocidos para el gasto público (y su tasa), no se tienen en cuenta estas variables para la construcción de los distintos modelos. A continuación, se crea una matriz de diagramas de dispersión con las 3 variables que mayor correlación presenta con la ICI. Además, se muestra el p-valor que indica si esa relación es o no significativa.

library(GGally)
ggpairs(tasas[, c(4, 6, 9, 18)])

Modelos de predicción

Antes de calcular los distintos modelos, se separa el conjunto total de datos en uno de entrenamiento y de validación, siendo, respectivamente, el 70% y el 30% del total. Por motivos de reproductividad se incluye una semilla.

p <- 0.70
n <- dim(tasas)[1]
set.seed(0905)
entrena <- sample(dim(tasas)[1], round(p*n), replace = FALSE)
valida <- setdiff(1:n, entrena)

Regresión lineal

Una vez calculado el modelo, se utiliza el criterio de Akaike de simplificación paso a paso.

reg <- lm(Inclusive.growth ~ ., data = tasas[entrena, -c(1, 7, 15)])
summary(reg)

Call:
lm(formula = Inclusive.growth ~ ., data = tasas[entrena, -c(1, 
    7, 15)])

Residuals:
     Min       1Q   Median       3Q      Max 
-13.5407  -3.2441   0.6273   3.4900   8.5581 

Coefficients:
                                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)                       1.232e+01  8.012e+00   1.538   0.1283    
IPC_Base2010                     -1.106e-03  3.890e-03  -0.284   0.7770    
PIB                              -5.462e-07  3.319e-07  -1.646   0.1040    
PIB_capita                        4.310e-04  5.169e-05   8.339  2.7e-12 ***
Balanza_pagos                    -2.774e-06  7.841e-06  -0.354   0.7245    
ICP                               3.252e-01  1.421e-01   2.289   0.0249 *  
Poblacion_mil                    -8.924e-06  4.310e-06  -2.071   0.0418 *  
Porcentaje_poblacion_urbana       1.254e-01  4.864e-02   2.579   0.0119 *  
tasa_IPC_Base2010                 2.768e+00  1.754e+01   0.158   0.8750    
tasa_PIB                          1.563e+02  9.149e+02   0.171   0.8648    
tasa_PIB_capita                  -1.623e+02  9.247e+02  -0.175   0.8612    
tasa_Balanza_pagos               -9.515e-02  5.518e-02  -1.724   0.0888 .  
tasa_ICP                         -3.775e+00  2.121e+01  -0.178   0.8592    
tasa_Poblacion_mil               -5.696e+02  1.081e+03  -0.527   0.5999    
tasa_Porcentaje_poblacion_urbana  3.388e+02  1.511e+02   2.241   0.0280 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.464 on 75 degrees of freedom
Multiple R-squared:  0.9151,    Adjusted R-squared:  0.8992 
F-statistic: 57.72 on 14 and 75 DF,  p-value: < 2.2e-16
library(RcmdrMisc)
stepwise(reg, criterion = "AIC")

Direction:  backward/forward
Criterion:  AIC 

Start:  AIC=319.25
Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + Balanza_pagos + 
    ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_IPC_Base2010 + 
    tasa_PIB + tasa_PIB_capita + tasa_Balanza_pagos + tasa_ICP + 
    tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana

                                   Df Sum of Sq    RSS    AIC
- tasa_IPC_Base2010                 1      0.74 2239.5 317.28
- tasa_PIB                          1      0.87 2239.6 317.28
- tasa_PIB_capita                   1      0.92 2239.7 317.28
- tasa_ICP                          1      0.95 2239.7 317.29
- IPC_Base2010                      1      2.41 2241.2 317.34
- Balanza_pagos                     1      3.74 2242.5 317.40
- tasa_Poblacion_mil                1      8.28 2247.0 317.58
<none>                                          2238.8 319.25
- PIB                               1     80.87 2319.6 320.44
- tasa_Balanza_pagos                1     88.74 2327.5 320.75
- Poblacion_mil                     1    127.97 2366.7 322.25
- tasa_Porcentaje_poblacion_urbana  1    149.97 2388.7 323.08
- ICP                               1    156.38 2395.1 323.32
- Porcentaje_poblacion_urbana       1    198.53 2437.3 324.89
- PIB_capita                        1   2075.59 4314.3 376.29

Step:  AIC=317.28
Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + Balanza_pagos + 
    ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_PIB + 
    tasa_PIB_capita + tasa_Balanza_pagos + tasa_ICP + tasa_Poblacion_mil + 
    tasa_Porcentaje_poblacion_urbana

                                   Df Sum of Sq    RSS    AIC
- tasa_PIB                          1      0.79 2240.3 315.31
- tasa_PIB_capita                   1      0.83 2240.3 315.31
- tasa_ICP                          1      1.06 2240.6 315.32
- Balanza_pagos                     1      4.40 2243.9 315.45
- tasa_Poblacion_mil                1      8.02 2247.5 315.60
<none>                                          2239.5 317.28
- IPC_Base2010                      1     54.68 2294.2 317.45
- PIB                               1     82.99 2322.5 318.55
- tasa_Balanza_pagos                1     88.33 2327.8 318.76
+ tasa_IPC_Base2010                 1      0.74 2238.8 319.25
- Poblacion_mil                     1    127.26 2366.8 320.25
- tasa_Porcentaje_poblacion_urbana  1    151.21 2390.7 321.16
- ICP                               1    156.02 2395.5 321.34
- Porcentaje_poblacion_urbana       1    204.68 2444.2 323.15
- PIB_capita                        1   2083.23 4322.7 374.46

Step:  AIC=315.31
Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + Balanza_pagos + 
    ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_PIB_capita + 
    tasa_Balanza_pagos + tasa_ICP + tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana

                                   Df Sum of Sq    RSS    AIC
- tasa_ICP                          1      1.39 2241.7 313.37
- Balanza_pagos                     1      4.38 2244.7 313.49
- tasa_PIB_capita                   1      5.86 2246.1 313.54
<none>                                          2240.3 315.31
- IPC_Base2010                      1     61.53 2301.8 315.75
- PIB                               1     82.78 2323.1 316.58
- tasa_Balanza_pagos                1     89.43 2329.7 316.83
+ tasa_PIB                          1      0.79 2239.5 317.28
+ tasa_IPC_Base2010                 1      0.66 2239.6 317.28
- Poblacion_mil                     1    126.92 2367.2 318.27
- tasa_Porcentaje_poblacion_urbana  1    150.49 2390.8 319.16
- ICP                               1    177.90 2418.2 320.19
- Porcentaje_poblacion_urbana       1    228.86 2469.1 322.06
- tasa_Poblacion_mil                1    454.49 2694.8 329.93
- PIB_capita                        1   2223.09 4463.4 375.35

Step:  AIC=313.37
Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + Balanza_pagos + 
    ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_PIB_capita + 
    tasa_Balanza_pagos + tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana

                                   Df Sum of Sq    RSS    AIC
- Balanza_pagos                     1      3.94 2245.6 311.52
- tasa_PIB_capita                   1      6.11 2247.8 311.61
<none>                                          2241.7 313.37
- IPC_Base2010                      1     63.40 2305.1 313.88
- PIB                               1     81.82 2323.5 314.59
- tasa_Balanza_pagos                1     88.38 2330.1 314.85
+ tasa_ICP                          1      1.39 2240.3 315.31
+ tasa_PIB                          1      1.12 2240.6 315.32
+ tasa_IPC_Base2010                 1      0.77 2240.9 315.33
- Poblacion_mil                     1    130.69 2372.4 316.46
- tasa_Porcentaje_poblacion_urbana  1    151.25 2392.9 317.24
- ICP                               1    189.45 2431.1 318.67
- Porcentaje_poblacion_urbana       1    227.83 2469.5 320.08
- tasa_Poblacion_mil                1    573.78 2815.5 331.88
- PIB_capita                        1   2451.39 4693.1 377.86

Step:  AIC=311.52
Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + ICP + Poblacion_mil + 
    Porcentaje_poblacion_urbana + tasa_PIB_capita + tasa_Balanza_pagos + 
    tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana

                                   Df Sum of Sq    RSS    AIC
- tasa_PIB_capita                   1      5.72 2251.3 309.75
<none>                                          2245.6 311.52
- IPC_Base2010                      1     63.84 2309.5 312.05
- tasa_Balanza_pagos                1     88.57 2334.2 313.00
+ Balanza_pagos                     1      3.94 2241.7 313.37
+ tasa_IPC_Base2010                 1      1.38 2244.2 313.47
+ tasa_PIB                          1      1.03 2244.6 313.48
+ tasa_ICP                          1      0.95 2244.7 313.49
- PIB                               1    103.68 2349.3 313.59
- tasa_Porcentaje_poblacion_urbana  1    147.31 2392.9 315.24
- ICP                               1    190.24 2435.9 316.84
- Poblacion_mil                     1    207.55 2453.2 317.48
- Porcentaje_poblacion_urbana       1    224.20 2469.8 318.09
- tasa_Poblacion_mil                1    569.89 2815.5 329.88
- PIB_capita                        1   2452.82 4698.4 375.97

Step:  AIC=309.75
Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + ICP + Poblacion_mil + 
    Porcentaje_poblacion_urbana + tasa_Balanza_pagos + tasa_Poblacion_mil + 
    tasa_Porcentaje_poblacion_urbana

                                   Df Sum of Sq    RSS    AIC
<none>                                          2251.3 309.75
- IPC_Base2010                      1     59.82 2311.2 310.11
- tasa_Balanza_pagos                1     90.97 2342.3 311.32
+ tasa_PIB_capita                   1      5.72 2245.6 311.52
+ tasa_PIB                          1      5.67 2245.7 311.53
- PIB                               1     98.27 2349.6 311.60
+ Balanza_pagos                     1      3.55 2247.8 311.61
+ tasa_ICP                          1      1.17 2250.2 311.71
+ tasa_IPC_Base2010                 1      1.06 2250.3 311.71
- tasa_Porcentaje_poblacion_urbana  1    145.58 2396.9 313.39
- ICP                               1    189.58 2440.9 315.03
- Porcentaje_poblacion_urbana       1    219.08 2470.4 316.11
- Poblacion_mil                     1    225.77 2477.1 316.35
- tasa_Poblacion_mil                1    564.19 2815.5 327.88
- PIB_capita                        1   2447.12 4698.5 373.97

Call:
lm(formula = Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + 
    ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_Balanza_pagos + 
    tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana, data = tasas[entrena, 
    -c(1, 7, 15)])

Coefficients:
                     (Intercept)                      IPC_Base2010  
                       1.196e+01                        -4.954e-04  
                             PIB                        PIB_capita  
                      -4.487e-07                         4.287e-04  
                             ICP                     Poblacion_mil  
                       3.215e-01                        -1.002e-05  
     Porcentaje_poblacion_urbana                tasa_Balanza_pagos  
                       1.211e-01                        -9.586e-02  
              tasa_Poblacion_mil  tasa_Porcentaje_poblacion_urbana  
                      -3.871e+02                         3.275e+02  

Se plantea el modelo resultante.

reg2 <- lm(formula = Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + 
             ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_Balanza_pagos + 
             tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana, data = tasas[entrena, ])
summary(reg2)

Call:
lm(formula = Inclusive.growth ~ IPC_Base2010 + PIB + PIB_capita + 
    ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_Balanza_pagos + 
    tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana, data = tasas[entrena, 
    ])

Residuals:
    Min      1Q  Median      3Q     Max 
-13.413  -3.250   1.121   3.377   8.527 

Coefficients:
                                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)                       1.196e+01  6.128e+00   1.951  0.05452 .  
IPC_Base2010                     -4.954e-04  3.398e-04  -1.458  0.14878    
PIB                              -4.487e-07  2.401e-07  -1.869  0.06533 .  
PIB_capita                        4.287e-04  4.597e-05   9.325 2.02e-14 ***
ICP                               3.215e-01  1.239e-01   2.595  0.01123 *  
Poblacion_mil                    -1.002e-05  3.536e-06  -2.832  0.00584 ** 
Porcentaje_poblacion_urbana       1.211e-01  4.341e-02   2.790  0.00658 ** 
tasa_Balanza_pagos               -9.586e-02  5.332e-02  -1.798  0.07595 .  
tasa_Poblacion_mil               -3.871e+02  8.645e+01  -4.478 2.48e-05 ***
tasa_Porcentaje_poblacion_urbana  3.275e+02  1.440e+02   2.274  0.02562 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.305 on 80 degrees of freedom
Multiple R-squared:  0.9146,    Adjusted R-squared:  0.905 
F-statistic: 95.18 on 9 and 80 DF,  p-value: < 2.2e-16

Tras observar los resultados, se construye un modelo definitivo eliminando el IPC al no ser significativa. Con este nuevo método se hacen predicciones y se calcula el error cuadrático medio.

reg3 <- lm(formula = Inclusive.growth ~ PIB + PIB_capita + 
             ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_Balanza_pagos + 
             tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana, data = tasas[entrena, ])
summary(reg3)

Call:
lm(formula = Inclusive.growth ~ PIB + PIB_capita + ICP + Poblacion_mil + 
    Porcentaje_poblacion_urbana + tasa_Balanza_pagos + tasa_Poblacion_mil + 
    tasa_Porcentaje_poblacion_urbana, data = tasas[entrena, ])

Residuals:
    Min      1Q  Median      3Q     Max 
-13.413  -3.511   1.377   2.992   8.637 

Coefficients:
                                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)                       1.049e+01  6.087e+00   1.724  0.08858 .  
PIB                              -4.562e-07  2.417e-07  -1.887  0.06271 .  
PIB_capita                        4.241e-04  4.618e-05   9.184 3.44e-14 ***
ICP                               3.441e-01  1.238e-01   2.780  0.00675 ** 
Poblacion_mil                    -1.015e-05  3.560e-06  -2.852  0.00552 ** 
Porcentaje_poblacion_urbana       1.238e-01  4.367e-02   2.834  0.00579 ** 
tasa_Balanza_pagos               -9.564e-02  5.368e-02  -1.781  0.07859 .  
tasa_Poblacion_mil               -3.871e+02  8.705e+01  -4.447 2.74e-05 ***
tasa_Porcentaje_poblacion_urbana  3.498e+02  1.442e+02   2.426  0.01748 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5.342 on 81 degrees of freedom
Multiple R-squared:  0.9123,    Adjusted R-squared:  0.9037 
F-statistic: 105.3 on 8 and 81 DF,  p-value: < 2.2e-16
pred <- predict(reg3, tasas[valida, ])
mean((pred - tasas[valida, "Inclusive.growth"])^2, na.rm = TRUE)
[1] 51.01364

Se crea un nuevo modelo con las variables tipificadas para calcular la importancia de cada una de ellas.

sc <- tasas
sc[, -1] <- scale(sc[, -1])
reg4 <- lm(formula = Inclusive.growth ~ PIB + PIB_capita + 
             ICP + Poblacion_mil + Porcentaje_poblacion_urbana + tasa_Balanza_pagos + 
             tasa_Poblacion_mil + tasa_Porcentaje_poblacion_urbana, data = sc[entrena, ])
summary(reg4)

Call:
lm(formula = Inclusive.growth ~ PIB + PIB_capita + ICP + Poblacion_mil + 
    Porcentaje_poblacion_urbana + tasa_Balanza_pagos + tasa_Poblacion_mil + 
    tasa_Porcentaje_poblacion_urbana, data = sc[entrena, ])

Residuals:
     Min       1Q   Median       3Q      Max 
-0.73942 -0.19358  0.07591  0.16493  0.47610 

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                       0.04106    0.03125   1.314  0.19260    
PIB                              -0.06735    0.03569  -1.887  0.06271 .  
PIB_capita                        0.57635    0.06276   9.184 3.44e-14 ***
ICP                               0.24551    0.08831   2.780  0.00675 ** 
Poblacion_mil                    -0.10077    0.03534  -2.852  0.00552 ** 
Porcentaje_poblacion_urbana       0.14370    0.05070   2.834  0.00579 ** 
tasa_Balanza_pagos               -0.04980    0.02795  -1.781  0.07859 .  
tasa_Poblacion_mil               -0.24751    0.05565  -4.447 2.74e-05 ***
tasa_Porcentaje_poblacion_urbana  0.11472    0.04728   2.426  0.01748 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2945 on 81 degrees of freedom
Multiple R-squared:  0.9123,    Adjusted R-squared:  0.9037 
F-statistic: 105.3 on 8 and 81 DF,  p-value: < 2.2e-16
imp.reg <- round(reg4$coefficients/sum(abs(reg4$coefficients))*100, 2)[-1]

Se representan los 6 porcentajes más altos en un diagrama de barras.

imp.reg2 <- data.frame(nombres = names(sort(abs(imp.reg), decreasing = TRUE)[1:6]), importancia = sort(abs(imp.reg), decreasing = TRUE)[1:6])
rownames(imp.reg2) <- c()
coul <- RColorBrewer::brewer.pal(7, "Set2") 
labels <- c("PIB cápita", "ICP", "Tasa pob.", 
            "% Pob. urb.", "Pob.", "Tasa % Pob. urb.", "IPC (2010)")
ggplot(imp.reg2) +
  geom_bar(aes(x = nombres, y = importancia), stat = "identity", fill = coul[1:6]) +
  scale_x_discrete(limits = imp.reg2$nombres, labels = labels[1:6]) +
  labs(x = "Variables", y = "Importancia (%)", 
       title = "Importancia de las variables",
       subtitle = "Regresión lineal") +
  geom_text(aes(x = nombres, y = importancia,label = importancia), vjust = 2, colour = "white") +
  theme_minimal()

Árbol de regresión

Se comienza construyendo un árbol muy desarrollado.

library(rpart)
library(rpart.plot)
arbol <- rpart(Inclusive.growth ~ ., data = tasas[entrena, -c(1, 7, 15)],
               control = rpart.control(cp = 0, minsplit = 2))
plotcp(arbol)

printcp(arbol)

Regression tree:
rpart(formula = Inclusive.growth ~ ., data = tasas[entrena, -c(1, 
    7, 15)], control = rpart.control(cp = 0, minsplit = 2))

Variables actually used in tree construction:
 [1] Balanza_pagos                    ICP                             
 [3] IPC_Base2010                     PIB                             
 [5] PIB_capita                       Poblacion_mil                   
 [7] Porcentaje_poblacion_urbana      tasa_Balanza_pagos              
 [9] tasa_ICP                         tasa_IPC_Base2010               
[11] tasa_PIB                         tasa_Poblacion_mil              
[13] tasa_Porcentaje_poblacion_urbana

Root node error: 26358/90 = 292.87

n= 90 

           CP nsplit  rel error  xerror     xstd
1  7.0364e-01      0 1.0000e+00 1.02583 0.121570
2  1.2551e-01      1 2.9636e-01 0.34426 0.051887
3  4.2568e-02      2 1.7085e-01 0.22190 0.046058
4  2.2745e-02      3 1.2828e-01 0.17195 0.033176
5  1.5399e-02      4 1.0554e-01 0.16427 0.031999
6  9.8793e-03      5 9.0136e-02 0.18114 0.028982
7  9.8345e-03      6 8.0256e-02 0.18759 0.030040
8  7.8970e-03      7 7.0422e-02 0.18249 0.029202
9  7.4299e-03      8 6.2525e-02 0.18080 0.029402
10 6.9277e-03      9 5.5095e-02 0.18756 0.029553
11 6.3398e-03     10 4.8167e-02 0.19320 0.030042
12 4.8387e-03     11 4.1827e-02 0.20004 0.029758
13 4.6438e-03     13 3.2150e-02 0.21091 0.030568
14 3.3767e-03     14 2.7506e-02 0.20529 0.029760
15 2.9847e-03     15 2.4130e-02 0.20390 0.029553
16 2.0078e-03     16 2.1145e-02 0.21470 0.030804
17 1.8211e-03     17 1.9137e-02 0.21636 0.030976
18 1.5785e-03     18 1.7316e-02 0.22923 0.032133
19 1.4619e-03     19 1.5738e-02 0.23057 0.032072
20 1.2097e-03     20 1.4276e-02 0.23011 0.032108
21 1.2022e-03     21 1.3066e-02 0.22917 0.032091
22 1.1899e-03     22 1.1864e-02 0.22917 0.032091
23 1.0039e-03     23 1.0674e-02 0.23586 0.032494
24 9.6032e-04     24 9.6700e-03 0.23875 0.032444
25 9.1866e-04     25 8.7097e-03 0.24209 0.032733
26 8.3807e-04     26 7.7910e-03 0.24365 0.032672
27 6.2855e-04     27 6.9529e-03 0.24331 0.032698
28 6.1967e-04     28 6.3244e-03 0.24423 0.032659
29 4.7106e-04     29 5.7047e-03 0.24616 0.032938
30 4.4616e-04     30 5.2337e-03 0.25171 0.033771
31 3.9659e-04     31 4.7875e-03 0.25168 0.033733
32 3.8849e-04     32 4.3909e-03 0.25631 0.034092
33 3.7180e-04     33 4.0024e-03 0.25668 0.034062
34 3.5693e-04     34 3.6306e-03 0.25612 0.033983
35 3.3016e-04     35 3.2737e-03 0.25607 0.034182
36 3.1584e-04     36 2.9435e-03 0.25589 0.034186
37 3.0983e-04     37 2.6277e-03 0.25615 0.034166
38 1.8342e-04     38 2.3179e-03 0.25634 0.034335
39 1.7784e-04     39 2.1344e-03 0.25491 0.034666
40 1.7098e-04     40 1.9566e-03 0.25491 0.034666
41 1.6446e-04     41 1.7856e-03 0.25575 0.034713
42 1.5052e-04     42 1.6212e-03 0.25412 0.034420
43 1.4872e-04     43 1.4706e-03 0.25405 0.034426
44 1.2950e-04     44 1.3219e-03 0.25700 0.034853
45 1.2804e-04     45 1.1924e-03 0.25690 0.034861
46 1.0964e-04     46 1.0644e-03 0.25671 0.034897
47 1.0629e-04     47 9.5473e-04 0.25689 0.034884
48 1.0035e-04     48 8.4844e-04 0.25677 0.034868
49 9.6175e-05     49 7.4809e-04 0.25779 0.034951
50 9.1306e-05     50 6.5191e-04 0.25736 0.034980
51 6.8859e-05     51 5.6061e-04 0.25816 0.034933
52 6.8479e-05     52 4.9175e-04 0.25845 0.034923
53 6.8479e-05     53 4.2327e-04 0.25845 0.034923
54 4.8562e-05     54 3.5479e-04 0.25845 0.034923
55 3.1616e-05     55 3.0623e-04 0.25830 0.035029
56 2.7885e-05     56 2.7461e-04 0.25773 0.034887
57 2.7316e-05     57 2.4673e-04 0.25773 0.034887
58 2.7316e-05     58 2.1941e-04 0.25773 0.034887
59 2.2826e-05     59 1.9210e-04 0.25713 0.034892
60 2.1341e-05     60 1.6927e-04 0.25713 0.034892
61 1.8969e-05     61 1.4793e-04 0.25633 0.034688
62 1.6029e-05     62 1.2896e-04 0.25661 0.034677
63 1.5365e-05     63 1.1293e-04 0.25608 0.034538
64 1.2140e-05     64 9.7566e-05 0.25613 0.034534
65 9.2950e-06     65 8.5425e-05 0.25606 0.034555
66 9.2950e-06     67 6.6835e-05 0.25572 0.034522
67 7.6510e-06     68 5.7540e-05 0.25585 0.034516
68 6.8290e-06     69 4.9889e-05 0.25543 0.034465
69 6.8290e-06     70 4.3060e-05 0.25517 0.034363
70 6.8290e-06     71 3.6231e-05 0.25517 0.034363
71 4.7423e-06     72 2.9403e-05 0.25517 0.034363
72 3.0351e-06     75 1.5175e-05 0.25493 0.034370
73 1.7072e-06     76 1.2140e-05 0.25512 0.034358
74 1.7072e-06     77 1.0433e-05 0.25524 0.034374
75 1.7072e-06     79 7.0187e-06 0.25524 0.034374
76 7.5877e-07     81 3.6042e-06 0.25524 0.034374
77 7.5877e-07     84 1.3279e-06 0.25541 0.034434
78 1.8969e-07     85 5.6908e-07 0.25540 0.034435
79 1.8969e-07     86 3.7939e-07 0.25541 0.034436
80 1.8969e-07     87 1.8969e-07 0.25541 0.034436
81 0.0000e+00     88 0.0000e+00 0.25541 0.034436

Una vez comprobado que los errores típicos son razonablemente bajos, se poda el árbol de acuerdo con el parámetro de complejidad “óptimo”. Además, se calcula la importancia de cada variable y el error cuadrático medio de las predicciones.

arbol2 <- prune(arbol, cp = 0.02745)
prp(arbol2, type = 4)

pred.arbol <- predict(arbol2, tasas[valida,  -c(1, 7, 15)])
mean((pred.arbol - tasas[valida, "Inclusive.growth"])^2, na.rm = TRUE)
[1] 85.49852

Una vez más, se calculan y representan los porcentajes de importancia de las variables involucradas.

imp.arbol <- round(arbol2$variable.importance/sum(arbol2$variable.importance)*100,
                   2)
imp.arbol2 <- data.frame(nombres = names(sort(abs(imp.arbol), decreasing = TRUE)[1:6]), 
                         importancia = sort(abs(imp.arbol), decreasing = TRUE)[1:6])
rownames(imp.arbol2) <- c()
ggplot(imp.arbol2) +
  geom_bar(aes(x = nombres, y = importancia), stat = "identity", fill = coul[c(1:3, 6, 4, 7)]) +
  scale_x_discrete(limits = imp.arbol2$nombres, labels = labels[c(1:3, 6, 4, 7)]) +
  labs(x = "Variables", y = "Importancia (%)", 
       title = "Importancia de las variables",
       subtitle = "Árbol de regresión") +
  geom_text(aes(x = nombres, y = importancia,label = importancia), vjust = 2, colour = "white") +
  theme_minimal()

Red neuronal

Se construye la red neuronal con 50 neuronas en la capa intermedia. Del mismo modo, se calcula el error cuadrático medio de las predicciones.

library(nnet)
red <- nnet(Inclusive.growth ~ ., data = tasas[entrena, -c(1, 7, 15)],
            size = 50, linout = TRUE, trace = FALSE)
pred.red <- predict(red, tasas[valida,])
mean((pred.red - tasas[valida, "Inclusive.growth"])^2, na.rm = TRUE)
[1] 172.8221

Bosque aleatorio

Se plantea el bosque aleatorio, una vez más, sin las variables de gasto público. Al igual que para el árbol, se calcula el error cuadrático medio de las predicciones.

library(randomForest)
fit <- randomForest(Inclusive.growth ~ ., data = tasas[entrena, -c(1, 7, 15)])
print(fit)

Call:
 randomForest(formula = Inclusive.growth ~ ., data = tasas[entrena,      -c(1, 7, 15)]) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 4

          Mean of squared residuals: 45.15016
                    % Var explained: 84.58
pred.bosque <- predict(fit, tasas[valida,])
mean((pred.bosque - tasas[valida, "Inclusive.growth"])^2, na.rm = TRUE)
[1] 85.40612

Al igual que para la regresión y el árbol, se calcula y representa la relevancia de cada variable utilizada.

importance(fit) # Importancia de cada variable
                                 IncNodePurity
IPC_Base2010                         1247.1876
PIB                                   607.2939
PIB_capita                           7340.3396
Balanza_pagos                         602.6555
ICP                                  6624.3582
Poblacion_mil                         325.9629
Porcentaje_poblacion_urbana          1650.7459
tasa_IPC_Base2010                     392.1302
tasa_PIB                              249.3438
tasa_PIB_capita                       385.4709
tasa_Balanza_pagos                    294.5004
tasa_ICP                              279.6153
tasa_Poblacion_mil                   3306.3650
tasa_Porcentaje_poblacion_urbana     2057.2454
imp.bosque <- round(importance(fit)/sum(importance(fit))*100, 2)
imp.bosque2 <- data.frame(nombres = names(imp.bosque[order(imp.bosque, decreasing = TRUE),][1:6]), 
                          importancia = imp.bosque[order(imp.bosque, decreasing = TRUE),][1:6])
rownames(imp.bosque2) <- c()
ggplot(imp.bosque2) +
  geom_bar(aes(x = nombres, y = importancia), stat = "identity", fill = coul[c(1:4, 6, 7)]) +
  scale_x_discrete(limits = imp.bosque2$nombres, labels = labels[c(1:4, 6, 7)]) +
  labs(x = "Variables", y = "Importancia (%)", 
       title = "Importancia de las variables",
       subtitle = "Bosque aleatorio") +
  geom_text(aes(x = nombres, y = importancia,label = importancia), vjust = 2, colour = "white") +
  theme_minimal()

Comparación de predicciones

Al ser el árbol simple y la regresión lineal los mejores métodos siendo, además, el PIB per cápita la variable más explicativa, se compara en una gráfica el ICI real con el predicho por cada modelo.

predicciones <- data.frame(PIB_capita = rep(tasas[valida, "PIB_capita"],3),
                           rbind(cbind(p = tasas[valida, "Inclusive.growth"], grupo = "ICI"),
                                 cbind(p = pred, grupo = "Regresión"),
                                 cbind(p = pred.arbol, grupo = "Árbol")))
predicciones <- predicciones[-which(is.na(predicciones$p)),]
predicciones$p <- as.numeric(predicciones$p)

ggplot(predicciones) +
  geom_point(aes(x=PIB_capita, y = p, col = grupo), size = 2) +
  theme_minimal() +
  labs(x="PIB per cápita",y="ICI", 
       title = "Predicciones de la regresión y el árbol") +
  theme(legend.title = element_blank())

Economías concretas y evolución temporal

Se seleccionan las economías con ICI más bajo, más alto y el valor mediano. Se extraen los datos correspondientes.

ICI.Gen.ord <- ICI.Gen[order(ICI.Gen$Inclusive.growth),]
ICI.Gen.ord[which(ICI.Gen.ord$Inclusive.growth%in%quantile(ICI.Gen.ord$Inclusive.growth, c(0, 0.25, 0.50, 0.75, 1), names = FALSE)), ]

Chad <- datos[datos$Economy.Label == "Chad", ]
Chad$Year <- as.numeric(as.character(Chad$Year))
Azer <- datos[datos$Economy.Label == "Azerbaijan", ]
Azer$Year <- as.numeric(as.character(Azer$Year))
Lux <- datos[datos$Economy.Label == "Luxembourg", ]
Lux$Year <- as.numeric(as.character(Lux$Year))

Se eliminan columnas redundantes y se calcula la tasa de variación de población.

Chad <- Chad[, -c(1, 4)]
Azer <- Azer[, -c(1, 4)]
Lux <- Lux[, -c(1, 4)]

Chad$tasa_Poblacion_mil <- NA
Chad$tasa_Poblacion_mil[2:dim(Chad)[1]] <- Chad$Poblacion_mil[2:dim(Chad)[1]]/Chad$Poblacion_mil[1:dim(Chad)[1]-1]-1

Azer$tasa_Poblacion_mil <- NA
Azer$tasa_Poblacion_mil[2:dim(Azer)[1]] <- Azer$Poblacion_mil[2:dim(Azer)[1]]/Azer$Poblacion_mil[1:dim(Azer)[1]-1]-1

Lux$tasa_Poblacion_mil <- NA
Lux$tasa_Poblacion_mil[2:dim(Lux)[1]] <- Lux$Poblacion_mil[2:dim(Lux)[1]]/Lux$Poblacion_mil[1:dim(Lux)[1]-1]-1

Se crea un conjunto de datos con la información de los 3 países.

conjunto <- rbind(cbind(Chad, País = "Chad"),
                  cbind(Azer, País = "Azer"),
                  cbind(Lux, País = "Lux"))

Se representa la evolución temporal de las 3 variables más relevantes según los modelos obtenidos.

p.PIB_capita <- ggplot(conjunto) +
  geom_point(aes(x=Year, y = PIB_capita, col = País)) +
  geom_line(aes(x=Year, y = PIB_capita, col = País)) +
  theme_minimal() +
  labs(x="",y="PIB per cápita", 
       title = "Evolución de las variables más relevantes por países") +
  theme(legend.position = "none")

p.ICP <- ggplot(conjunto) +
  geom_point(aes(x=Year, y = ICP, col = País)) +
  geom_line(aes(x=Year, y = ICP, col = País)) +
  theme_minimal() +
  labs(x = "", y="ICP") +
  theme(legend.position = "none")


p.tasa_Poblacion <- ggplot(conjunto) +
  geom_point(aes(x=Year, y = tasa_Poblacion_mil, col = País)) +
  geom_line(aes(x=Year, y = tasa_Poblacion_mil, col = País)) +
  theme_minimal() +
  labs(x="Año",y="Tasa de población") +
  theme(legend.position = "bottom")


library(patchwork)
p.PIB_capita + p.ICP + p.tasa_Poblacion +
  plot_layout(ncol = 1)

LS0tDQp0aXRsZTogIsONbmRpY2UgZGVsIENyZWNpbWllbnRvIEluY2x1c2l2byBjb21vIG1lZGlkYSBkZWwgYmllbmVzdGFyLiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyBDYXJnYSBkZSBkYXRvcw0KDQpFbiBwcmltZXIgbHVnYXIsIHNlIGNhcmdhbiBsb3MgZGF0b3MgY29ycmVzcG9uZGllbnRlcyBhbCDDrW5kaWNlIGRlIGNyZWNpbWllbnRvIGluY2x1c2l2byAoSUNJKS4gRGVsIGNvbmp1bnRvIHRvdGFsLCBzZSBjb25zaWRlcmFuIGRvcyB2YXJpYWJsZXM6IGxhIGVjb25vbcOtYSBjb3JyZXNwb25kaWVudGUgeSBzdSBJQ0kgZ2VuZXJhbCBkZWwgw7puaWNvIGHDsW8gZGlzcG9uaWJsZSwgMjAyMS4NCg0KYGBge3J9DQojIERhdG9zIG9idGVuaWRvcyBkZTogaHR0cHM6Ly91bmN0YWRzdGF0LnVuY3RhZC5vcmcvZGF0YWNlbnRyZS9kYXRhdmlld2VyL1VTLkluY2x1c2l2ZUdyb3d0aA0KSUNJIDwtIHJlYWQuY3N2KCJJQ0kuY3N2IikNCklDSS5HZW4gPC0gSUNJW0lDSSRDYXRlZ29yeS5MYWJlbCA9PSAiT3ZlcmFsbCBpbmRleCIsIGMoMywgNildDQpgYGANCg0KQSBjb250aW51YWNpw7NuLCBzZSBjYXJnYW4gbG9zIGNvbmp1bnRvcyBkZSBkYXRvcyBxdWUgaW5jbHV5ZW4gbGFzIHZhcmlhYmxlcyBjb24gbGFzIHF1ZSBzZSBpbnRlbnRhIHByZWRlY2lyIGVsIElDSTogZGF0b3MgZWNvbsOzbWljb3MgZGUgZ2FzdG8gcMO6YmxpY28sIGJhbGFuemEgZGUgcGFnb3MsIMOtbmRpY2UgZGUgY2FwYWNpZGFkIHByb2R1Y3RpdmEgKElDUCksIMOtbmRpY2UgZGUgcHJlY2lvcyBkZWwgY29uc3VtbyAoSVBDKSwgcHJvZHVjdG8gaW50ZXJpb3IgYnJ1dG8gKFBJQikgeSBkYXRvcyBkZW1vZ3LDoWZpY29zIGRlIHBvYmxhY2nDs24uIFBhcmEgcG9kZXIgdW5pciB0b2RvcyBsb3MgZGF0b3MgZW4gZWwgbWlzbW8gY29uanVudG8sIHNlIGNyZWEgZW4gY2FkYSBjYXNvIHVuYSB2YXJpYWJsZSAobGxhbWFkYSBwYWlzLmFubykgaW5kaWNhbmRvIGxhIGRpbWVuc2nDs24gdGVtcG9yYWwgeSBmw61zaWNhIGRlIGNhZGEgZGF0by4NCg0KRW4gY3VhbnRvIGFsIGdhc3RvIHDDumJsaWNvLCBzZSBjb25zaWRlcmEgZWwgZ2FzdG8gcMO6YmxpY28gdG90YWwuDQoNCmBgYHtyfQ0KIyBEYXRvcyBvYnRlbmlkb3MgZGU6IGh0dHBzOi8vdW5jdGFkc3RhdC51bmN0YWQub3JnL2RhdGFjZW50cmUvZGF0YXZpZXdlci9VUy5Hb3ZFeHBlbmRpdHVyZXMNCmdhc3RvLnB1YmxpY28gPC0gcmVhZC5jc3YoIkdhc3RvUHViLmNzdiIpDQpnYXN0by5wdWJsaWNvIDwtIGdhc3RvLnB1YmxpY29bLCAxOjNdDQpuYW1lcyhnYXN0by5wdWJsaWNvKVszXSA8LSAiVG90YWwuZnVuY3Rpb24iDQpnYXN0by5wdWJsaWNvJFllYXIgPC0gYXMuZmFjdG9yKGdhc3RvLnB1YmxpY28kWWVhcikNCmdhc3RvLnB1YmxpY28kcGFpcy5hbm8gPC0gYXMuZmFjdG9yKHBhc3RlKGdhc3RvLnB1YmxpY28kRWNvbm9teV9MYWJlbCwgZ2FzdG8ucHVibGljbyRZZWFyKSkNCmBgYA0KDQpQYXJhIGxvcyBkYXRvcyBkZSBiYWxhbnphIGRlIHBhZ29zIHksIGRlbCBtaXNtbyBtb2RvIHBhcmEgZWwgcmVzdG8gZGUgdmFyaWFibGVzLCBzZSBsaW1pdGEgbGEgZGltZW5zacOzbiB0ZW1wb3JhbCBlbnRyZSBsb3MgYcOxb3MgMjAwMCB5IDIwMjEuDQoNCmBgYHtyfQ0KIyBEYXRvcyBvYnRlbmlkb3MgZGU6IGh0dHBzOi8vdW5jdGFkc3RhdC51bmN0YWQub3JnL2RhdGFjZW50cmUvZGF0YXZpZXdlci9VUy5DdXJyQWNjQmFsYW5jZQ0KYnBhZ29zIDwtIHJlYWQuY3N2KCJCYWxhbnphUGFnb3MuY3N2IikNCmJwYWdvcyA8LSBicGFnb3NbLCAtYyg1OjkpXQ0KYnBhZ29zIDwtIGJwYWdvc1ticGFnb3MkWWVhciA8PSAyMDIxICYgYnBhZ29zJFllYXIgPj0gMjAwMCwgXQ0KYnBhZ29zJFllYXIgPC0gYXMuZmFjdG9yKGJwYWdvcyRZZWFyKQ0KYnBhZ29zJHBhaXMuYW5vIDwtIGFzLmZhY3RvcihwYXN0ZShicGFnb3MkRWNvbm9teS5MYWJlbCwgYnBhZ29zJFllYXIpKQ0KYGBgDQoNClNlIGNhcmdhIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlbCDDrW5kaWNlIGRlIGNhcGFjaWRhZCBwcm9kdWN0aXZhIHJlc3RyaW5nacOpbmRvc2UgYWwgdmFsb3IgZ2VuZXJhbC4NCg0KYGBge3J9DQojIERhdG9zIG9idGVuaWRvcyBkZTogaHR0cHM6Ly91bmN0YWRzdGF0LnVuY3RhZC5vcmcvZGF0YWNlbnRyZS9kYXRhdmlld2VyL1VTLlBDSQ0KSUNQIDwtIHJlYWQuY3N2KCJJQ1AuY3N2IikNCklDUC5HZW4gPC0gSUNQW0lDUCRDYXRlZ29yeS5MYWJlbCA9PSAiT3ZlcmFsbCBpbmRleDogUHJvZHVjdGl2ZSBjYXBhY2l0aWVzIGluZGV4IiwgLWMoNDo1LCA3OjgpXQ0KSUNQLkdlbiA8LSBJQ1AuR2VuW0lDUC5HZW4kWWVhciA8PSAyMDIxICYgSUNQLkdlbiRZZWFyID49IDIwMDAsIF0NCklDUC5HZW4kWWVhciA8LSBhcy5mYWN0b3IoSUNQLkdlbiRZZWFyKQ0KSUNQLkdlbiRwYWlzLmFubyA8LSBhcy5mYWN0b3IocGFzdGUoSUNQLkdlbiRFY29ub215LkxhYmVsLCBJQ1AuR2VuJFllYXIpKQ0KYGBgDQoNClNlIGluY29ycG9yYSBlbCDDrW5kaWNlIGRlIHByZWNpb3MgZGVsIGNvbnN1bW8uDQoNCmBgYHtyfQ0KIyBEYXRvcyBvYnRlbmlkb3MgZGU6IGh0dHBzOi8vdW5jdGFkc3RhdC51bmN0YWQub3JnL2RhdGFjZW50cmUvZGF0YXZpZXdlci9VUy5DcGlfQQ0KSVBDIDwtIHJlYWQuY3N2KCJJUEMuY3N2IikNCklQQyA8LSBJUENbLCAtYyg1OjkpXQ0KSVBDIDwtIElQQ1tJUEMkWWVhciA8PSAyMDIxICYgSVBDJFllYXIgPj0gMjAwMCwgXQ0KSVBDJFllYXIgPC0gYXMuZmFjdG9yKElQQyRZZWFyKQ0KSVBDJHBhaXMuYW5vIDwtIGFzLmZhY3RvcihwYXN0ZShJUEMkRWNvbm9teS5MYWJlbCwgSVBDJFllYXIpKQ0KYGBgDQoNClNlIHJlcGl0ZSBlbCBwcm9jZXNvIHBhcmEgb2J0ZW5lciBlbCBQSUIgeSBlbCBQSUIgcGVyIGPDoXBpdGEuDQoNCmBgYHtyfQ0KIyBEYXRvcyBvYnRlbmlkb3MgZGU6IGh0dHBzOi8vdW5jdGFkc3RhdC51bmN0YWQub3JnL2RhdGFjZW50cmUvZGF0YXZpZXdlci9VUy5HRFBUb3RhbA0KUElCIDwtIHJlYWQuY3N2KCJQSUJUb3RhbC5jc3YiKQ0KUElCIDwtIFBJQlssIC1jKDU6NiwgODoxNSldDQpQSUIgPC0gUElCW1BJQiRZZWFyIDw9IDIwMjEgJiBQSUIkWWVhciA+PSAyMDAwLCBdDQpQSUIkWWVhciA8LSBhcy5mYWN0b3IoUElCJFllYXIpDQpQSUIkcGFpcy5hbm8gPC0gYXMuZmFjdG9yKHBhc3RlKFBJQiRFY29ub215LkxhYmVsLCBQSUIkWWVhcikpDQpgYGANCg0KUG9yIMO6bHRpbW8sIHNlIGHDsWFkZW4gbGEgcG9ibGFjacOzbiB0b3RhbCB5IGVsIHBvcmNlbnRhamUgZGUgcG9ibGFjacOzbiB1cmJhbmEuDQoNCmBgYHtyfQ0KIyBEYXRvcyBvYnRlbmlkb3MgZGU6IGh0dHBzOi8vdW5jdGFkc3RhdC51bmN0YWQub3JnL2RhdGFjZW50cmUvZGF0YXZpZXdlci9VUy5Qb3BUb3RhbA0KcG9ibGFjaW9uIDwtIHJlYWQuY3N2KCJQb2JUb3QuY3N2IikNCnBvYmxhY2lvbiA8LSBwb2JsYWNpb25bLCAtYyg1OjYsIDg6OSldDQpwb2JsYWNpb24gPC0gcG9ibGFjaW9uW3BvYmxhY2lvbiRZZWFyIDw9IDIwMjEgJiBwb2JsYWNpb24kWWVhciA+PSAyMDAwLCBdDQpwb2JsYWNpb24kWWVhciA8LSBhcy5mYWN0b3IocG9ibGFjaW9uJFllYXIpDQpwb2JsYWNpb24kcGFpcy5hbm8gPC0gYXMuZmFjdG9yKHBhc3RlKHBvYmxhY2lvbiRFY29ub215LkxhYmVsLCBwb2JsYWNpb24kWWVhcikpDQpgYGANCg0KIyMjIENyZWFjacOzbiBkZWwgY29uanVudG8gZGUgZGF0b3MNCg0KVW5hIHZleiBjYXJnYWRvcyB0b2RvcyBsb3MgZGF0b3MsIHNlIGNyZWEgdW4gw7puaWNvIGNvbmp1bnRvIGVuIGVsIHF1ZSBzZSByZcO6bmFuIHRvZGFzIGxhcyB2YXJpYWJsZXMgZXhwbGljYXRpdmFzLiBQYXJhIGVsbG8gc2UgdXRpbGl6YSBsYSB2YXJpYWJsZSBwYWlzLmFubyBjb21vIG5leG8gZGUgdW5pw7NuLiBFbiBjYWRhIGNvbWJpbmFjacOzbiwgc2UgZWxpbWluYW4gbGFzIHZhcmlhYmxlcyByZWR1bmRhbnRlcyB5IHNlIHJlbm9tYnJhbiBsYXMgw7p0aWxlcyBkZSBmb3JtYSBleHBsaWNhdGl2YS4NCg0KRW4gcHJpbWVyIGx1Z2FyLCBzZSBqdW50YW4gbG9zIGRhdG9zIGRlIElQQyB5IFBJQi4NCg0KYGBge3J9DQpkYXRvcyA8LSBtZXJnZShJUEMsIFBJQiwgYnkueCA9ICJwYWlzLmFubyIsIGJ5LnkgPSAicGFpcy5hbm8iLCBhbGwgPSBUUlVFKQ0KZGF0b3MgPC0gZGF0b3NbLCAtYygyOjQpXQ0KbmFtZXMoZGF0b3MpWzI6N10gPC0gYygiSVBDX0Jhc2UyMDEwIiwgIlllYXIiLCAiRWNvbm9teSIsICJFY29ub215LkxhYmVsIiwgIlBJQiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiUElCX2NhcGl0YSIpDQpgYGANCg0KU2UgaW5jb3Jwb3JhbiBsYXMgYmFsYW56YXMgZGUgcGFnb3MuDQoNCmBgYHtyfQ0KZGF0b3MgPC0gbWVyZ2UoZGF0b3MsIGJwYWdvcywgYnkueCA9ICJwYWlzLmFubyIsIGJ5LnkgPSAicGFpcy5hbm8iLCBhbGwgPSBUUlVFKQ0KZGF0b3MgPC0gZGF0b3NbLCAtYyg4OjEwKV0NCm5hbWVzKGRhdG9zKVtjKDM6NSwgOCldIDwtIGMoIlllYXIiLCAiRWNvbm9teSIsICJFY29ub215LkxhYmVsIiwgIkJhbGFuemFfcGFnb3MiKQ0KYGBgDQoNCkFob3JhLCBzZSBpbmNsdXllbiBsb3MgZGF0b3MgZGVsIElDUC4gUGFyYSBlc3RhIHZhcmlhYmxlLCBkZWJlbW9zIGNvbXBsZXRhciBsb3MgZGF0b3MgZGUgYcOxbyB5IGVjb25vbcOtYSBhbCBoYWJlciB2YXJpb3MgZGF0b3MgcXVlIHNvbGFtZW50ZSBwcm92aWVuZW4gZGUgdW5hIHZhcmlhYmxlLg0KDQpgYGB7cn0NCmRhdG9zIDwtIG1lcmdlKGRhdG9zLCBJQ1AuR2VuLCBieS54ID0gInBhaXMuYW5vIiwgYnkueSA9ICJwYWlzLmFubyIsIGFsbCA9IFRSVUUpDQpmb3IgKGkgaW4gMTpkaW0oZGF0b3MpWzFdKSB7DQogIGlmIChpcy5uYShkYXRvcyRZZWFyLnhbaV0pKSB7DQogICAgZGF0b3MkWWVhci54W2ldID0gZGF0b3MkWWVhci55W2ldDQogICAgZGF0b3MkRWNvbm9teS54W2ldID0gZGF0b3MkRWNvbm9teS55W2ldDQogICAgZGF0b3MkRWNvbm9teS5MYWJlbC54W2ldID0gZGF0b3MkRWNvbm9teS5MYWJlbC55W2ldDQogIH0NCn0NCmRhdG9zIDwtIGRhdG9zWywgLWMoOToxMSldDQpuYW1lcyhkYXRvcylbYygzOjUsIDkpXSA8LSBjKCJZZWFyIiwgIkVjb25vbXkiLCAiRWNvbm9teS5MYWJlbCIsICJJQ1AiKQ0KYGBgDQoNClNlIGHDsWFkZW4gbG9zIGRhdG9zIGRlIGdhc3RvIHDDumJsaWNvLg0KDQpgYGB7cn0NCmRhdG9zIDwtIG1lcmdlKGRhdG9zLCBnYXN0by5wdWJsaWNvLCBieS54ID0gInBhaXMuYW5vIiwgYnkueSA9ICJwYWlzLmFubyIsIGFsbCA9IFRSVUUpDQpkYXRvcyA8LSBkYXRvc1ssIC1jKDEwOjExKV0NCm5hbWVzKGRhdG9zKVtjKDMsIDEwKV0gPC0gYygiWWVhciIsICJHYXN0b19wdWJsaWNvX3RvdGFsIikNCmBgYA0KDQpGaW5hbG1lbnRlLCBzZSBhZ3JlZ2FuIGxhcyBwb2JsYWNpb25lcyBkZSBjYWRhIGVjb25vbcOtYS4gQ29tbyBlbiBlbCBjYXNvIGRlbCBJQ1AsIHNlIG5lY2VzaXRhbiBjb21wbGV0YXIgbG9zIGRhdG9zIGRlIGHDsW8geSBlY29ub23DrWEuDQoNCmBgYHtyfQ0KZGF0b3MgPC0gbWVyZ2UoZGF0b3MsIHBvYmxhY2lvbiwgYnkueCA9ICJwYWlzLmFubyIsIGJ5LnkgPSAicGFpcy5hbm8iLCBhbGwgPSBUUlVFKQ0KZm9yIChpIGluIDE6ZGltKGRhdG9zKVsxXSkgew0KICBpZiAoaXMubmEoZGF0b3MkWWVhci54W2ldKSkgew0KICAgIGRhdG9zJFllYXIueFtpXSA9IGRhdG9zJFllYXIueVtpXQ0KICAgIGRhdG9zJEVjb25vbXkueFtpXSA9IGRhdG9zJEVjb25vbXkueVtpXQ0KICAgIGRhdG9zJEVjb25vbXkuTGFiZWwueFtpXSA9IGRhdG9zJEVjb25vbXkuTGFiZWwueVtpXQ0KICB9DQp9DQpkYXRvcyA8LSBkYXRvc1ssIC1jKDExOjEzKV0NCm5hbWVzKGRhdG9zKVtjKDM6NSwgMTE6MTIpXSA8LSBjKCJZZWFyIiwgIkVjb25vbXkiLCAiRWNvbm9teS5MYWJlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9ibGFjaW9uX21pbCIsICJQb3JjZW50YWplX3BvYmxhY2lvbl91cmJhbmEiKQ0KYGBgDQoNClBvciDDumx0aW1vLCBwYXJhIGZhY2lsaXRhciBlbCBtYW5lam8gZGUgbGEgaW5mb3JtYWNpw7NuLCBzZSBjb252aWVydGUgbGEgdmFyaWFibGUgZGUgZWNvbm9tw61hIGEgZmFjdG9yICh2YXJpYWJsZSBjYXRlZ8OzcmljYSkuDQoNCmBgYHtyfQ0KZGF0b3MkRWNvbm9teS5MYWJlbCA8LSBhcy5mYWN0b3IoZGF0b3MkRWNvbm9teS5MYWJlbCkNCmBgYA0KDQojIyMgQ8OhbGN1bG8gZGUgdGFzYXMgZSBpbmNvcnBvcmFjacOzbiBkZWwgSUNJDQoNClNlIHJlc3RyaW5nZSBsYSBkaW1lbnNpw7NuIHRlbXBvcmFsIGFsIGHDsW8gMjAyMSB5LCBwYXJhIGNhZGEgdmFyaWFibGUgY29uc2lkZXJhZGEsIHNlIGNhbGN1bGEgbGEgY29ycmVzcG9uZGllbnRlIHRhc2EgZGUgdmFyaWFjacOzbiBjb24gcmVzcGVjdG8gYWwgYcOxbyAyMDIwLiBBc8OtLCBzZSBpbmNvcnBvcmFuIHRhbnRhcyB0YXNhcyBjb21vIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgc2UgaGFiw61hbiBjb25zaWRlcmFkby4NCg0KYGBge3J9DQp0YXNhcyA8LSBkYXRvc1tkYXRvcyRZZWFyID09IDIwMjEsIF0NCmZvciAoaSBpbiBjKDIsIDY6MTIpKXsNCiAgbm9tYnJlIDwtIHBhc3RlMCgidGFzYV8iLCBuYW1lcyhkYXRvcylbaV0pDQogIHRhc2FzIDwtIGNiaW5kKHRhc2FzLCBkYXRvc1ssaV1bZGF0b3MkWWVhciA9PSAyMDIxXS9kYXRvc1ssaV1bZGF0b3MkWWVhciA9PSAyMDIwXS0xKQ0KICBuYW1lcyh0YXNhcylbZGltKHRhc2FzKVsyXV0gPC0gbm9tYnJlDQp9DQpgYGANCg0KQWhvcmEsIHNlIGHDsWFkZSBlbCBJQ0kgYWwgY29uanVudG8gZGUgZGF0b3MgeSBzZSBlbGltaW5hbiBjb2x1bW5hcyBzb2JyYW50ZXMuIEFzw60sIHNlIHRpZW5lbiBkYXRvcyBkZSAxMjkgZWNvbm9tw61hcy4NCg0KYGBge3J9DQp0YXNhcyA8LSBtZXJnZSh0YXNhcywgSUNJLkdlbikgDQp0YXNhcyA8LSB0YXNhc1ssIC1jKDIsIDQsIDUpXQ0KYGBgDQoNClNlIGRlc2NyaWJlIGVsIGNvbmp1bnRvIGRlIHZhcmlhYmxlcyBwYXJhIGNvbm9jZXIgY3XDoW50b3MgZGF0b3MgcGVyZGlkb3MgaGF5IHkgc2UgY2FsY3VsYSBlbCBjb2VmaWNpZW50ZSBkZSBjb3JyZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4NCg0KYGBge3J9DQphcHBseSh0YXNhcywgMiwgZnVuY3Rpb24oeCl7c3VtKGlzLm5hKHgpKX0pIA0KY29yKHRhc2FzWywgLTFdLCB1c2UgPSAiY29tcGxldGUub2JzIikNCmBgYA0KDQpBbCBoYWJlciBtw6FzIGRlIDcwIHZhbG9yZXMgZGVzY29ub2NpZG9zIHBhcmEgZWwgZ2FzdG8gcMO6YmxpY28gKHkgc3UgdGFzYSksIG5vIHNlIHRpZW5lbiBlbiBjdWVudGEgZXN0YXMgdmFyaWFibGVzIHBhcmEgbGEgY29uc3RydWNjacOzbiBkZSBsb3MgZGlzdGludG9zIG1vZGVsb3MuIEEgY29udGludWFjacOzbiwgc2UgY3JlYSB1bmEgbWF0cml6IGRlIGRpYWdyYW1hcyBkZSBkaXNwZXJzacOzbiBjb24gbGFzIDMgdmFyaWFibGVzIHF1ZSBtYXlvciBjb3JyZWxhY2nDs24gcHJlc2VudGEgY29uIGxhIElDSS4gQWRlbcOhcywgc2UgbXVlc3RyYSBlbCBwLXZhbG9yIHF1ZSBpbmRpY2Egc2kgZXNhIHJlbGFjacOzbiBlcyBvIG5vIHNpZ25pZmljYXRpdmEuDQoNCmBgYHtyfQ0KbGlicmFyeShHR2FsbHkpDQpnZ3BhaXJzKHRhc2FzWywgYyg0LCA2LCA5LCAxOCldKQ0KYGBgDQoNCiMjIyBNb2RlbG9zIGRlIHByZWRpY2Npw7NuDQoNCkFudGVzIGRlIGNhbGN1bGFyIGxvcyBkaXN0aW50b3MgbW9kZWxvcywgc2Ugc2VwYXJhIGVsIGNvbmp1bnRvIHRvdGFsIGRlIGRhdG9zIGVuIHVubyBkZSBlbnRyZW5hbWllbnRvIHkgZGUgdmFsaWRhY2nDs24sIHNpZW5kbywgcmVzcGVjdGl2YW1lbnRlLCBlbCA3MCUgeSBlbCAzMCUgZGVsIHRvdGFsLiBQb3IgbW90aXZvcyBkZSByZXByb2R1Y3RpdmlkYWQgc2UgaW5jbHV5ZSB1bmEgc2VtaWxsYS4NCg0KYGBge3J9DQpwIDwtIDAuNzANCm4gPC0gZGltKHRhc2FzKVsxXQ0Kc2V0LnNlZWQoMDkwNSkNCmVudHJlbmEgPC0gc2FtcGxlKGRpbSh0YXNhcylbMV0sIHJvdW5kKHAqbiksIHJlcGxhY2UgPSBGQUxTRSkNCnZhbGlkYSA8LSBzZXRkaWZmKDE6biwgZW50cmVuYSkNCmBgYA0KDQojIyMjIFJlZ3Jlc2nDs24gbGluZWFsDQoNClVuYSB2ZXogY2FsY3VsYWRvIGVsIG1vZGVsbywgc2UgdXRpbGl6YSBlbCBjcml0ZXJpbyBkZSBBa2Fpa2UgZGUgc2ltcGxpZmljYWNpw7NuIHBhc28gYSBwYXNvLg0KDQpgYGB7cn0NCnJlZyA8LSBsbShJbmNsdXNpdmUuZ3Jvd3RoIH4gLiwgZGF0YSA9IHRhc2FzW2VudHJlbmEsIC1jKDEsIDcsIDE1KV0pDQpzdW1tYXJ5KHJlZykNCmxpYnJhcnkoUmNtZHJNaXNjKQ0Kc3RlcHdpc2UocmVnLCBjcml0ZXJpb24gPSAiQUlDIikNCmBgYA0KDQpTZSBwbGFudGVhIGVsIG1vZGVsbyByZXN1bHRhbnRlLg0KDQpgYGB7cn0NCnJlZzIgPC0gbG0oZm9ybXVsYSA9IEluY2x1c2l2ZS5ncm93dGggfiBJUENfQmFzZTIwMTAgKyBQSUIgKyBQSUJfY2FwaXRhICsgDQogICAgICAgICAgICAgSUNQICsgUG9ibGFjaW9uX21pbCArIFBvcmNlbnRhamVfcG9ibGFjaW9uX3VyYmFuYSArIHRhc2FfQmFsYW56YV9wYWdvcyArIA0KICAgICAgICAgICAgIHRhc2FfUG9ibGFjaW9uX21pbCArIHRhc2FfUG9yY2VudGFqZV9wb2JsYWNpb25fdXJiYW5hLCBkYXRhID0gdGFzYXNbZW50cmVuYSwgXSkNCnN1bW1hcnkocmVnMikNCmBgYA0KDQpUcmFzIG9ic2VydmFyIGxvcyByZXN1bHRhZG9zLCBzZSBjb25zdHJ1eWUgdW4gbW9kZWxvIGRlZmluaXRpdm8gZWxpbWluYW5kbyBlbCBJUEMgYWwgbm8gc2VyIHNpZ25pZmljYXRpdmEuIENvbiBlc3RlIG51ZXZvIG3DqXRvZG8gc2UgaGFjZW4gcHJlZGljY2lvbmVzIHkgc2UgY2FsY3VsYSBlbCBlcnJvciBjdWFkcsOhdGljbyBtZWRpby4NCg0KYGBge3J9DQpyZWczIDwtIGxtKGZvcm11bGEgPSBJbmNsdXNpdmUuZ3Jvd3RoIH4gUElCICsgUElCX2NhcGl0YSArIA0KICAgICAgICAgICAgIElDUCArIFBvYmxhY2lvbl9taWwgKyBQb3JjZW50YWplX3BvYmxhY2lvbl91cmJhbmEgKyB0YXNhX0JhbGFuemFfcGFnb3MgKyANCiAgICAgICAgICAgICB0YXNhX1BvYmxhY2lvbl9taWwgKyB0YXNhX1BvcmNlbnRhamVfcG9ibGFjaW9uX3VyYmFuYSwgZGF0YSA9IHRhc2FzW2VudHJlbmEsIF0pDQpzdW1tYXJ5KHJlZzMpDQpwcmVkIDwtIHByZWRpY3QocmVnMywgdGFzYXNbdmFsaWRhLCBdKQ0KbWVhbigocHJlZCAtIHRhc2FzW3ZhbGlkYSwgIkluY2x1c2l2ZS5ncm93dGgiXSleMiwgbmEucm0gPSBUUlVFKQ0KYGBgDQoNClNlIGNyZWEgdW4gbnVldm8gbW9kZWxvIGNvbiBsYXMgdmFyaWFibGVzIHRpcGlmaWNhZGFzIHBhcmEgY2FsY3VsYXIgbGEgaW1wb3J0YW5jaWEgZGUgY2FkYSB1bmEgZGUgZWxsYXMuDQoNCmBgYHtyfQ0Kc2MgPC0gdGFzYXMNCnNjWywgLTFdIDwtIHNjYWxlKHNjWywgLTFdKQ0KcmVnNCA8LSBsbShmb3JtdWxhID0gSW5jbHVzaXZlLmdyb3d0aCB+IFBJQiArIFBJQl9jYXBpdGEgKyANCiAgICAgICAgICAgICBJQ1AgKyBQb2JsYWNpb25fbWlsICsgUG9yY2VudGFqZV9wb2JsYWNpb25fdXJiYW5hICsgdGFzYV9CYWxhbnphX3BhZ29zICsgDQogICAgICAgICAgICAgdGFzYV9Qb2JsYWNpb25fbWlsICsgdGFzYV9Qb3JjZW50YWplX3BvYmxhY2lvbl91cmJhbmEsIGRhdGEgPSBzY1tlbnRyZW5hLCBdKQ0Kc3VtbWFyeShyZWc0KQ0KaW1wLnJlZyA8LSByb3VuZChyZWc0JGNvZWZmaWNpZW50cy9zdW0oYWJzKHJlZzQkY29lZmZpY2llbnRzKSkqMTAwLCAyKVstMV0NCmBgYA0KDQpTZSByZXByZXNlbnRhbiBsb3MgNiBwb3JjZW50YWplcyBtw6FzIGFsdG9zIGVuIHVuIGRpYWdyYW1hIGRlIGJhcnJhcy4NCg0KYGBge3J9DQppbXAucmVnMiA8LSBkYXRhLmZyYW1lKG5vbWJyZXMgPSBuYW1lcyhzb3J0KGFicyhpbXAucmVnKSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6Nl0pLCBpbXBvcnRhbmNpYSA9IHNvcnQoYWJzKGltcC5yZWcpLCBkZWNyZWFzaW5nID0gVFJVRSlbMTo2XSkNCnJvd25hbWVzKGltcC5yZWcyKSA8LSBjKCkNCmNvdWwgPC0gUkNvbG9yQnJld2VyOjpicmV3ZXIucGFsKDcsICJTZXQyIikgDQpsYWJlbHMgPC0gYygiUElCIGPDoXBpdGEiLCAiSUNQIiwgIlRhc2EgcG9iLiIsIA0KICAgICAgICAgICAgIiUgUG9iLiB1cmIuIiwgIlBvYi4iLCAiVGFzYSAlIFBvYi4gdXJiLiIsICJJUEMgKDIwMTApIikNCmdncGxvdChpbXAucmVnMikgKw0KICBnZW9tX2JhcihhZXMoeCA9IG5vbWJyZXMsIHkgPSBpbXBvcnRhbmNpYSksIHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gY291bFsxOjZdKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gaW1wLnJlZzIkbm9tYnJlcywgbGFiZWxzID0gbGFiZWxzWzE6Nl0pICsNCiAgbGFicyh4ID0gIlZhcmlhYmxlcyIsIHkgPSAiSW1wb3J0YW5jaWEgKCUpIiwgDQogICAgICAgdGl0bGUgPSAiSW1wb3J0YW5jaWEgZGUgbGFzIHZhcmlhYmxlcyIsDQogICAgICAgc3VidGl0bGUgPSAiUmVncmVzacOzbiBsaW5lYWwiKSArDQogIGdlb21fdGV4dChhZXMoeCA9IG5vbWJyZXMsIHkgPSBpbXBvcnRhbmNpYSxsYWJlbCA9IGltcG9ydGFuY2lhKSwgdmp1c3QgPSAyLCBjb2xvdXIgPSAid2hpdGUiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyMgw4FyYm9sIGRlIHJlZ3Jlc2nDs24NCg0KU2UgY29taWVuemEgY29uc3RydXllbmRvIHVuIMOhcmJvbCBtdXkgZGVzYXJyb2xsYWRvLg0KDQpgYGB7cn0NCmxpYnJhcnkocnBhcnQpDQpsaWJyYXJ5KHJwYXJ0LnBsb3QpDQphcmJvbCA8LSBycGFydChJbmNsdXNpdmUuZ3Jvd3RoIH4gLiwgZGF0YSA9IHRhc2FzW2VudHJlbmEsIC1jKDEsIDcsIDE1KV0sDQogICAgICAgICAgICAgICBjb250cm9sID0gcnBhcnQuY29udHJvbChjcCA9IDAsIG1pbnNwbGl0ID0gMikpDQpwbG90Y3AoYXJib2wpDQpwcmludGNwKGFyYm9sKQ0KYGBgDQoNClVuYSB2ZXogY29tcHJvYmFkbyBxdWUgbG9zIGVycm9yZXMgdMOtcGljb3Mgc29uIHJhem9uYWJsZW1lbnRlIGJham9zLCBzZSBwb2RhIGVsIMOhcmJvbCBkZSBhY3VlcmRvIGNvbiBlbCBwYXLDoW1ldHJvIGRlIGNvbXBsZWppZGFkICLDs3B0aW1vIi4gQWRlbcOhcywgc2UgY2FsY3VsYSBsYSBpbXBvcnRhbmNpYSBkZSBjYWRhIHZhcmlhYmxlIHkgZWwgZXJyb3IgY3VhZHLDoXRpY28gbWVkaW8gZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KYGBge3J9DQphcmJvbDIgPC0gcHJ1bmUoYXJib2wsIGNwID0gMC4wMjc0NSkNCnBycChhcmJvbDIsIHR5cGUgPSA0KQ0KcHJlZC5hcmJvbCA8LSBwcmVkaWN0KGFyYm9sMiwgdGFzYXNbdmFsaWRhLCAgLWMoMSwgNywgMTUpXSkNCm1lYW4oKHByZWQuYXJib2wgLSB0YXNhc1t2YWxpZGEsICJJbmNsdXNpdmUuZ3Jvd3RoIl0pXjIsIG5hLnJtID0gVFJVRSkNCmBgYA0KDQpVbmEgdmV6IG3DoXMsIHNlIGNhbGN1bGFuIHkgcmVwcmVzZW50YW4gbG9zIHBvcmNlbnRhamVzIGRlIGltcG9ydGFuY2lhIGRlIGxhcyB2YXJpYWJsZXMgaW52b2x1Y3JhZGFzLg0KDQpgYGB7cn0NCmltcC5hcmJvbCA8LSByb3VuZChhcmJvbDIkdmFyaWFibGUuaW1wb3J0YW5jZS9zdW0oYXJib2wyJHZhcmlhYmxlLmltcG9ydGFuY2UpKjEwMCwNCiAgICAgICAgICAgICAgICAgICAyKQ0KaW1wLmFyYm9sMiA8LSBkYXRhLmZyYW1lKG5vbWJyZXMgPSBuYW1lcyhzb3J0KGFicyhpbXAuYXJib2wpLCBkZWNyZWFzaW5nID0gVFJVRSlbMTo2XSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydGFuY2lhID0gc29ydChhYnMoaW1wLmFyYm9sKSwgZGVjcmVhc2luZyA9IFRSVUUpWzE6Nl0pDQpyb3duYW1lcyhpbXAuYXJib2wyKSA8LSBjKCkNCmdncGxvdChpbXAuYXJib2wyKSArDQogIGdlb21fYmFyKGFlcyh4ID0gbm9tYnJlcywgeSA9IGltcG9ydGFuY2lhKSwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSBjb3VsW2MoMTozLCA2LCA0LCA3KV0pICsNCiAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBpbXAuYXJib2wyJG5vbWJyZXMsIGxhYmVscyA9IGxhYmVsc1tjKDE6MywgNiwgNCwgNyldKSArDQogIGxhYnMoeCA9ICJWYXJpYWJsZXMiLCB5ID0gIkltcG9ydGFuY2lhICglKSIsIA0KICAgICAgIHRpdGxlID0gIkltcG9ydGFuY2lhIGRlIGxhcyB2YXJpYWJsZXMiLA0KICAgICAgIHN1YnRpdGxlID0gIsOBcmJvbCBkZSByZWdyZXNpw7NuIikgKw0KICBnZW9tX3RleHQoYWVzKHggPSBub21icmVzLCB5ID0gaW1wb3J0YW5jaWEsbGFiZWwgPSBpbXBvcnRhbmNpYSksIHZqdXN0ID0gMiwgY29sb3VyID0gIndoaXRlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQojIyMjIFJlZCBuZXVyb25hbA0KDQpTZSBjb25zdHJ1eWUgbGEgcmVkIG5ldXJvbmFsIGNvbiA1MCBuZXVyb25hcyBlbiBsYSBjYXBhIGludGVybWVkaWEuIERlbCBtaXNtbyBtb2RvLCBzZSBjYWxjdWxhIGVsIGVycm9yIGN1YWRyw6F0aWNvIG1lZGlvIGRlIGxhcyBwcmVkaWNjaW9uZXMuDQoNCmBgYHtyfQ0KbGlicmFyeShubmV0KQ0KcmVkIDwtIG5uZXQoSW5jbHVzaXZlLmdyb3d0aCB+IC4sIGRhdGEgPSB0YXNhc1tlbnRyZW5hLCAtYygxLCA3LCAxNSldLA0KICAgICAgICAgICAgc2l6ZSA9IDUwLCBsaW5vdXQgPSBUUlVFLCB0cmFjZSA9IEZBTFNFKQ0KcHJlZC5yZWQgPC0gcHJlZGljdChyZWQsIHRhc2FzW3ZhbGlkYSxdKQ0KbWVhbigocHJlZC5yZWQgLSB0YXNhc1t2YWxpZGEsICJJbmNsdXNpdmUuZ3Jvd3RoIl0pXjIsIG5hLnJtID0gVFJVRSkNCmBgYA0KDQojIyMjIEJvc3F1ZSBhbGVhdG9yaW8NCg0KU2UgcGxhbnRlYSBlbCBib3NxdWUgYWxlYXRvcmlvLCB1bmEgdmV6IG3DoXMsIHNpbiBsYXMgdmFyaWFibGVzIGRlIGdhc3RvIHDDumJsaWNvLiBBbCBpZ3VhbCBxdWUgcGFyYSBlbCDDoXJib2wsIHNlIGNhbGN1bGEgZWwgZXJyb3IgY3VhZHLDoXRpY28gbWVkaW8gZGUgbGFzIHByZWRpY2Npb25lcy4NCg0KYGBge3J9DQpsaWJyYXJ5KHJhbmRvbUZvcmVzdCkNCmZpdCA8LSByYW5kb21Gb3Jlc3QoSW5jbHVzaXZlLmdyb3d0aCB+IC4sIGRhdGEgPSB0YXNhc1tlbnRyZW5hLCAtYygxLCA3LCAxNSldKQ0KcHJpbnQoZml0KQ0KcHJlZC5ib3NxdWUgPC0gcHJlZGljdChmaXQsIHRhc2FzW3ZhbGlkYSxdKQ0KbWVhbigocHJlZC5ib3NxdWUgLSB0YXNhc1t2YWxpZGEsICJJbmNsdXNpdmUuZ3Jvd3RoIl0pXjIsIG5hLnJtID0gVFJVRSkNCmBgYA0KDQpBbCBpZ3VhbCBxdWUgcGFyYSBsYSByZWdyZXNpw7NuIHkgZWwgw6FyYm9sLCBzZSBjYWxjdWxhIHkgcmVwcmVzZW50YSBsYSByZWxldmFuY2lhIGRlIGNhZGEgdmFyaWFibGUgdXRpbGl6YWRhLg0KDQpgYGB7cn0NCmltcG9ydGFuY2UoZml0KSAjIEltcG9ydGFuY2lhIGRlIGNhZGEgdmFyaWFibGUNCmltcC5ib3NxdWUgPC0gcm91bmQoaW1wb3J0YW5jZShmaXQpL3N1bShpbXBvcnRhbmNlKGZpdCkpKjEwMCwgMikNCmltcC5ib3NxdWUyIDwtIGRhdGEuZnJhbWUobm9tYnJlcyA9IG5hbWVzKGltcC5ib3NxdWVbb3JkZXIoaW1wLmJvc3F1ZSwgZGVjcmVhc2luZyA9IFRSVUUpLF1bMTo2XSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbmNpYSA9IGltcC5ib3NxdWVbb3JkZXIoaW1wLmJvc3F1ZSwgZGVjcmVhc2luZyA9IFRSVUUpLF1bMTo2XSkNCnJvd25hbWVzKGltcC5ib3NxdWUyKSA8LSBjKCkNCmdncGxvdChpbXAuYm9zcXVlMikgKw0KICBnZW9tX2JhcihhZXMoeCA9IG5vbWJyZXMsIHkgPSBpbXBvcnRhbmNpYSksIHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gY291bFtjKDE6NCwgNiwgNyldKSArDQogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gaW1wLmJvc3F1ZTIkbm9tYnJlcywgbGFiZWxzID0gbGFiZWxzW2MoMTo0LCA2LCA3KV0pICsNCiAgbGFicyh4ID0gIlZhcmlhYmxlcyIsIHkgPSAiSW1wb3J0YW5jaWEgKCUpIiwgDQogICAgICAgdGl0bGUgPSAiSW1wb3J0YW5jaWEgZGUgbGFzIHZhcmlhYmxlcyIsDQogICAgICAgc3VidGl0bGUgPSAiQm9zcXVlIGFsZWF0b3JpbyIpICsNCiAgZ2VvbV90ZXh0KGFlcyh4ID0gbm9tYnJlcywgeSA9IGltcG9ydGFuY2lhLGxhYmVsID0gaW1wb3J0YW5jaWEpLCB2anVzdCA9IDIsIGNvbG91ciA9ICJ3aGl0ZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMjIyBDb21wYXJhY2nDs24gZGUgcHJlZGljY2lvbmVzDQoNCkFsIHNlciBlbCDDoXJib2wgc2ltcGxlIHkgbGEgcmVncmVzacOzbiBsaW5lYWwgbG9zIG1lam9yZXMgbcOpdG9kb3Mgc2llbmRvLCBhZGVtw6FzLCBlbCBQSUIgcGVyIGPDoXBpdGEgbGEgdmFyaWFibGUgbcOhcyBleHBsaWNhdGl2YSwgc2UgY29tcGFyYSBlbiB1bmEgZ3LDoWZpY2EgZWwgSUNJIHJlYWwgY29uIGVsIHByZWRpY2hvIHBvciBjYWRhIG1vZGVsby4NCg0KYGBge3J9DQpwcmVkaWNjaW9uZXMgPC0gZGF0YS5mcmFtZShQSUJfY2FwaXRhID0gcmVwKHRhc2FzW3ZhbGlkYSwgIlBJQl9jYXBpdGEiXSwzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiaW5kKGNiaW5kKHAgPSB0YXNhc1t2YWxpZGEsICJJbmNsdXNpdmUuZ3Jvd3RoIl0sIGdydXBvID0gIklDSSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JpbmQocCA9IHByZWQsIGdydXBvID0gIlJlZ3Jlc2nDs24iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiaW5kKHAgPSBwcmVkLmFyYm9sLCBncnVwbyA9ICLDgXJib2wiKSkpDQpwcmVkaWNjaW9uZXMgPC0gcHJlZGljY2lvbmVzWy13aGljaChpcy5uYShwcmVkaWNjaW9uZXMkcCkpLF0NCnByZWRpY2Npb25lcyRwIDwtIGFzLm51bWVyaWMocHJlZGljY2lvbmVzJHApDQoNCmdncGxvdChwcmVkaWNjaW9uZXMpICsNCiAgZ2VvbV9wb2ludChhZXMoeD1QSUJfY2FwaXRhLCB5ID0gcCwgY29sID0gZ3J1cG8pLCBzaXplID0gMikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHg9IlBJQiBwZXIgY8OhcGl0YSIseT0iSUNJIiwgDQogICAgICAgdGl0bGUgPSAiUHJlZGljY2lvbmVzIGRlIGxhIHJlZ3Jlc2nDs24geSBlbCDDoXJib2wiKSArDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQojIyMjIEVjb25vbcOtYXMgY29uY3JldGFzIHkgZXZvbHVjacOzbiB0ZW1wb3JhbA0KDQpTZSBzZWxlY2Npb25hbiBsYXMgZWNvbm9tw61hcyBjb24gSUNJIG3DoXMgYmFqbywgbcOhcyBhbHRvIHkgZWwgdmFsb3IgbWVkaWFuby4gU2UgZXh0cmFlbiBsb3MgZGF0b3MgY29ycmVzcG9uZGllbnRlcy4NCg0KYGBge3J9DQpJQ0kuR2VuLm9yZCA8LSBJQ0kuR2VuW29yZGVyKElDSS5HZW4kSW5jbHVzaXZlLmdyb3d0aCksXQ0KSUNJLkdlbi5vcmRbd2hpY2goSUNJLkdlbi5vcmQkSW5jbHVzaXZlLmdyb3d0aCVpbiVxdWFudGlsZShJQ0kuR2VuLm9yZCRJbmNsdXNpdmUuZ3Jvd3RoLCBjKDAsIDAuMjUsIDAuNTAsIDAuNzUsIDEpLCBuYW1lcyA9IEZBTFNFKSksIF0NCg0KQ2hhZCA8LSBkYXRvc1tkYXRvcyRFY29ub215LkxhYmVsID09ICJDaGFkIiwgXQ0KQ2hhZCRZZWFyIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKENoYWQkWWVhcikpDQpBemVyIDwtIGRhdG9zW2RhdG9zJEVjb25vbXkuTGFiZWwgPT0gIkF6ZXJiYWlqYW4iLCBdDQpBemVyJFllYXIgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoQXplciRZZWFyKSkNCkx1eCA8LSBkYXRvc1tkYXRvcyRFY29ub215LkxhYmVsID09ICJMdXhlbWJvdXJnIiwgXQ0KTHV4JFllYXIgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoTHV4JFllYXIpKQ0KYGBgDQoNClNlIGVsaW1pbmFuIGNvbHVtbmFzIHJlZHVuZGFudGVzIHkgc2UgY2FsY3VsYSBsYSB0YXNhIGRlIHZhcmlhY2nDs24gZGUgcG9ibGFjacOzbi4NCg0KYGBge3J9DQpDaGFkIDwtIENoYWRbLCAtYygxLCA0KV0NCkF6ZXIgPC0gQXplclssIC1jKDEsIDQpXQ0KTHV4IDwtIEx1eFssIC1jKDEsIDQpXQ0KDQpDaGFkJHRhc2FfUG9ibGFjaW9uX21pbCA8LSBOQQ0KQ2hhZCR0YXNhX1BvYmxhY2lvbl9taWxbMjpkaW0oQ2hhZClbMV1dIDwtIENoYWQkUG9ibGFjaW9uX21pbFsyOmRpbShDaGFkKVsxXV0vQ2hhZCRQb2JsYWNpb25fbWlsWzE6ZGltKENoYWQpWzFdLTFdLTENCg0KQXplciR0YXNhX1BvYmxhY2lvbl9taWwgPC0gTkENCkF6ZXIkdGFzYV9Qb2JsYWNpb25fbWlsWzI6ZGltKEF6ZXIpWzFdXSA8LSBBemVyJFBvYmxhY2lvbl9taWxbMjpkaW0oQXplcilbMV1dL0F6ZXIkUG9ibGFjaW9uX21pbFsxOmRpbShBemVyKVsxXS0xXS0xDQoNCkx1eCR0YXNhX1BvYmxhY2lvbl9taWwgPC0gTkENCkx1eCR0YXNhX1BvYmxhY2lvbl9taWxbMjpkaW0oTHV4KVsxXV0gPC0gTHV4JFBvYmxhY2lvbl9taWxbMjpkaW0oTHV4KVsxXV0vTHV4JFBvYmxhY2lvbl9taWxbMTpkaW0oTHV4KVsxXS0xXS0xDQpgYGANCg0KU2UgY3JlYSB1biBjb25qdW50byBkZSBkYXRvcyBjb24gbGEgaW5mb3JtYWNpw7NuIGRlIGxvcyAzIHBhw61zZXMuDQoNCmBgYHtyfQ0KY29uanVudG8gPC0gcmJpbmQoY2JpbmQoQ2hhZCwgUGHDrXMgPSAiQ2hhZCIpLA0KICAgICAgICAgICAgICAgICAgY2JpbmQoQXplciwgUGHDrXMgPSAiQXplciIpLA0KICAgICAgICAgICAgICAgICAgY2JpbmQoTHV4LCBQYcOtcyA9ICJMdXgiKSkNCmBgYA0KDQpTZSByZXByZXNlbnRhIGxhIGV2b2x1Y2nDs24gdGVtcG9yYWwgZGUgbGFzIDMgdmFyaWFibGVzIG3DoXMgcmVsZXZhbnRlcyBzZWfDum4gbG9zIG1vZGVsb3Mgb2J0ZW5pZG9zLg0KDQpgYGB7cn0NCnAuUElCX2NhcGl0YSA8LSBnZ3Bsb3QoY29uanVudG8pICsNCiAgZ2VvbV9wb2ludChhZXMoeD1ZZWFyLCB5ID0gUElCX2NhcGl0YSwgY29sID0gUGHDrXMpKSArDQogIGdlb21fbGluZShhZXMoeD1ZZWFyLCB5ID0gUElCX2NhcGl0YSwgY29sID0gUGHDrXMpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeD0iIix5PSJQSUIgcGVyIGPDoXBpdGEiLCANCiAgICAgICB0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgbcOhcyByZWxldmFudGVzIHBvciBwYcOtc2VzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCnAuSUNQIDwtIGdncGxvdChjb25qdW50bykgKw0KICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHkgPSBJQ1AsIGNvbCA9IFBhw61zKSkgKw0KICBnZW9tX2xpbmUoYWVzKHg9WWVhciwgeSA9IElDUCwgY29sID0gUGHDrXMpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeCA9ICIiLCB5PSJJQ1AiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KDQpwLnRhc2FfUG9ibGFjaW9uIDwtIGdncGxvdChjb25qdW50bykgKw0KICBnZW9tX3BvaW50KGFlcyh4PVllYXIsIHkgPSB0YXNhX1BvYmxhY2lvbl9taWwsIGNvbCA9IFBhw61zKSkgKw0KICBnZW9tX2xpbmUoYWVzKHg9WWVhciwgeSA9IHRhc2FfUG9ibGFjaW9uX21pbCwgY29sID0gUGHDrXMpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeD0iQcOxbyIseT0iVGFzYSBkZSBwb2JsYWNpw7NuIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCg0KDQpsaWJyYXJ5KHBhdGNod29yaykNCnAuUElCX2NhcGl0YSArIHAuSUNQICsgcC50YXNhX1BvYmxhY2lvbiArDQogIHBsb3RfbGF5b3V0KG5jb2wgPSAxKQ0KYGBg