Instalar paquetes y llamar librerías

#install.packages("readxl")
library(readxl)
#install.packages("plm")
library(plm)
#install.packages("gplots")
library(gplots)
#install.packages("dplyr")
library(dplyr)
#install.packages("tidyr")
library(tidyr)
#install.packages("jsonlite")
library(jsonlite)

Parte 1. Patentes

Patentes solicitadas por 226 empresas entre 2012 y 2021.

INSTRUCCIONES: Genera el mejor modelo de la Base de Datos “Patentes” y genera predicciones. Incluye conclusiones.

pat <- read_excel("C:/Users/focus/Downloads/PATENT 3.xlsx")
pat <- na.omit(as.data.frame(pat[,c("cusip","year","patents","rnd","employ","sales","merger")]))
pat <- pdata.frame(pat, index = c("cusip","year"))

# Prueba de Heterogeneidad
plotmeans(patents ~ cusip, data=pat, n.label=FALSE)

# Opción 1 - Modelo de Regresión Agrupada (Pooled)
pooled <- plm(patents ~ rnd + employ + sales + merger, data=pat, model="pooling")
summary(pooled)
## Pooling Model
## 
## Call:
## plm(formula = patents ~ rnd + employ + sales + merger, data = pat, 
##     model = "pooling")
## 
## Unbalanced Panel: n = 225, T = 8-10, N = 2236
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -335.55   -7.56   -4.06   -0.56  424.83 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  3.56268010  1.10670497  3.2192  0.001304 ** 
## rnd         -0.10368797  0.01687922 -6.1429 9.565e-10 ***
## employ       1.41291979  0.04388232 32.1979 < 2.2e-16 ***
## sales       -0.00313312  0.00049408 -6.3413 2.749e-10 ***
## merger      -7.08042091  7.66595794 -0.9236  0.355785    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10987000
## Residual Sum of Squares: 5115700
## R-Squared:      0.53437
## Adj. R-Squared: 0.53353
## F-statistic: 640.084 on 4 and 2231 DF, p-value: < 2.22e-16
# Opción 2 - Modelo de Efectos Fijos (Within)
within <- plm(patents ~ rnd + employ + sales + merger, data=pat, model="within")
summary(within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = patents ~ rnd + employ + sales + merger, data = pat, 
##     model = "within")
## 
## Unbalanced Panel: n = 225, T = 8-10, N = 2236
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -497.531   -1.607   -0.239    1.612  183.813 
## 
## Coefficients:
##           Estimate  Std. Error  t-value  Pr(>|t|)    
## rnd    -0.19747751  0.01415931 -13.9468 < 2.2e-16 ***
## employ  0.12934124  0.07177436   1.8021   0.07169 .  
## sales  -0.00312611  0.00041686  -7.4991  9.59e-14 ***
## merger  3.38818009  4.18383179   0.8098   0.41814    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1091400
## Residual Sum of Squares: 819360
## R-Squared:      0.24922
## Adj. R-Squared: 0.16393
## F-statistic: 166.559 on 4 and 2007 DF, p-value: < 2.22e-16
# Prueba F
# INTERPRETACIÓN: Si p<0.05 No usar POOLED. Si p>0.05 usar Pooled.
pFtest(within,pooled) #Ojo: El primer argumento es el modelo within!
## 
##  F test for individual effects
## 
## data:  patents ~ rnd + employ + sales + merger
## F = 46.981, df1 = 224, df2 = 2007, p-value < 2.2e-16
## alternative hypothesis: significant effects
# Opción 3 - Modelo de Efectos Aleatorios (Random)
random <- plm(patents ~ rnd + employ + sales + merger, data=pat, model="random")
summary(random)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = patents ~ rnd + employ + sales + merger, data = pat, 
##     model = "random")
## 
## Unbalanced Panel: n = 225, T = 8-10, N = 2236
## 
## Effects:
##                   var std.dev share
## idiosyncratic  408.25   20.21 0.184
## individual    1814.00   42.59 0.816
## theta:
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.8346  0.8516  0.8516  0.8512  0.8516  0.8516 
## 
## Residuals:
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -436.7779   -3.5406   -2.2716    0.0062    0.0972  207.4421 
## 
## Coefficients:
##                Estimate  Std. Error  z-value  Pr(>|z|)    
## (Intercept) 14.01442176  3.17358852   4.4160 1.006e-05 ***
## rnd         -0.16581348  0.01440937 -11.5073 < 2.2e-16 ***
## employ       0.98584171  0.05280999  18.6677 < 2.2e-16 ***
## sales       -0.00381959  0.00042484  -8.9906 < 2.2e-16 ***
## merger       4.23723745  4.40565323   0.9618    0.3362    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    1309100
## Residual Sum of Squares: 1025600
## R-Squared:      0.21655
## Adj. R-Squared: 0.21515
## Chisq: 616.974 on 4 DF, p-value: < 2.22e-16
# Prueba de Hausman
# INTERPRETACIÓN: Si p<0.05 usar Efectos Fijos. Si p>0.05 usar Efectos Aleatorios.
phtest(random,within) #Ojo: El primer argumento es el modelo random!
## 
##  Hausman Test
## 
## data:  patents ~ rnd + employ + sales + merger
## chisq = 307.54, df = 4, p-value < 2.2e-16
## alternative hypothesis: one model is inconsistent
# Por lo tanto, el mejor modelo para este panel es el de EFECTOS FIJOS.

Pronóstico: ¿cuántas patentes solicitarían las 5 empresas más grandes si suben 10% su gasto en I+D?

pat2 <- as.data.frame(pat)
pat2$cusip <- as.character(pat2$cusip)
pat2$year  <- as.numeric(as.character(pat2$year))

# 2021 viene incompleto, por eso el pronóstico parte de 2020
tapply(pat2$patents, pat2$year, mean)
##      2012      2013      2014      2015      2016      2017      2018      2019 
## 26.823529 26.258929 26.826667 27.647321 25.777778 26.130631 24.730942 23.718750 
##      2020      2021 
## 18.448889  5.008969
top5 <- names(sort(tapply(pat2$patents, pat2$cusip, mean), decreasing=TRUE))[1:5]
pat_pronostico <- pat2[pat2$cusip %in% top5 & pat2$year==2020, ]

intercepto <- fixef(within)
pendiente  <- coef(within)

pat_pronostico$Pronostico <- intercepto[pat_pronostico$cusip] +
                             pendiente["rnd"]*pat_pronostico$rnd*1.10 +
                             pendiente["employ"]*pat_pronostico$employ +
                             pendiente["sales"]*pat_pronostico$sales +
                             pendiente["merger"]*pat_pronostico$merger

pat_pronostico[,c("cusip","patents","Pronostico")]
##       cusip patents Pronostico
## 238  149123     140   221.3447
## 408  277461     214   193.0776
## 606  369604     667   667.8159
## 941  459200     333   287.5516
## 1429 620076     130   138.0716

CONCLUSIÓN: El mejor modelo para esta base es el de Efectos Fijos. La prueba F descarta el modelo agrupado y la de Hausman descarta el de efectos aleatorios, o sea que las características propias de cada empresa sí están relacionadas con cuánto invierte y cuánto vende. El problema es lo que dice el modelo: el gasto en I+D sale con signo negativo, y el pronóstico lo confirma, porque si estas 5 empresas suben 10% su gasto en I+D el modelo dice que solicitarían menos patentes, lo cual no tiene sentido. Eso pasa porque rnd, sales y employ terminan midiendo lo mismo, que es el tamaño de la empresa. Con un R² de 0.2492 el modelo explica apenas una cuarta parte de la variación dentro de cada empresa, así que los pronósticos no los usaría para tomar una decisión. Para que sirvieran habría que pasar las variables a logaritmos o usar un modelo de conteo, y quitar 2021, que viene incompleto: el promedio de patentes cae de 18.4 a 5 y 125 de las 226 empresas aparecen con cero.

Parte 2. Cuidado de la Piel

Valor del mercado de Beauty and Personal Care en México, 2011-2025.

INSTRUCCIONES: Genera el mejor modelo de la Base de Datos “Market sizes” y genera predicciones. Si tuvieras que invertir en alguna sub-categoría, ¿en cuál lo harías?

market <- read_excel("C:/Users/focus/Downloads/Market sizes.xlsx", skip = 5)

subcats <- c("Bath and Shower","Deodorants","Depilatories","Fragrances",
             "Hair Care","Men's Grooming","Skin Care","Sun Care")

panel <- market %>%
  filter(Category %in% subcats) %>%
  select(Category, matches("^[0-9]{4}$")) %>%
  mutate(across(everything(), as.character)) %>%   #Ojo: los "-" del Excel hacen que unos años se lean como texto
  pivot_longer(-Category, names_to="Anio", values_to="Valor") %>%
  mutate(Anio  = as.numeric(Anio),
         Valor = as.numeric(na_if(Valor,"-"))) %>%
  filter(!is.na(Valor)) %>%
  mutate(Tendencia = Anio - 2010,     # 1 = 2011, 15 = 2025, 16 = 2026
         logValor  = log(Valor))      # con log el coeficiente es la tasa de crecimiento

panel <- pdata.frame(panel, index = c("Category","Anio"))

# Prueba de Heterogeneidad
par(mar=c(9,5,3,1))
plotmeans(Valor ~ Category, data=panel, las=2, connect=FALSE, xlab="")

# Opción 1 - Modelo de Regresión Agrupada (Pooled)
pooled2 <- plm(logValor ~ Tendencia, data=panel, model="pooling")
summary(pooled2)
## Pooling Model
## 
## Call:
## plm(formula = logValor ~ Tendencia, data = panel, model = "pooling")
## 
## Balanced Panel: n = 8, T = 15, N = 120
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
##  -2.386  -0.416   0.395   0.937   1.282 
## 
## Coefficients:
##             Estimate Std. Error t-value Pr(>|t|)    
## (Intercept) 8.910147   0.238229 37.4017  < 2e-16 ***
## Tendencia   0.067392   0.026202  2.5721  0.01135 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    191.64
## Residual Sum of Squares: 181.46
## R-Squared:      0.053087
## Adj. R-Squared: 0.045063
## F-statistic: 6.6155 on 1 and 118 DF, p-value: 0.01135
# Opción 2 - Modelo de Efectos Fijos (Within)
within2 <- plm(logValor ~ Tendencia, data=panel, model="within")
summary(within2)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = logValor ~ Tendencia, data = panel, model = "within")
## 
## Balanced Panel: n = 8, T = 15, N = 120
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -0.25125 -0.04400  0.00802  0.04081  0.24915 
## 
## Coefficients:
##            Estimate Std. Error t-value  Pr(>|t|)    
## Tendencia 0.0673923  0.0018042  37.353 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    10.983
## Residual Sum of Squares: 0.80937
## R-Squared:      0.92631
## Adj. R-Squared: 0.92099
## F-statistic: 1395.23 on 1 and 111 DF, p-value: < 2.22e-16
# Prueba F
pFtest(within2,pooled2)
## 
##  F test for individual effects
## 
## data:  logValor ~ Tendencia
## F = 3539.4, df1 = 7, df2 = 111, p-value < 2.2e-16
## alternative hypothesis: significant effects
# Opción 3 - Modelo de Efectos Aleatorios (Random)
random2 <- plm(logValor ~ Tendencia, data=panel, model="random")
summary(random2)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = logValor ~ Tendencia, data = panel, model = "random")
## 
## Balanced Panel: n = 8, T = 15, N = 120
## 
## Effects:
##                    var  std.dev share
## idiosyncratic 0.007292 0.085391 0.004
## individual    1.720022 1.311496 0.996
## theta: 0.9832
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -0.23757 -0.03954  0.00409  0.04301  0.22468 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept) 8.9101472  0.4639740  19.204 < 2.2e-16 ***
## Tendencia   0.0673923  0.0018042  37.353 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    11.034
## Residual Sum of Squares: 0.86041
## R-Squared:      0.92202
## Adj. R-Squared: 0.92136
## Chisq: 1395.23 on 1 DF, p-value: < 2.22e-16
# Prueba de Hausman
phtest(random2,within2)
## 
##  Hausman Test
## 
## data:  logValor ~ Tendencia
## chisq = 1.6241e-14, df = 1, p-value = 1
## alternative hypothesis: one model is inconsistent
# Por lo tanto, el mejor modelo para este panel es el de EFECTOS ALEATORIOS.

Pronóstico 2026 por subcategoría:

panel2 <- as.data.frame(panel)

pronostico <- panel2 %>%
  group_by(Category) %>%
  summarise(Crecimiento = coef(lm(logValor ~ Tendencia))[2],
            R2          = summary(lm(logValor ~ Tendencia))$r.squared,
            Pron2026    = exp(predict(lm(logValor ~ Tendencia),
                                      data.frame(Tendencia=16)))) %>%
  arrange(desc(Pron2026))

as.data.frame(pronostico)
##          Category Crecimiento        R2  Pron2026
## 1       Skin Care  0.07443372 0.9703365 72529.360
## 2       Hair Care  0.05418877 0.9728327 55317.968
## 3      Fragrances  0.07462101 0.9032801 52078.190
## 4  Men's Grooming  0.06504529 0.9616394 50701.874
## 5      Deodorants  0.05670968 0.9230642 22763.378
## 6 Bath and Shower  0.06533531 0.9865601 22102.258
## 7        Sun Care  0.08835282 0.9349442  4412.509
## 8    Depilatories  0.06045172 0.9689007  2147.434
# La sub-categoría que más crece y la que menos crece
pronostico[which.max(pronostico$Crecimiento), ]
## # A tibble: 1 × 4
##   Category Crecimiento    R2 Pron2026
##   <fct>          <dbl> <dbl>    <dbl>
## 1 Sun Care      0.0884 0.935    4413.
pronostico[which.min(pronostico$Crecimiento), ]
## # A tibble: 1 × 4
##   Category  Crecimiento    R2 Pron2026
##   <fct>           <dbl> <dbl>    <dbl>
## 1 Hair Care      0.0542 0.973   55318.

CONCLUSIÓN: Invertiría en Skin Care. El mejor modelo es el de Efectos Aleatorios y dice que el mercado completo crece 6.74% anual, pero al sacar la tasa de cada sub-categoría se ve que no todas van al mismo ritmo: la que más crece es Sun Care con 8.84% anual y la que menos crece es Hair Care con 5.42%. Lo importante es que ninguna de las dos es la respuesta automática. El mercado que más crece es también el que más competencia va a atraer, porque todas las marcas ven el mismo crecimiento y se meten; y el que menos crece suele ser el que menos competencia nueva tiene, porque ya está maduro y no le resulta atractivo a nadie. Sun Care además es diminuto, 4,413 millones contra los 55,318 de Hair Care, así que aunque crezca al doble de velocidad el volumen absoluto no compensa: funciona como apuesta de nicho, no como apuesta principal. Skin Care es el punto medio que sí conviene, porque crece 7.44% anual, casi tan rápido como Sun Care, y al mismo tiempo es el mercado más grande de los ocho con 72,529 millones pronosticados para 2026. Es además el que mejor se ajusta al modelo, con un R² de 0.9703, así que su pronóstico es el más confiable de todos. La única advertencia es que esta base solo mide tamaño de mercado y no dice nada de cuántos competidores hay en cada sub-categoría; para cerrar el argumento de la competencia habría que cruzarlo con la base de Company Shares.

Parte 3. Banco Mundial

Esperanza de vida en 12 países, 2000-2023.

INSTRUCCIONES: Importa datos del banco mundial y genera el mejor modelo, incluyendo predicciones. Incluye conclusiones y gráficas.

# La API del Banco Mundial responde lenta desde esta red, por eso el timeout largo
options(timeout = 600)

paises <- "MX;US;CA;BR;CL;CO;AR;PE;ES;KR;JP;IN"

baja <- function(indicador) {
  u <- paste0("https://api.worldbank.org/v2/country/", paises,
              "/indicator/", indicador, "?format=json&per_page=2000&date=2000:2023")
  d <- fromJSON(u)[[2]]
  data.frame(Pais = d$country$value, Anio = as.numeric(d$date), Valor = d$value)
}

# La descarga tarda varios minutos, por eso se guarda y no se vuelve a bajar
if (file.exists("wdi.rds")) {
  wdi <- readRDS("wdi.rds")
} else {
  esperanza  <- baja("SP.DYN.LE00.IN")     # esperanza de vida al nacer
  pib        <- baja("NY.GDP.PCAP.CD")     # PIB per cápita
  salud      <- baja("SH.XPD.CHEX.GD.ZS")  # gasto en salud % del PIB
  urbana     <- baja("SP.URB.TOTL.IN.ZS")  # población urbana %
  fertilidad <- baja("SP.DYN.TFRT.IN")     # hijos por mujer

  wdi <- esperanza %>%
    rename(Esperanza = Valor) %>%
    left_join(rename(pib,        PIB        = Valor), by=c("Pais","Anio")) %>%
    left_join(rename(salud,      Salud      = Valor), by=c("Pais","Anio")) %>%
    left_join(rename(urbana,     Urbana     = Valor), by=c("Pais","Anio")) %>%
    left_join(rename(fertilidad, Fertilidad = Valor), by=c("Pais","Anio")) %>%
    mutate(PIB = PIB/1000) %>%          # PIB per cápita en miles de USD
    na.omit()

  saveRDS(wdi, "wdi.rds")
}

head(wdi)
##        Pais Anio Esperanza       PIB    Salud   Urbana Fertilidad
## 1 Argentina 2023    77.395 14.261847 10.26952 92.19451      1.500
## 2 Argentina 2022    75.806 13.962189 10.15950 92.11284      1.482
## 3 Argentina 2021    73.948 10.738018 11.00910 92.02928      1.585
## 4 Argentina 2020    75.878  8.535599 10.67246 91.94390      1.601
## 5 Argentina 2019    76.847  9.955975 10.11911 91.85678      1.882
## 6 Argentina 2018    76.770 11.752800 10.17289 91.76799      2.067
# Prueba de Heterogeneidad
par(mar=c(8,5,3,1))
plotmeans(Esperanza ~ Pais, data=wdi, las=2, connect=FALSE, xlab="", ylab="Años")

# Gráfica de ingreso contra esperanza de vida
plot(wdi$PIB, wdi$Esperanza,
     xlab="PIB per cápita (miles de USD)", ylab="Esperanza de vida (años)",
     pch=19, col="grey40")
abline(lm(Esperanza ~ PIB, data=wdi), col="red", lwd=2)

wdi <- pdata.frame(wdi, index = c("Pais","Anio"))

# Opción 1 - Modelo de Regresión Agrupada (Pooled)
pooled3 <- plm(Esperanza ~ PIB + Salud + Urbana + Fertilidad, data=wdi, model="pooling")
summary(pooled3)
## Pooling Model
## 
## Call:
## plm(formula = Esperanza ~ PIB + Salud + Urbana + Fertilidad, 
##     data = wdi, model = "pooling")
## 
## Balanced Panel: n = 12, T = 24, N = 288
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
##  -6.065  -0.595   0.250   0.971   3.527 
## 
## Coefficients:
##               Estimate Std. Error  t-value  Pr(>|t|)    
## (Intercept) 75.4130817  0.9534218  79.0973 < 2.2e-16 ***
## PIB          0.1278894  0.0109406  11.6894 < 2.2e-16 ***
## Salud       -0.3112481  0.0573162  -5.4304 1.212e-07 ***
## Urbana       0.1194947  0.0086605  13.7977 < 2.2e-16 ***
## Fertilidad  -4.3246340  0.2745273 -15.7530 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    6263.9
## Residual Sum of Squares: 811.36
## R-Squared:      0.87047
## Adj. R-Squared: 0.86864
## F-statistic: 475.457 on 4 and 283 DF, p-value: < 2.22e-16
# Opción 2 - Modelo de Efectos Fijos (Within)
within3 <- plm(Esperanza ~ PIB + Salud + Urbana + Fertilidad, data=wdi, model="within")
summary(within3)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = Esperanza ~ PIB + Salud + Urbana + Fertilidad, 
##     data = wdi, model = "within")
## 
## Balanced Panel: n = 12, T = 24, N = 288
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
##  -5.187  -0.387   0.221   0.673   1.981 
## 
## Coefficients:
##             Estimate Std. Error t-value  Pr(>|t|)    
## PIB         0.068722   0.014465  4.7508 3.284e-06 ***
## Salud      -0.045645   0.084567 -0.5397    0.5898    
## Urbana      0.338864   0.042202  8.0296 2.967e-14 ***
## Fertilidad -2.302993   0.337533 -6.8230 5.776e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    795.01
## Residual Sum of Squares: 332.54
## R-Squared:      0.58171
## Adj. R-Squared: 0.55864
## F-statistic: 94.5665 on 4 and 272 DF, p-value: < 2.22e-16
# Prueba F
pFtest(within3,pooled3)
## 
##  F test for individual effects
## 
## data:  Esperanza ~ PIB + Salud + Urbana + Fertilidad
## F = 35.603, df1 = 11, df2 = 272, p-value < 2.2e-16
## alternative hypothesis: significant effects
# Opción 3 - Modelo de Efectos Aleatorios (Random)
random3 <- plm(Esperanza ~ PIB + Salud + Urbana + Fertilidad, data=wdi, model="random")
summary(random3)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = Esperanza ~ PIB + Salud + Urbana + Fertilidad, 
##     data = wdi, model = "random")
## 
## Balanced Panel: n = 12, T = 24, N = 288
## 
## Effects:
##                 var std.dev share
## idiosyncratic 1.223   1.106 0.355
## individual    2.220   1.490 0.645
## theta: 0.8502
## 
## Residuals:
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
##  -5.295  -0.450   0.206   0.687   2.515 
## 
## Coefficients:
##              Estimate Std. Error z-value  Pr(>|z|)    
## (Intercept) 65.275337   2.346653 27.8164 < 2.2e-16 ***
## PIB          0.075145   0.014225  5.2825 1.274e-07 ***
## Salud       -0.022270   0.081097 -0.2746    0.7836    
## Urbana       0.199977   0.027046  7.3939 1.426e-13 ***
## Fertilidad  -2.926314   0.321027 -9.1155 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    917.69
## Residual Sum of Squares: 371.22
## R-Squared:      0.59548
## Adj. R-Squared: 0.58977
## Chisq: 416.602 on 4 DF, p-value: < 2.22e-16
# Prueba de Hausman
phtest(random3,within3)
## 
##  Hausman Test
## 
## data:  Esperanza ~ PIB + Salud + Urbana + Fertilidad
## chisq = 34.163, df = 4, p-value = 6.9e-07
## alternative hypothesis: one model is inconsistent
# Por lo tanto, el mejor modelo para este panel es el de EFECTOS FIJOS.

Pronóstico: esperanza de vida de cada país si su PIB per cápita sube 10%.

wdi2 <- as.data.frame(wdi)
wdi2$Pais <- as.character(wdi2$Pais)
wdi2$Anio <- as.numeric(as.character(wdi2$Anio))

wdi_pronostico <- wdi2[wdi2$Anio == max(wdi2$Anio), ]

intercepto3 <- fixef(within3)
pendiente3  <- coef(within3)

wdi_pronostico$Ajustado <- intercepto3[wdi_pronostico$Pais] +
                           pendiente3["PIB"]*wdi_pronostico$PIB +
                           pendiente3["Salud"]*wdi_pronostico$Salud +
                           pendiente3["Urbana"]*wdi_pronostico$Urbana +
                           pendiente3["Fertilidad"]*wdi_pronostico$Fertilidad

wdi_pronostico$Pronostico <- intercepto3[wdi_pronostico$Pais] +
                             pendiente3["PIB"]*wdi_pronostico$PIB*1.10 +
                             pendiente3["Salud"]*wdi_pronostico$Salud +
                             pendiente3["Urbana"]*wdi_pronostico$Urbana +
                             pendiente3["Fertilidad"]*wdi_pronostico$Fertilidad

wdi_pronostico[,c("Pais","Esperanza","Ajustado","Pronostico")]
##              Pais Esperanza Ajustado Pronostico
## 24      Argentina  77.39500 77.90201   78.00002
## 48         Brazil  75.84800 75.02477   75.09609
## 72         Canada  81.62634 83.00841   83.38533
## 96          Chile  81.16700 81.12941   81.24680
## 120      Colombia  77.72500 75.98704   76.03523
## 144         India  72.00300 70.14654   70.16327
## 168         Japan  84.04122 84.22867   84.47068
## 192   Korea, Rep.  83.42927 81.82440   82.06956
## 216        Mexico  75.06900 75.51749   75.61254
## 240          Peru  77.74000 76.76254   76.81696
## 264         Spain  83.93415 83.17301   83.40318
## 288 United States  78.38537 80.46590   81.03345

CONCLUSIÓN: El mejor modelo para este panel es el de Efectos Fijos. La prueba F descarta el modelo agrupado y la de Hausman da un p de 6.9e-07, así que se queda con efectos fijos. El modelo explica el 58.17% de la variación dentro de cada país y salen significativas tres de las cuatro variables: por cada 1,000 dólares más de PIB per cápita la esperanza de vida sube 0.069 años, por cada punto porcentual más de población urbana sube 0.339 años, y por cada hijo más por mujer baja 2.303 años. El gasto en salud como porcentaje del PIB no resulta significativo, lo cual tiene sentido porque gastar más no garantiza gastar bien. El pronóstico deja ver que el ingreso mueve muy poco la aguja: subir 10% el PIB per cápita le suma a México menos de una décima de año (de 75.52 a 75.61) y al país que más le sube, Estados Unidos, apenas le agrega medio año. La gráfica de dispersión explica por qué, porque la relación entre ingreso y esperanza de vida no es una recta: los primeros miles de dólares suman muchos años y después el efecto se aplana. Comparando la columna Ajustado con la observada se ve que el modelo le atina bien a países como Chile y Japón y se equivoca por más de dos años en Estados Unidos, así que los pronósticos sirven para comparar tendencias entre países pero no para predecir la esperanza de vida exacta de uno solo.

LS0tCnRpdGxlOiAiQWN0aXZpZGFkIDEiCmF1dGhvcjogIkRlcmVjayBJa2VyIFZpbGxhZmHDsWEgUm9tZXJvIC0gQTAwNTczNzU2IgpkYXRlOiAiMjAyNi0wOC0xNyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IHNwYWNlbGFiCi0tLQoKIyBJbnN0YWxhciBwYXF1ZXRlcyB5IGxsYW1hciBsaWJyZXLDrWFzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygicmVhZHhsIikKbGlicmFyeShyZWFkeGwpCiNpbnN0YWxsLnBhY2thZ2VzKCJwbG0iKQpsaWJyYXJ5KHBsbSkKI2luc3RhbGwucGFja2FnZXMoImdwbG90cyIpCmxpYnJhcnkoZ3Bsb3RzKQojaW5zdGFsbC5wYWNrYWdlcygiZHBseXIiKQpsaWJyYXJ5KGRwbHlyKQojaW5zdGFsbC5wYWNrYWdlcygidGlkeXIiKQpsaWJyYXJ5KHRpZHlyKQojaW5zdGFsbC5wYWNrYWdlcygianNvbmxpdGUiKQpsaWJyYXJ5KGpzb25saXRlKQpgYGAKCiMgUGFydGUgMS4gUGF0ZW50ZXMKCioqUGF0ZW50ZXMgc29saWNpdGFkYXMgcG9yIDIyNiBlbXByZXNhcyBlbnRyZSAyMDEyIHkgMjAyMS4qKgoKKipJTlNUUlVDQ0lPTkVTOioqIEdlbmVyYSBlbCBtZWpvciBtb2RlbG8gZGUgbGEgQmFzZSBkZSBEYXRvcyAiUGF0ZW50ZXMiIHkgZ2VuZXJhCnByZWRpY2Npb25lcy4gSW5jbHV5ZSBjb25jbHVzaW9uZXMuCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpwYXQgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvZm9jdXMvRG93bmxvYWRzL1BBVEVOVCAzLnhsc3giKQpwYXQgPC0gbmEub21pdChhcy5kYXRhLmZyYW1lKHBhdFssYygiY3VzaXAiLCJ5ZWFyIiwicGF0ZW50cyIsInJuZCIsImVtcGxveSIsInNhbGVzIiwibWVyZ2VyIildKSkKcGF0IDwtIHBkYXRhLmZyYW1lKHBhdCwgaW5kZXggPSBjKCJjdXNpcCIsInllYXIiKSkKCiMgUHJ1ZWJhIGRlIEhldGVyb2dlbmVpZGFkCnBsb3RtZWFucyhwYXRlbnRzIH4gY3VzaXAsIGRhdGE9cGF0LCBuLmxhYmVsPUZBTFNFKQoKIyBPcGNpw7NuIDEgLSBNb2RlbG8gZGUgUmVncmVzacOzbiBBZ3J1cGFkYSAoUG9vbGVkKQpwb29sZWQgPC0gcGxtKHBhdGVudHMgfiBybmQgKyBlbXBsb3kgKyBzYWxlcyArIG1lcmdlciwgZGF0YT1wYXQsIG1vZGVsPSJwb29saW5nIikKc3VtbWFyeShwb29sZWQpCgojIE9wY2nDs24gMiAtIE1vZGVsbyBkZSBFZmVjdG9zIEZpam9zIChXaXRoaW4pCndpdGhpbiA8LSBwbG0ocGF0ZW50cyB+IHJuZCArIGVtcGxveSArIHNhbGVzICsgbWVyZ2VyLCBkYXRhPXBhdCwgbW9kZWw9IndpdGhpbiIpCnN1bW1hcnkod2l0aGluKQoKIyBQcnVlYmEgRgojIElOVEVSUFJFVEFDScOTTjogU2kgcDwwLjA1IE5vIHVzYXIgUE9PTEVELiBTaSBwPjAuMDUgdXNhciBQb29sZWQuCnBGdGVzdCh3aXRoaW4scG9vbGVkKSAjT2pvOiBFbCBwcmltZXIgYXJndW1lbnRvIGVzIGVsIG1vZGVsbyB3aXRoaW4hCgojIE9wY2nDs24gMyAtIE1vZGVsbyBkZSBFZmVjdG9zIEFsZWF0b3Jpb3MgKFJhbmRvbSkKcmFuZG9tIDwtIHBsbShwYXRlbnRzIH4gcm5kICsgZW1wbG95ICsgc2FsZXMgKyBtZXJnZXIsIGRhdGE9cGF0LCBtb2RlbD0icmFuZG9tIikKc3VtbWFyeShyYW5kb20pCgojIFBydWViYSBkZSBIYXVzbWFuCiMgSU5URVJQUkVUQUNJw5NOOiBTaSBwPDAuMDUgdXNhciBFZmVjdG9zIEZpam9zLiBTaSBwPjAuMDUgdXNhciBFZmVjdG9zIEFsZWF0b3Jpb3MuCnBodGVzdChyYW5kb20sd2l0aGluKSAjT2pvOiBFbCBwcmltZXIgYXJndW1lbnRvIGVzIGVsIG1vZGVsbyByYW5kb20hCgojIFBvciBsbyB0YW50bywgZWwgbWVqb3IgbW9kZWxvIHBhcmEgZXN0ZSBwYW5lbCBlcyBlbCBkZSBFRkVDVE9TIEZJSk9TLgpgYGAKCioqUHJvbsOzc3RpY286Kiogwr9jdcOhbnRhcyBwYXRlbnRlcyBzb2xpY2l0YXLDrWFuIGxhcyA1IGVtcHJlc2FzIG3DoXMgZ3JhbmRlcyBzaSBzdWJlbgoxMCUgc3UgZ2FzdG8gZW4gSStEPwoKYGBge3J9CnBhdDIgPC0gYXMuZGF0YS5mcmFtZShwYXQpCnBhdDIkY3VzaXAgPC0gYXMuY2hhcmFjdGVyKHBhdDIkY3VzaXApCnBhdDIkeWVhciAgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIocGF0MiR5ZWFyKSkKCiMgMjAyMSB2aWVuZSBpbmNvbXBsZXRvLCBwb3IgZXNvIGVsIHByb27Ds3N0aWNvIHBhcnRlIGRlIDIwMjAKdGFwcGx5KHBhdDIkcGF0ZW50cywgcGF0MiR5ZWFyLCBtZWFuKQoKdG9wNSA8LSBuYW1lcyhzb3J0KHRhcHBseShwYXQyJHBhdGVudHMsIHBhdDIkY3VzaXAsIG1lYW4pLCBkZWNyZWFzaW5nPVRSVUUpKVsxOjVdCnBhdF9wcm9ub3N0aWNvIDwtIHBhdDJbcGF0MiRjdXNpcCAlaW4lIHRvcDUgJiBwYXQyJHllYXI9PTIwMjAsIF0KCmludGVyY2VwdG8gPC0gZml4ZWYod2l0aGluKQpwZW5kaWVudGUgIDwtIGNvZWYod2l0aGluKQoKcGF0X3Byb25vc3RpY28kUHJvbm9zdGljbyA8LSBpbnRlcmNlcHRvW3BhdF9wcm9ub3N0aWNvJGN1c2lwXSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlWyJybmQiXSpwYXRfcHJvbm9zdGljbyRybmQqMS4xMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlWyJlbXBsb3kiXSpwYXRfcHJvbm9zdGljbyRlbXBsb3kgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpZW50ZVsic2FsZXMiXSpwYXRfcHJvbm9zdGljbyRzYWxlcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlWyJtZXJnZXIiXSpwYXRfcHJvbm9zdGljbyRtZXJnZXIKCnBhdF9wcm9ub3N0aWNvWyxjKCJjdXNpcCIsInBhdGVudHMiLCJQcm9ub3N0aWNvIildCmBgYAoKQ09OQ0xVU0nDk046IEVsIG1lam9yIG1vZGVsbyBwYXJhIGVzdGEgYmFzZSBlcyBlbCBkZSBFZmVjdG9zIEZpam9zLiBMYSBwcnVlYmEgRgpkZXNjYXJ0YSBlbCBtb2RlbG8gYWdydXBhZG8geSBsYSBkZSBIYXVzbWFuIGRlc2NhcnRhIGVsIGRlIGVmZWN0b3MgYWxlYXRvcmlvcywgbyBzZWEKcXVlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHByb3BpYXMgZGUgY2FkYSBlbXByZXNhIHPDrSBlc3TDoW4gcmVsYWNpb25hZGFzIGNvbiBjdcOhbnRvCmludmllcnRlIHkgY3XDoW50byB2ZW5kZS4gRWwgcHJvYmxlbWEgZXMgbG8gcXVlIGRpY2UgZWwgbW9kZWxvOiBlbCBnYXN0byBlbiBJK0Qgc2FsZSBjb24Kc2lnbm8gbmVnYXRpdm8sIHkgZWwgcHJvbsOzc3RpY28gbG8gY29uZmlybWEsIHBvcnF1ZSBzaSBlc3RhcyA1IGVtcHJlc2FzIHN1YmVuIDEwJSBzdQpnYXN0byBlbiBJK0QgZWwgbW9kZWxvIGRpY2UgcXVlIHNvbGljaXRhcsOtYW4gbWVub3MgcGF0ZW50ZXMsIGxvIGN1YWwgbm8gdGllbmUgc2VudGlkby4KRXNvIHBhc2EgcG9ycXVlIHJuZCwgc2FsZXMgeSBlbXBsb3kgdGVybWluYW4gbWlkaWVuZG8gbG8gbWlzbW8sIHF1ZSBlcyBlbCB0YW1hw7FvIGRlIGxhCmVtcHJlc2EuIENvbiB1biBSwrIgZGUgMC4yNDkyIGVsIG1vZGVsbyBleHBsaWNhIGFwZW5hcyB1bmEgY3VhcnRhIHBhcnRlIGRlIGxhIHZhcmlhY2nDs24KZGVudHJvIGRlIGNhZGEgZW1wcmVzYSwgYXPDrSBxdWUgbG9zIHByb27Ds3N0aWNvcyBubyBsb3MgdXNhcsOtYSBwYXJhIHRvbWFyIHVuYSBkZWNpc2nDs24uClBhcmEgcXVlIHNpcnZpZXJhbiBoYWJyw61hIHF1ZSBwYXNhciBsYXMgdmFyaWFibGVzIGEgbG9nYXJpdG1vcyBvIHVzYXIgdW4gbW9kZWxvIGRlCmNvbnRlbywgeSBxdWl0YXIgMjAyMSwgcXVlIHZpZW5lIGluY29tcGxldG86IGVsIHByb21lZGlvIGRlIHBhdGVudGVzIGNhZSBkZSAxOC40IGEgNSB5CjEyNSBkZSBsYXMgMjI2IGVtcHJlc2FzIGFwYXJlY2VuIGNvbiBjZXJvLgoKIyBQYXJ0ZSAyLiBDdWlkYWRvIGRlIGxhIFBpZWwKCioqVmFsb3IgZGVsIG1lcmNhZG8gZGUgQmVhdXR5IGFuZCBQZXJzb25hbCBDYXJlIGVuIE3DqXhpY28sIDIwMTEtMjAyNS4qKgoKKipJTlNUUlVDQ0lPTkVTOioqIEdlbmVyYSBlbCBtZWpvciBtb2RlbG8gZGUgbGEgQmFzZSBkZSBEYXRvcyAiTWFya2V0IHNpemVzIiB5IGdlbmVyYQpwcmVkaWNjaW9uZXMuIFNpIHR1dmllcmFzIHF1ZSBpbnZlcnRpciBlbiBhbGd1bmEgc3ViLWNhdGVnb3LDrWEsIMK/ZW4gY3XDoWwgbG8gaGFyw61hcz8KCmBgYHtyIHdhcm5pbmc9RkFMU0V9Cm1hcmtldCA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9mb2N1cy9Eb3dubG9hZHMvTWFya2V0IHNpemVzLnhsc3giLCBza2lwID0gNSkKCnN1YmNhdHMgPC0gYygiQmF0aCBhbmQgU2hvd2VyIiwiRGVvZG9yYW50cyIsIkRlcGlsYXRvcmllcyIsIkZyYWdyYW5jZXMiLAogICAgICAgICAgICAgIkhhaXIgQ2FyZSIsIk1lbidzIEdyb29taW5nIiwiU2tpbiBDYXJlIiwiU3VuIENhcmUiKQoKcGFuZWwgPC0gbWFya2V0ICU+JQogIGZpbHRlcihDYXRlZ29yeSAlaW4lIHN1YmNhdHMpICU+JQogIHNlbGVjdChDYXRlZ29yeSwgbWF0Y2hlcygiXlswLTldezR9JCIpKSAlPiUKICBtdXRhdGUoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgYXMuY2hhcmFjdGVyKSkgJT4lICAgI09qbzogbG9zICItIiBkZWwgRXhjZWwgaGFjZW4gcXVlIHVub3MgYcOxb3Mgc2UgbGVhbiBjb21vIHRleHRvCiAgcGl2b3RfbG9uZ2VyKC1DYXRlZ29yeSwgbmFtZXNfdG89IkFuaW8iLCB2YWx1ZXNfdG89IlZhbG9yIikgJT4lCiAgbXV0YXRlKEFuaW8gID0gYXMubnVtZXJpYyhBbmlvKSwKICAgICAgICAgVmFsb3IgPSBhcy5udW1lcmljKG5hX2lmKFZhbG9yLCItIikpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKFZhbG9yKSkgJT4lCiAgbXV0YXRlKFRlbmRlbmNpYSA9IEFuaW8gLSAyMDEwLCAgICAgIyAxID0gMjAxMSwgMTUgPSAyMDI1LCAxNiA9IDIwMjYKICAgICAgICAgbG9nVmFsb3IgID0gbG9nKFZhbG9yKSkgICAgICAjIGNvbiBsb2cgZWwgY29lZmljaWVudGUgZXMgbGEgdGFzYSBkZSBjcmVjaW1pZW50bwoKcGFuZWwgPC0gcGRhdGEuZnJhbWUocGFuZWwsIGluZGV4ID0gYygiQ2F0ZWdvcnkiLCJBbmlvIikpCgojIFBydWViYSBkZSBIZXRlcm9nZW5laWRhZApwYXIobWFyPWMoOSw1LDMsMSkpCnBsb3RtZWFucyhWYWxvciB+IENhdGVnb3J5LCBkYXRhPXBhbmVsLCBsYXM9MiwgY29ubmVjdD1GQUxTRSwgeGxhYj0iIikKCiMgT3BjacOzbiAxIC0gTW9kZWxvIGRlIFJlZ3Jlc2nDs24gQWdydXBhZGEgKFBvb2xlZCkKcG9vbGVkMiA8LSBwbG0obG9nVmFsb3IgfiBUZW5kZW5jaWEsIGRhdGE9cGFuZWwsIG1vZGVsPSJwb29saW5nIikKc3VtbWFyeShwb29sZWQyKQoKIyBPcGNpw7NuIDIgLSBNb2RlbG8gZGUgRWZlY3RvcyBGaWpvcyAoV2l0aGluKQp3aXRoaW4yIDwtIHBsbShsb2dWYWxvciB+IFRlbmRlbmNpYSwgZGF0YT1wYW5lbCwgbW9kZWw9IndpdGhpbiIpCnN1bW1hcnkod2l0aGluMikKCiMgUHJ1ZWJhIEYKcEZ0ZXN0KHdpdGhpbjIscG9vbGVkMikKCiMgT3BjacOzbiAzIC0gTW9kZWxvIGRlIEVmZWN0b3MgQWxlYXRvcmlvcyAoUmFuZG9tKQpyYW5kb20yIDwtIHBsbShsb2dWYWxvciB+IFRlbmRlbmNpYSwgZGF0YT1wYW5lbCwgbW9kZWw9InJhbmRvbSIpCnN1bW1hcnkocmFuZG9tMikKCiMgUHJ1ZWJhIGRlIEhhdXNtYW4KcGh0ZXN0KHJhbmRvbTIsd2l0aGluMikKCiMgUG9yIGxvIHRhbnRvLCBlbCBtZWpvciBtb2RlbG8gcGFyYSBlc3RlIHBhbmVsIGVzIGVsIGRlIEVGRUNUT1MgQUxFQVRPUklPUy4KYGBgCgoqKlByb27Ds3N0aWNvIDIwMjYgcG9yIHN1YmNhdGVnb3LDrWE6KioKCmBgYHtyfQpwYW5lbDIgPC0gYXMuZGF0YS5mcmFtZShwYW5lbCkKCnByb25vc3RpY28gPC0gcGFuZWwyICU+JQogIGdyb3VwX2J5KENhdGVnb3J5KSAlPiUKICBzdW1tYXJpc2UoQ3JlY2ltaWVudG8gPSBjb2VmKGxtKGxvZ1ZhbG9yIH4gVGVuZGVuY2lhKSlbMl0sCiAgICAgICAgICAgIFIyICAgICAgICAgID0gc3VtbWFyeShsbShsb2dWYWxvciB+IFRlbmRlbmNpYSkpJHIuc3F1YXJlZCwKICAgICAgICAgICAgUHJvbjIwMjYgICAgPSBleHAocHJlZGljdChsbShsb2dWYWxvciB+IFRlbmRlbmNpYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShUZW5kZW5jaWE9MTYpKSkpICU+JQogIGFycmFuZ2UoZGVzYyhQcm9uMjAyNikpCgphcy5kYXRhLmZyYW1lKHByb25vc3RpY28pCgojIExhIHN1Yi1jYXRlZ29yw61hIHF1ZSBtw6FzIGNyZWNlIHkgbGEgcXVlIG1lbm9zIGNyZWNlCnByb25vc3RpY29bd2hpY2gubWF4KHByb25vc3RpY28kQ3JlY2ltaWVudG8pLCBdCnByb25vc3RpY29bd2hpY2gubWluKHByb25vc3RpY28kQ3JlY2ltaWVudG8pLCBdCmBgYAoKQ09OQ0xVU0nDk046IEludmVydGlyw61hIGVuIFNraW4gQ2FyZS4gRWwgbWVqb3IgbW9kZWxvIGVzIGVsIGRlIEVmZWN0b3MgQWxlYXRvcmlvcyB5CmRpY2UgcXVlIGVsIG1lcmNhZG8gY29tcGxldG8gY3JlY2UgNi43NCUgYW51YWwsIHBlcm8gYWwgc2FjYXIgbGEgdGFzYSBkZSBjYWRhCnN1Yi1jYXRlZ29yw61hIHNlIHZlIHF1ZSBubyB0b2RhcyB2YW4gYWwgbWlzbW8gcml0bW86IGxhIHF1ZSBtw6FzIGNyZWNlIGVzIFN1biBDYXJlIGNvbgo4Ljg0JSBhbnVhbCB5IGxhIHF1ZSBtZW5vcyBjcmVjZSBlcyBIYWlyIENhcmUgY29uIDUuNDIlLiBMbyBpbXBvcnRhbnRlIGVzIHF1ZSBuaW5ndW5hCmRlIGxhcyBkb3MgZXMgbGEgcmVzcHVlc3RhIGF1dG9tw6F0aWNhLiBFbCBtZXJjYWRvIHF1ZSBtw6FzIGNyZWNlIGVzIHRhbWJpw6luIGVsIHF1ZSBtw6FzCmNvbXBldGVuY2lhIHZhIGEgYXRyYWVyLCBwb3JxdWUgdG9kYXMgbGFzIG1hcmNhcyB2ZW4gZWwgbWlzbW8gY3JlY2ltaWVudG8geSBzZSBtZXRlbjsKeSBlbCBxdWUgbWVub3MgY3JlY2Ugc3VlbGUgc2VyIGVsIHF1ZSBtZW5vcyBjb21wZXRlbmNpYSBudWV2YSB0aWVuZSwgcG9ycXVlIHlhIGVzdMOhCm1hZHVybyB5IG5vIGxlIHJlc3VsdGEgYXRyYWN0aXZvIGEgbmFkaWUuIFN1biBDYXJlIGFkZW3DoXMgZXMgZGltaW51dG8sIDQsNDEzIG1pbGxvbmVzCmNvbnRyYSBsb3MgNTUsMzE4IGRlIEhhaXIgQ2FyZSwgYXPDrSBxdWUgYXVucXVlIGNyZXpjYSBhbCBkb2JsZSBkZSB2ZWxvY2lkYWQgZWwgdm9sdW1lbgphYnNvbHV0byBubyBjb21wZW5zYTogZnVuY2lvbmEgY29tbyBhcHVlc3RhIGRlIG5pY2hvLCBubyBjb21vIGFwdWVzdGEgcHJpbmNpcGFsLiBTa2luCkNhcmUgZXMgZWwgcHVudG8gbWVkaW8gcXVlIHPDrSBjb252aWVuZSwgcG9ycXVlIGNyZWNlIDcuNDQlIGFudWFsLCBjYXNpIHRhbiByw6FwaWRvIGNvbW8KU3VuIENhcmUsIHkgYWwgbWlzbW8gdGllbXBvIGVzIGVsIG1lcmNhZG8gbcOhcyBncmFuZGUgZGUgbG9zIG9jaG8gY29uIDcyLDUyOSBtaWxsb25lcwpwcm9ub3N0aWNhZG9zIHBhcmEgMjAyNi4gRXMgYWRlbcOhcyBlbCBxdWUgbWVqb3Igc2UgYWp1c3RhIGFsIG1vZGVsbywgY29uIHVuIFLCsiBkZQowLjk3MDMsIGFzw60gcXVlIHN1IHByb27Ds3N0aWNvIGVzIGVsIG3DoXMgY29uZmlhYmxlIGRlIHRvZG9zLiBMYSDDum5pY2EgYWR2ZXJ0ZW5jaWEgZXMgcXVlCmVzdGEgYmFzZSBzb2xvIG1pZGUgdGFtYcOxbyBkZSBtZXJjYWRvIHkgbm8gZGljZSBuYWRhIGRlIGN1w6FudG9zIGNvbXBldGlkb3JlcyBoYXkgZW4KY2FkYSBzdWItY2F0ZWdvcsOtYTsgcGFyYSBjZXJyYXIgZWwgYXJndW1lbnRvIGRlIGxhIGNvbXBldGVuY2lhIGhhYnLDrWEgcXVlIGNydXphcmxvIGNvbgpsYSBiYXNlIGRlIENvbXBhbnkgU2hhcmVzLgoKIyBQYXJ0ZSAzLiBCYW5jbyBNdW5kaWFsCgoqKkVzcGVyYW56YSBkZSB2aWRhIGVuIDEyIHBhw61zZXMsIDIwMDAtMjAyMy4qKgoKKipJTlNUUlVDQ0lPTkVTOioqIEltcG9ydGEgZGF0b3MgZGVsIGJhbmNvIG11bmRpYWwgeSBnZW5lcmEgZWwgbWVqb3IgbW9kZWxvLAppbmNsdXllbmRvIHByZWRpY2Npb25lcy4gSW5jbHV5ZSBjb25jbHVzaW9uZXMgeSBncsOhZmljYXMuCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIExhIEFQSSBkZWwgQmFuY28gTXVuZGlhbCByZXNwb25kZSBsZW50YSBkZXNkZSBlc3RhIHJlZCwgcG9yIGVzbyBlbCB0aW1lb3V0IGxhcmdvCm9wdGlvbnModGltZW91dCA9IDYwMCkKCnBhaXNlcyA8LSAiTVg7VVM7Q0E7QlI7Q0w7Q087QVI7UEU7RVM7S1I7SlA7SU4iCgpiYWphIDwtIGZ1bmN0aW9uKGluZGljYWRvcikgewogIHUgPC0gcGFzdGUwKCJodHRwczovL2FwaS53b3JsZGJhbmsub3JnL3YyL2NvdW50cnkvIiwgcGFpc2VzLAogICAgICAgICAgICAgICIvaW5kaWNhdG9yLyIsIGluZGljYWRvciwgIj9mb3JtYXQ9anNvbiZwZXJfcGFnZT0yMDAwJmRhdGU9MjAwMDoyMDIzIikKICBkIDwtIGZyb21KU09OKHUpW1syXV0KICBkYXRhLmZyYW1lKFBhaXMgPSBkJGNvdW50cnkkdmFsdWUsIEFuaW8gPSBhcy5udW1lcmljKGQkZGF0ZSksIFZhbG9yID0gZCR2YWx1ZSkKfQoKIyBMYSBkZXNjYXJnYSB0YXJkYSB2YXJpb3MgbWludXRvcywgcG9yIGVzbyBzZSBndWFyZGEgeSBubyBzZSB2dWVsdmUgYSBiYWphcgppZiAoZmlsZS5leGlzdHMoIndkaS5yZHMiKSkgewogIHdkaSA8LSByZWFkUkRTKCJ3ZGkucmRzIikKfSBlbHNlIHsKICBlc3BlcmFuemEgIDwtIGJhamEoIlNQLkRZTi5MRTAwLklOIikgICAgICMgZXNwZXJhbnphIGRlIHZpZGEgYWwgbmFjZXIKICBwaWIgICAgICAgIDwtIGJhamEoIk5ZLkdEUC5QQ0FQLkNEIikgICAgICMgUElCIHBlciBjw6FwaXRhCiAgc2FsdWQgICAgICA8LSBiYWphKCJTSC5YUEQuQ0hFWC5HRC5aUyIpICAjIGdhc3RvIGVuIHNhbHVkICUgZGVsIFBJQgogIHVyYmFuYSAgICAgPC0gYmFqYSgiU1AuVVJCLlRPVEwuSU4uWlMiKSAgIyBwb2JsYWNpw7NuIHVyYmFuYSAlCiAgZmVydGlsaWRhZCA8LSBiYWphKCJTUC5EWU4uVEZSVC5JTiIpICAgICAjIGhpam9zIHBvciBtdWplcgoKICB3ZGkgPC0gZXNwZXJhbnphICU+JQogICAgcmVuYW1lKEVzcGVyYW56YSA9IFZhbG9yKSAlPiUKICAgIGxlZnRfam9pbihyZW5hbWUocGliLCAgICAgICAgUElCICAgICAgICA9IFZhbG9yKSwgYnk9YygiUGFpcyIsIkFuaW8iKSkgJT4lCiAgICBsZWZ0X2pvaW4ocmVuYW1lKHNhbHVkLCAgICAgIFNhbHVkICAgICAgPSBWYWxvciksIGJ5PWMoIlBhaXMiLCJBbmlvIikpICU+JQogICAgbGVmdF9qb2luKHJlbmFtZSh1cmJhbmEsICAgICBVcmJhbmEgICAgID0gVmFsb3IpLCBieT1jKCJQYWlzIiwiQW5pbyIpKSAlPiUKICAgIGxlZnRfam9pbihyZW5hbWUoZmVydGlsaWRhZCwgRmVydGlsaWRhZCA9IFZhbG9yKSwgYnk9YygiUGFpcyIsIkFuaW8iKSkgJT4lCiAgICBtdXRhdGUoUElCID0gUElCLzEwMDApICU+JSAgICAgICAgICAjIFBJQiBwZXIgY8OhcGl0YSBlbiBtaWxlcyBkZSBVU0QKICAgIG5hLm9taXQoKQoKICBzYXZlUkRTKHdkaSwgIndkaS5yZHMiKQp9CgpoZWFkKHdkaSkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQojIFBydWViYSBkZSBIZXRlcm9nZW5laWRhZApwYXIobWFyPWMoOCw1LDMsMSkpCnBsb3RtZWFucyhFc3BlcmFuemEgfiBQYWlzLCBkYXRhPXdkaSwgbGFzPTIsIGNvbm5lY3Q9RkFMU0UsIHhsYWI9IiIsIHlsYWI9IkHDsW9zIikKCiMgR3LDoWZpY2EgZGUgaW5ncmVzbyBjb250cmEgZXNwZXJhbnphIGRlIHZpZGEKcGxvdCh3ZGkkUElCLCB3ZGkkRXNwZXJhbnphLAogICAgIHhsYWI9IlBJQiBwZXIgY8OhcGl0YSAobWlsZXMgZGUgVVNEKSIsIHlsYWI9IkVzcGVyYW56YSBkZSB2aWRhIChhw7FvcykiLAogICAgIHBjaD0xOSwgY29sPSJncmV5NDAiKQphYmxpbmUobG0oRXNwZXJhbnphIH4gUElCLCBkYXRhPXdkaSksIGNvbD0icmVkIiwgbHdkPTIpCgp3ZGkgPC0gcGRhdGEuZnJhbWUod2RpLCBpbmRleCA9IGMoIlBhaXMiLCJBbmlvIikpCgojIE9wY2nDs24gMSAtIE1vZGVsbyBkZSBSZWdyZXNpw7NuIEFncnVwYWRhIChQb29sZWQpCnBvb2xlZDMgPC0gcGxtKEVzcGVyYW56YSB+IFBJQiArIFNhbHVkICsgVXJiYW5hICsgRmVydGlsaWRhZCwgZGF0YT13ZGksIG1vZGVsPSJwb29saW5nIikKc3VtbWFyeShwb29sZWQzKQoKIyBPcGNpw7NuIDIgLSBNb2RlbG8gZGUgRWZlY3RvcyBGaWpvcyAoV2l0aGluKQp3aXRoaW4zIDwtIHBsbShFc3BlcmFuemEgfiBQSUIgKyBTYWx1ZCArIFVyYmFuYSArIEZlcnRpbGlkYWQsIGRhdGE9d2RpLCBtb2RlbD0id2l0aGluIikKc3VtbWFyeSh3aXRoaW4zKQoKIyBQcnVlYmEgRgpwRnRlc3Qod2l0aGluMyxwb29sZWQzKQoKIyBPcGNpw7NuIDMgLSBNb2RlbG8gZGUgRWZlY3RvcyBBbGVhdG9yaW9zIChSYW5kb20pCnJhbmRvbTMgPC0gcGxtKEVzcGVyYW56YSB+IFBJQiArIFNhbHVkICsgVXJiYW5hICsgRmVydGlsaWRhZCwgZGF0YT13ZGksIG1vZGVsPSJyYW5kb20iKQpzdW1tYXJ5KHJhbmRvbTMpCgojIFBydWViYSBkZSBIYXVzbWFuCnBodGVzdChyYW5kb20zLHdpdGhpbjMpCgojIFBvciBsbyB0YW50bywgZWwgbWVqb3IgbW9kZWxvIHBhcmEgZXN0ZSBwYW5lbCBlcyBlbCBkZSBFRkVDVE9TIEZJSk9TLgpgYGAKCioqUHJvbsOzc3RpY286KiogZXNwZXJhbnphIGRlIHZpZGEgZGUgY2FkYSBwYcOtcyBzaSBzdSBQSUIgcGVyIGPDoXBpdGEgc3ViZSAxMCUuCgpgYGB7cn0Kd2RpMiA8LSBhcy5kYXRhLmZyYW1lKHdkaSkKd2RpMiRQYWlzIDwtIGFzLmNoYXJhY3Rlcih3ZGkyJFBhaXMpCndkaTIkQW5pbyA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih3ZGkyJEFuaW8pKQoKd2RpX3Byb25vc3RpY28gPC0gd2RpMlt3ZGkyJEFuaW8gPT0gbWF4KHdkaTIkQW5pbyksIF0KCmludGVyY2VwdG8zIDwtIGZpeGVmKHdpdGhpbjMpCnBlbmRpZW50ZTMgIDwtIGNvZWYod2l0aGluMykKCndkaV9wcm9ub3N0aWNvJEFqdXN0YWRvIDwtIGludGVyY2VwdG8zW3dkaV9wcm9ub3N0aWNvJFBhaXNdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlM1siUElCIl0qd2RpX3Byb25vc3RpY28kUElCICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlM1siU2FsdWQiXSp3ZGlfcHJvbm9zdGljbyRTYWx1ZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpZW50ZTNbIlVyYmFuYSJdKndkaV9wcm9ub3N0aWNvJFVyYmFuYSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpZW50ZTNbIkZlcnRpbGlkYWQiXSp3ZGlfcHJvbm9zdGljbyRGZXJ0aWxpZGFkCgp3ZGlfcHJvbm9zdGljbyRQcm9ub3N0aWNvIDwtIGludGVyY2VwdG8zW3dkaV9wcm9ub3N0aWNvJFBhaXNdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaWVudGUzWyJQSUIiXSp3ZGlfcHJvbm9zdGljbyRQSUIqMS4xMCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlM1siU2FsdWQiXSp3ZGlfcHJvbm9zdGljbyRTYWx1ZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGllbnRlM1siVXJiYW5hIl0qd2RpX3Byb25vc3RpY28kVXJiYW5hICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaWVudGUzWyJGZXJ0aWxpZGFkIl0qd2RpX3Byb25vc3RpY28kRmVydGlsaWRhZAoKd2RpX3Byb25vc3RpY29bLGMoIlBhaXMiLCJFc3BlcmFuemEiLCJBanVzdGFkbyIsIlByb25vc3RpY28iKV0KYGBgCgpDT05DTFVTScOTTjogRWwgbWVqb3IgbW9kZWxvIHBhcmEgZXN0ZSBwYW5lbCBlcyBlbCBkZSBFZmVjdG9zIEZpam9zLiBMYSBwcnVlYmEgRgpkZXNjYXJ0YSBlbCBtb2RlbG8gYWdydXBhZG8geSBsYSBkZSBIYXVzbWFuIGRhIHVuIHAgZGUgNi45ZS0wNywgYXPDrSBxdWUgc2UgcXVlZGEgY29uCmVmZWN0b3MgZmlqb3MuIEVsIG1vZGVsbyBleHBsaWNhIGVsIDU4LjE3JSBkZSBsYSB2YXJpYWNpw7NuIGRlbnRybyBkZSBjYWRhIHBhw61zIHkgc2FsZW4Kc2lnbmlmaWNhdGl2YXMgdHJlcyBkZSBsYXMgY3VhdHJvIHZhcmlhYmxlczogcG9yIGNhZGEgMSwwMDAgZMOzbGFyZXMgbcOhcyBkZSBQSUIgcGVyCmPDoXBpdGEgbGEgZXNwZXJhbnphIGRlIHZpZGEgc3ViZSAwLjA2OSBhw7FvcywgcG9yIGNhZGEgcHVudG8gcG9yY2VudHVhbCBtw6FzIGRlIHBvYmxhY2nDs24KdXJiYW5hIHN1YmUgMC4zMzkgYcOxb3MsIHkgcG9yIGNhZGEgaGlqbyBtw6FzIHBvciBtdWplciBiYWphIDIuMzAzIGHDsW9zLiBFbCBnYXN0byBlbgpzYWx1ZCBjb21vIHBvcmNlbnRhamUgZGVsIFBJQiBubyByZXN1bHRhIHNpZ25pZmljYXRpdm8sIGxvIGN1YWwgdGllbmUgc2VudGlkbyBwb3JxdWUKZ2FzdGFyIG3DoXMgbm8gZ2FyYW50aXphIGdhc3RhciBiaWVuLiBFbCBwcm9uw7NzdGljbyBkZWphIHZlciBxdWUgZWwgaW5ncmVzbyBtdWV2ZSBtdXkKcG9jbyBsYSBhZ3VqYTogc3ViaXIgMTAlIGVsIFBJQiBwZXIgY8OhcGl0YSBsZSBzdW1hIGEgTcOpeGljbyBtZW5vcyBkZSB1bmEgZMOpY2ltYSBkZSBhw7FvCihkZSA3NS41MiBhIDc1LjYxKSB5IGFsIHBhw61zIHF1ZSBtw6FzIGxlIHN1YmUsIEVzdGFkb3MgVW5pZG9zLCBhcGVuYXMgbGUgYWdyZWdhIG1lZGlvCmHDsW8uIExhIGdyw6FmaWNhIGRlCmRpc3BlcnNpw7NuIGV4cGxpY2EgcG9yIHF1w6ksIHBvcnF1ZSBsYSByZWxhY2nDs24gZW50cmUgaW5ncmVzbyB5IGVzcGVyYW56YSBkZSB2aWRhIG5vIGVzCnVuYSByZWN0YTogbG9zIHByaW1lcm9zIG1pbGVzIGRlIGTDs2xhcmVzIHN1bWFuIG11Y2hvcyBhw7FvcyB5IGRlc3B1w6lzIGVsIGVmZWN0byBzZQphcGxhbmEuIENvbXBhcmFuZG8gbGEgY29sdW1uYSBBanVzdGFkbyBjb24gbGEgb2JzZXJ2YWRhIHNlIHZlIHF1ZSBlbCBtb2RlbG8gbGUgYXRpbmEKYmllbiBhIHBhw61zZXMgY29tbyBDaGlsZSB5IEphcMOzbiB5IHNlIGVxdWl2b2NhIHBvciBtw6FzIGRlIGRvcyBhw7FvcyBlbiBFc3RhZG9zIFVuaWRvcywKYXPDrSBxdWUgbG9zIHByb27Ds3N0aWNvcyBzaXJ2ZW4gcGFyYSBjb21wYXJhciB0ZW5kZW5jaWFzIGVudHJlIHBhw61zZXMgcGVybyBubyBwYXJhCnByZWRlY2lyIGxhIGVzcGVyYW56YSBkZSB2aWRhIGV4YWN0YSBkZSB1bm8gc29sby4K