Repaso

Cargando datos

Abrir la base de datos de los candidatos presidenciales en América Latina desde el 2000 hasta el 2018.

library(rio)
cand = import("Numeric_election_DATOS.xlsx")

Manipulando datos

  • Factorizar la variable sexo del candidato
library(dplyr)
cand = cand %>%
  mutate(sexo = factor(csex, labels=c("Hombre", "Mujer")))
  • Crear una variable de grupos de edad, sobre la base de la edad (variable “cage”).

  • Para esto es necesario revisar la distribución de la variable

table(cand$cage)
## 
## 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 
##  1  1  4  4  3  3  2  5  3  1 10  6 10 12 11 12 15 21 15 14 15 17 23 15 15 14 
## 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 80 
## 13 17 14 10 11 15  8 12  5  9  9  5  6  2  5  2  2  2  1  1  2
  • Vemos que hay candidatos desde los 33 hasta los 80 años. Se puede pensar en crear grupos basados en décadas. El último grupo puede ser de 70 a más.

  • Esto se puede hacer de múltiples maneras, usando el comando case_when.

cand = cand %>%
  mutate(gedad = case_when(
    cage == 33 ~ 1, cage == 34 ~ 1, cage == 35 ~ 1, cage == 36 ~ 1, cage == 37 ~ 1,
    cage == 38 ~ 1, cage == 39 ~ 1))
cand = cand %>%
  mutate(gedad = case_when(
    cage <= 39 ~ 1,
    (cage >= 40) & (cage <=49) ~ 2,
    (cage >= 50) & (cage <=59) ~ 3,
    (cage >= 60) & (cage <=69) ~ 4,
    cage >= 70 ~ 5,
  ))
cand = cand %>%
  mutate(gedad2 = case_when(
    cage <= 39 ~ 1,
    cage %in% 40:49 ~ 2,
    cage %in% 50:59 ~ 3,
    cage %in% 60:69 ~ 4,
    cage %in% 70:80 ~ 5
    ))
cand = cand %>%
  mutate(gedad2 = factor(gedad2, labels=c("30-39", "40-49", "50-59", "60-69", "70+")))
  • La variable que recoge el voto en primera vuelta está en forma de proporción y no de porcentaje. Vamos a transformarla en porcentaje.
cand = cand %>%
  mutate(voto1 = v2porcvalido_1ra)

Descriptivos univariados

  • ¿Qué proporción de candidatos en América Latina son hombres y mujeres?
tabla1 = cand %>%
  count(Sexo = sexo, name="Frecuencia") %>%
  mutate(Porcentaje = (Frecuencia / sum(Frecuencia)*100 ))
tabla1
##     Sexo Frecuencia Porcentaje
## 1 Hombre        367    87.1734
## 2  Mujer         54    12.8266
  • Visualización de una tabla de frecuencias.
library(ggplot2)
ggplot(tabla1, aes(x=Sexo,y=Porcentaje))+
  geom_bar(stat="identity", width=0.5)

  • ¿Cuál es el promedio de edad de los candidatos presidenciales en América Latina?
tabla2 = cand %>%
  summarise(minimo = min(cage, na.rm = T), media = mean(cage, na.rm = T), 
            mediana = median(cage, na.rm = T),maximo = max(cage, na.rm = T), 
            desviacion = sd(cage, na.rm = T))
tabla2
##   minimo    media mediana maximo desviacion
## 1     33 55.62035      55     80   9.265959
  • Visualización de una variable numérica
ggplot(cand, aes(x=cage))+
  geom_histogram(binwidth = 2)+
  geom_vline(xintercept = 55.6, color = "red")+
  xlab("Edad de los candidatos")+
  ylab("Frecuencia")+
  theme_classic()
## Warning: Removed 18 rows containing
## non-finite outside the scale
## range (`stat_bin()`).

  • ¿Cuál es el promedio de votos obtenidos por candidatos presidenciales en América Latina?
tabla3 = cand %>%
  summarise(minimo = min(voto1, na.rm = T), media = mean(voto1, na.rm = T), 
            mediana = median(voto1, na.rm = T),maximo = max(voto1, na.rm = T), 
            desviacion = sd(voto1, na.rm = T))
tabla3
##   minimo    media mediana maximo desviacion
## 1   0.01 15.40017   6.585  72.44   17.31102
ggplot(cand, aes(x=voto1))+
  geom_histogram(binwidth = 5)+
  geom_vline(xintercept = 15.4, color = "red")+
  geom_vline(xintercept = 6.6, color = "green")+
  xlab("Voto de los candidatos")+
  ylab("Frecuencia")+
  theme_classic()
## Warning: Removed 7 rows containing
## non-finite outside the scale
## range (`stat_bin()`).

  • Cuál es la ideología promedio de los candidatos presidenciales en América Latina?
tabla.ideo = cand %>%
  summarise(minimo = min(v2ideology_core, na.rm = T), 
            media = mean(v2ideology_core, na.rm = T), 
            mediana = median(v2ideology_core, na.rm = T),
            maximo = max(v2ideology_core, na.rm = T), 
            desviacion = sd(v2ideology_core, na.rm = T))
tabla.ideo
##   minimo    media mediana maximo desviacion
## 1    1.6 11.17832    11.6     19   4.855254
  • Graficar
ggplot(cand, aes(x=v2ideology_core))+
  geom_histogram(binwidth = 2)+
  geom_vline(xintercept = 11.2, color = "red")+
  xlab("Ideología de los candidatos")+
  ylab("Frecuencia")+
  theme_classic()
## Warning: Removed 47 rows containing
## non-finite outside the scale
## range (`stat_bin()`).

Comparación entre grupos

  • ¿Los candidatos hombres logran más votos que las candidatas mujeres en las primeras vueltas en América Latina?
library(lsr)
votoxsexo = cand %>% 
  group_by(Sexo = sexo) |>
  summarize(Minimo = min(voto1, na.rm = T),
            Media = mean(voto1, na.rm = T),
            Maximo = max(voto1, na.rm = T),
            Desv.Std = sd(voto1, na.rm = T),
            Limite.inf = ciMean(voto1, na.rm=T)[1],
            Limite.sup = ciMean(voto1, na.rm=T)[2])
votoxsexo
## # A tibble: 2 × 7
##   Sexo   Minimo Media Maximo Desv.Std Limite.inf Limite.sup
##   <fct>   <dbl> <dbl>  <dbl>    <dbl>      <dbl>      <dbl>
## 1 Hombre   0.01  15.4   72.4     17.6       13.6       17.2
## 2 Mujer    0.02  15.5   48.0     15.7       11.2       19.7
  • Graficar la comparación
library(ggplot2)
graf1 = ggplot(votoxsexo, aes(x=Sexo, y=Media))+
  geom_bar(stat="identity")+
  geom_errorbar(aes(ymin=Limite.inf, ymax=Limite.sup), width=0.2)+
  geom_text(aes(label=paste(round(Media, 1))), vjust=-1, size=4)+
  xlab("Sexo del candidato") + ylab("Votos obtenidos")+
  ylim(0, 20)
graf1

  • ¿Quiénes obtienen más votos en promedio, los candidatos jóvenes o los mayores?
votoxedad = cand %>% 
  group_by(Edad = gedad2) |>
  summarize(Minimo = min(voto1, na.rm = T),
            Media = mean(voto1, na.rm = T),
            Maximo = max(voto1, na.rm = T),
            Desv.Std = sd(voto1, na.rm = T),
            Limite.inf = ciMean(voto1, na.rm=T)[1],
            Limite.sup = ciMean(voto1, na.rm=T)[2])
votoxedad
## # A tibble: 6 × 7
##   Edad  Minimo Media Maximo Desv.Std Limite.inf Limite.sup
##   <fct>  <dbl> <dbl>  <dbl>    <dbl>      <dbl>      <dbl>
## 1 30-39   0.08  8.56   23.6     8.92      4.12       13.0 
## 2 40-49   0.01 16.3    57.2    16.5      12.6        19.9 
## 3 50-59   0.02 15.2    64.2    17.1      12.6        17.9 
## 4 60-69   0.02 17.2    62.5    18.4      13.7        20.7 
## 5 70+     0.06 18.6    72.4    21.2      10.4        26.9 
## 6 <NA>    0.01  3.75   30.6     8.38     -0.415       7.92

La fila de NA se puede eliminar en la table o se puede filtrar en el código con filter.

  • Graficar comparación entre varios grupos
graf1 = ggplot(votoxedad, aes(x=Edad, y=Media))+
  geom_bar(stat="identity")+
  geom_errorbar(aes(ymin=Limite.inf, ymax=Limite.sup), width=0.2)+
  geom_text(aes(label=paste(round(Media, 1))), vjust=-1, size=4)+
  xlab("Edad del candidato") + ylab("Votos obtenidos")+
  ylim(0, 30)
graf1

  • Y qué pasa en las segundas vueltas? Cuántas mujeres llegan?
cand = cand %>%
  mutate(voto2 = v2porcval_2da)
tabla4 = cand %>%
  filter(v2candseg==1) %>% 
  count(Sexo = sexo, name="Frecuencia") %>%
  mutate(Porcentaje = (Frecuencia / sum(Frecuencia)*100 ))
tabla4
##     Sexo Frecuencia Porcentaje
## 1 Hombre         48   85.71429
## 2  Mujer          8   14.28571
  • Qué porcentaje de votos obtienen?
voto2daxsexo = cand %>% 
  filter(v2candseg==1) %>% 
  group_by(Sexo = sexo) %>%
  summarize(Minimo = min(voto2, na.rm = T),
            Media = mean(voto2, na.rm = T),
            Maximo = max(voto2, na.rm = T),
            Desv.Std = sd(voto2, na.rm = T),
            Limite.inf = ciMean(voto2, na.rm=T)[1],
            Limite.sup = ciMean(voto2, na.rm=T)[2])
voto2daxsexo
## # A tibble: 2 × 7
##   Sexo   Minimo Media Maximo Desv.Std Limite.inf Limite.sup
##   <fct>   <dbl> <dbl>  <dbl>    <dbl>      <dbl>      <dbl>
## 1 Hombre    0    49.2   77.8     11.8       45.8       52.6
## 2 Mujer    31.3  46.1   62.2     11.4       36.7       55.6

Inferencia

Pruebas de significancia

  • Realizar una prueba para poner a prueba la comparación entre grupos
library(DescTools)
## 
## Attaching package: 'DescTools'
## The following object is masked from 'package:jtools':
## 
##     %nin%
LeveneTest(cand$voto1, cand$sexo)
## Levene's Test for Homogeneity of Variance (center = median)
##        Df F value Pr(>F)
## group   1  0.1651 0.6848
##       412
t.test(cand$voto1 ~ cand$sexo, var.equal=T)
## 
##  Two Sample t-test
## 
## data:  cand$voto1 by cand$sexo
## t = -0.023078, df = 412, p-value = 0.9816
## alternative hypothesis: true difference in means between group Hombre and group Mujer is not equal to 0
## 95 percent confidence interval:
##  -5.030318  4.913577
## sample estimates:
## mean in group Hombre  mean in group Mujer 
##             15.39256             15.45093
anova = aov(cand$voto1 ~ cand$gedad2)
summary(anova)
##              Df Sum Sq Mean Sq F value Pr(>F)
## cand$gedad2   4   1454   363.5   1.199  0.311
## Residuals   391 118563   303.2               
## 25 observations deleted due to missingness

Correlación

  • Presentar gráfico de dispersión del voto a candidato por edad
ggplot(cand, aes(x=cage, y=voto1))+
  geom_point()+
  geom_smooth(method=lm, se=F)+ #agregar línea de tendencia
  labs(x="Edad", 
       y="Voto en 1era vuelta")+ #para etiquetar los ejes
  theme_light()
## `geom_smooth()` using formula =
## 'y ~ x'
## Warning: Removed 25 rows containing
## non-finite outside the scale
## range (`stat_smooth()`).
## Warning: Removed 25 rows containing
## missing values or values
## outside the scale range
## (`geom_point()`).

Regresión lineal simple

  • Realizar un modelo de alguno de los gráficos de dispersión
modelo1 = lm(cand$voto1 ~ cand$cage)
summary(modelo1)
## 
## Call:
## lm(formula = cand$voto1 ~ cand$cage)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -18.937 -14.084  -8.026  11.134  54.068 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  7.04666    5.32474   1.323   0.1865  
## cand$cage    0.15951    0.09432   1.691   0.0916 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17.39 on 394 degrees of freedom
##   (25 observations deleted due to missingness)
## Multiple R-squared:  0.007207,   Adjusted R-squared:  0.004687 
## F-statistic:  2.86 on 1 and 394 DF,  p-value: 0.09159
modelo2 = lm(cand$voto2 ~ cand$cage)
summary(modelo2)
## 
## Call:
## lm(formula = cand$voto2 ~ cand$cage)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.702 -7.450 -6.584 -5.776 70.945 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.46336    5.31760   0.087    0.931
## cand$cage    0.11548    0.09431   1.225    0.221
## 
## Residual standard error: 17.52 on 401 degrees of freedom
##   (18 observations deleted due to missingness)
## Multiple R-squared:  0.003725,   Adjusted R-squared:  0.001241 
## F-statistic: 1.499 on 1 and 401 DF,  p-value: 0.2215
cand = cand |>
  mutate(mujer = ifelse(csex==2, 1, 0))
modelo3 = lm(cand$voto1 ~ cand$mujer)
summary(modelo3)
## 
## Call:
## lm(formula = cand$voto1 ~ cand$mujer)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -15.431 -14.093  -8.808  11.000  57.047 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 15.39256    0.91348  16.851   <2e-16 ***
## cand$mujer   0.05837    2.52930   0.023    0.982    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17.33 on 412 degrees of freedom
##   (7 observations deleted due to missingness)
## Multiple R-squared:  1.293e-06,  Adjusted R-squared:  -0.002426 
## F-statistic: 0.0005326 on 1 and 412 DF,  p-value: 0.9816

Regresión lineal múltiple

  • Seguir con el modelo simple, ahora introduciendo controles
modelo4 = lm(cand$voto1 ~ cand$cage + cand$mujer + cand$v2ideology_core)
summary(modelo4)
## 
## Call:
## lm(formula = cand$voto1 ~ cand$cage + cand$mujer + cand$v2ideology_core)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -18.51 -14.72  -8.25  11.76  54.51 
## 
## Coefficients:
##                      Estimate Std. Error t value Pr(>|t|)
## (Intercept)           9.27698    6.44883   1.439    0.151
## cand$cage             0.11079    0.10535   1.052    0.294
## cand$mujer            0.36659    2.83186   0.129    0.897
## cand$v2ideology_core  0.09218    0.19693   0.468    0.640
## 
## Residual standard error: 17.79 on 352 degrees of freedom
##   (65 observations deleted due to missingness)
## Multiple R-squared:  0.003757,   Adjusted R-squared:  -0.004733 
## F-statistic: 0.4425 on 3 and 352 DF,  p-value: 0.7227
ggplot(cand, aes(x=cage, y=voto1))+
  geom_point()+
  geom_smooth(method=lm, se=F)+ #agregar línea de tendencia
  labs(x="Edad", 
       y="Voto en 1era vuelta")+ #para etiquetar los ejes
  facet_wrap(~ mujer) 
## `geom_smooth()` using formula =
## 'y ~ x'
## Warning: Removed 25 rows containing
## non-finite outside the scale
## range (`stat_smooth()`).
## Warning: Removed 25 rows containing
## missing values or values
## outside the scale range
## (`geom_point()`).

  theme_light()
## List of 136
##  $ line                            :List of 6
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                            :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ linewidth    : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                            :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                           : NULL
##  $ aspect.ratio                    : NULL
##  $ axis.title                      : NULL
##  $ axis.title.x                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom             : NULL
##  $ axis.title.y                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left               : NULL
##  $ axis.title.y.right              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                       :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom              : NULL
##  $ axis.text.y                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left                : NULL
##  $ axis.text.y.right               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.theta                 : NULL
##  $ axis.text.r                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0.5
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                      :List of 6
##   ..$ colour       : chr "grey70"
##   ..$ linewidth    : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ axis.ticks.x                    : NULL
##  $ axis.ticks.x.top                : NULL
##  $ axis.ticks.x.bottom             : NULL
##  $ axis.ticks.y                    : NULL
##  $ axis.ticks.y.left               : NULL
##  $ axis.ticks.y.right              : NULL
##  $ axis.ticks.theta                : NULL
##  $ axis.ticks.r                    : NULL
##  $ axis.minor.ticks.x.top          : NULL
##  $ axis.minor.ticks.x.bottom       : NULL
##  $ axis.minor.ticks.y.left         : NULL
##  $ axis.minor.ticks.y.right        : NULL
##  $ axis.minor.ticks.theta          : NULL
##  $ axis.minor.ticks.r              : NULL
##  $ axis.ticks.length               : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x             : NULL
##  $ axis.ticks.length.x.top         : NULL
##  $ axis.ticks.length.x.bottom      : NULL
##  $ axis.ticks.length.y             : NULL
##  $ axis.ticks.length.y.left        : NULL
##  $ axis.ticks.length.y.right       : NULL
##  $ axis.ticks.length.theta         : NULL
##  $ axis.ticks.length.r             : NULL
##  $ axis.minor.ticks.length         : 'rel' num 0.75
##  $ axis.minor.ticks.length.x       : NULL
##  $ axis.minor.ticks.length.x.top   : NULL
##  $ axis.minor.ticks.length.x.bottom: NULL
##  $ axis.minor.ticks.length.y       : NULL
##  $ axis.minor.ticks.length.y.left  : NULL
##  $ axis.minor.ticks.length.y.right : NULL
##  $ axis.minor.ticks.length.theta   : NULL
##  $ axis.minor.ticks.length.r       : NULL
##  $ axis.line                       : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x                     : NULL
##  $ axis.line.x.top                 : NULL
##  $ axis.line.x.bottom              : NULL
##  $ axis.line.y                     : NULL
##  $ axis.line.y.left                : NULL
##  $ axis.line.y.right               : NULL
##  $ axis.line.theta                 : NULL
##  $ axis.line.r                     : NULL
##  $ legend.background               :List of 5
##   ..$ fill         : NULL
##   ..$ colour       : logi NA
##   ..$ linewidth    : NULL
##   ..$ linetype     : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ legend.margin                   : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing                  : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x                : NULL
##  $ legend.spacing.y                : NULL
##  $ legend.key                      : NULL
##  $ legend.key.size                 : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height               : NULL
##  $ legend.key.width                : NULL
##  $ legend.key.spacing              : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.key.spacing.x            : NULL
##  $ legend.key.spacing.y            : NULL
##  $ legend.frame                    : NULL
##  $ legend.ticks                    : NULL
##  $ legend.ticks.length             : 'rel' num 0.2
##  $ legend.axis.line                : NULL
##  $ legend.text                     :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.position            : NULL
##  $ legend.title                    :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.position           : NULL
##  $ legend.position                 : chr "right"
##  $ legend.position.inside          : NULL
##  $ legend.direction                : NULL
##  $ legend.byrow                    : NULL
##  $ legend.justification            : chr "center"
##  $ legend.justification.top        : NULL
##  $ legend.justification.bottom     : NULL
##  $ legend.justification.left       : NULL
##  $ legend.justification.right      : NULL
##  $ legend.justification.inside     : NULL
##  $ legend.location                 : NULL
##  $ legend.box                      : NULL
##  $ legend.box.just                 : NULL
##  $ legend.box.margin               : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing              : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##   [list output truncated]
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE
modelo5 = lm(cand$voto2 ~ cand$cage + cand$mujer)
summary(modelo5)
## 
## Call:
## lm(formula = cand$voto2 ~ cand$cage + cand$mujer)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.698 -7.451 -6.623 -5.677 71.018 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)
## (Intercept)  0.23620    5.43395   0.043    0.965
## cand$cage    0.11828    0.09537   1.240    0.216
## cand$mujer   0.54532    2.61140   0.209    0.835
## 
## Residual standard error: 17.54 on 400 degrees of freedom
##   (18 observations deleted due to missingness)
## Multiple R-squared:  0.003834,   Adjusted R-squared:  -0.001147 
## F-statistic: 0.7697 on 2 and 400 DF,  p-value: 0.4638

Hacia el próximo ciclo1

El método de regresión lineal multivariado debe cumplir unos requisitos que no se verán en este curso. Estos requisitos son:

  • Linealidad: que la relación entre las variables sea lineal.

  • Multicolinealidad: los predictores no deben “medir” el mismo concepto. Es decir, variables independientes no deben tener una alta correlación.

  • Heterocedasticidad: los errores deben ser aleatorios y no ser sistemáticos. Si los errores tiene una relación sistemática con los valores de la variable dependiente, se habla de heterocedasticidad.

  • Autocorrelación: en particular cuando se trabaja con una variable temporal. Se dice que hay autocorrelación cuando el valor en t+1 depende del valor de t.

Estos requisitos se verán en el curso de Estadística 2.

Otro tema que se verá en el siguiente curso es el modelo que se usa cuando la variable dependiente no es una numérica, sino una variable dicotómica. Cuando tenemos esta variable dependiente se usa un modelo de regresión logística.

Resumen

En esta sección presentamos un mapa de temas que hemos visto a lo largo de todo el semestre. Como se ve en el esquema, las herramientas que hemos visto en el curso dependen de un punto de partida inicial, que es la distinción entre tipos de variables: cualitativas o categóricas y cuantitativas o numéricas. Dependiendo de esta categorización, se desprende el tipo de análisis descriptivo, tanto de la tendencia central, como de la dispersión, así como las formas de graficar estas variables.

Como paso previo a la inferencia, se construyeron intervalos de confianza de la media (variables cuantitavitas) o de proporciones (variables cualitativas). Se analizó que se podían construir intervalos de confianza de medias o proporciones para grupos. Este es el primer paso de la inferencia. Se evaluó si los intervalos de confianza se traslapaban o no. Esto daba paso al análisis bivariado en la segunda parte del curso.

En el libro de Ritchey se muestra este árbol de decisión. La rama derecha de “Dos muestras o dos variables” muestra el resumen de la segunda parte de este curso. Esta segunda parte ha estado dedicada a la inferencia en el análisis bivariado. Como hemos avanzado en este curso, se ha presentado la prueba de inferencia t, la prueba F de ANOVA, la prueba de chi-cuadrado y la regresión bivariada. Luego, se dio el paso al análisis multivariado.

Finalmente, el objetivo de este curso es presentar herramientas iniciales para el análisis de datos sociales. Se espera que luego de este curso los alumnos sean consumidores o productores capaces de estadística. Como consumidores, los alumnos van a estar expuestos a literatura especializada que use métodos estadísticos. Las herramientas vistas en este curso permitirían que los alumnos puedan evaluar estos artículos y los hallazgos de manera crítica.

Como productores, se espera que los alumnos utilicen evidencia numérica y análisis estadístico en sus trabajos de cursos y en sus tesis de pregrado. Ya sea para presentar análisis descriptivo o para realizar análisis inferencial, los alumnos deberían estar en la capacidad de recoger datos numéricos y trabajar con estos usando técnicas vistas en este curso. Es completamente válido que los alumnos usen otros métodos, por ejemplo cualitativos, pero si este curso y el siguiente logran que algunos de ustedes se “atrevan” a usar métodos cuantitativos, ese será el mayor logro de este curso. Gracias!!!


  1. Si aprueban↩︎

LS0tCnRpdGxlOiAiQ2xhc2UgMTQiCmF1dGhvcjogIkFydHVybyBNYWxkb25hZG8iCmRhdGU6ICIyNi8xMi8yMDI0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICB0b2NfZGVwdGg6IDEKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBjb3NtbwogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IHNlbnRlbmNlCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgKipSZXBhc28qKgoKIyBDYXJnYW5kbyBkYXRvcwoKQWJyaXIgbGEgYmFzZSBkZSBkYXRvcyBkZSBsb3MgY2FuZGlkYXRvcyBwcmVzaWRlbmNpYWxlcyBlbiBBbcOpcmljYSBMYXRpbmEgZGVzZGUgZWwgMjAwMCBoYXN0YSBlbCAyMDE4LgoKYGBge3IgYmFzZX0KbGlicmFyeShyaW8pCmNhbmQgPSBpbXBvcnQoIk51bWVyaWNfZWxlY3Rpb25fREFUT1MueGxzeCIpCmBgYAoKIyBNYW5pcHVsYW5kbyBkYXRvcwoKLSAgIEZhY3Rvcml6YXIgbGEgdmFyaWFibGUgc2V4byBkZWwgY2FuZGlkYXRvCgpgYGB7cn0KbGlicmFyeShkcGx5cikKY2FuZCA9IGNhbmQgJT4lCiAgbXV0YXRlKHNleG8gPSBmYWN0b3IoY3NleCwgbGFiZWxzPWMoIkhvbWJyZSIsICJNdWplciIpKSkKYGBgCgotICAgQ3JlYXIgdW5hIHZhcmlhYmxlIGRlIGdydXBvcyBkZSBlZGFkLCBzb2JyZSBsYSBiYXNlIGRlIGxhIGVkYWQgKHZhcmlhYmxlICJjYWdlIikuCgotICAgUGFyYSBlc3RvIGVzIG5lY2VzYXJpbyByZXZpc2FyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGEgdmFyaWFibGUKCmBgYHtyIGVkYWR9CnRhYmxlKGNhbmQkY2FnZSkKYGBgCgotICAgVmVtb3MgcXVlIGhheSBjYW5kaWRhdG9zIGRlc2RlIGxvcyAzMyBoYXN0YSBsb3MgODAgYcOxb3MuCiAgICBTZSBwdWVkZSBwZW5zYXIgZW4gY3JlYXIgZ3J1cG9zIGJhc2Fkb3MgZW4gZMOpY2FkYXMuCiAgICBFbCDDumx0aW1vIGdydXBvIHB1ZWRlIHNlciBkZSA3MCBhIG3DoXMuCgotICAgRXN0byBzZSBwdWVkZSBoYWNlciBkZSBtw7psdGlwbGVzIG1hbmVyYXMsIHVzYW5kbyBlbCBjb21hbmRvIGBjYXNlX3doZW5gLgoKYGBge3J9CmNhbmQgPSBjYW5kICU+JQogIG11dGF0ZShnZWRhZCA9IGNhc2Vfd2hlbigKICAgIGNhZ2UgPT0gMzMgfiAxLCBjYWdlID09IDM0IH4gMSwgY2FnZSA9PSAzNSB+IDEsIGNhZ2UgPT0gMzYgfiAxLCBjYWdlID09IDM3IH4gMSwKICAgIGNhZ2UgPT0gMzggfiAxLCBjYWdlID09IDM5IH4gMSkpCmBgYAoKYGBge3J9CmNhbmQgPSBjYW5kICU+JQogIG11dGF0ZShnZWRhZCA9IGNhc2Vfd2hlbigKICAgIGNhZ2UgPD0gMzkgfiAxLAogICAgKGNhZ2UgPj0gNDApICYgKGNhZ2UgPD00OSkgfiAyLAogICAgKGNhZ2UgPj0gNTApICYgKGNhZ2UgPD01OSkgfiAzLAogICAgKGNhZ2UgPj0gNjApICYgKGNhZ2UgPD02OSkgfiA0LAogICAgY2FnZSA+PSA3MCB+IDUsCiAgKSkKYGBgCgpgYGB7cn0KY2FuZCA9IGNhbmQgJT4lCiAgbXV0YXRlKGdlZGFkMiA9IGNhc2Vfd2hlbigKICAgIGNhZ2UgPD0gMzkgfiAxLAogICAgY2FnZSAlaW4lIDQwOjQ5IH4gMiwKICAgIGNhZ2UgJWluJSA1MDo1OSB+IDMsCiAgICBjYWdlICVpbiUgNjA6NjkgfiA0LAogICAgY2FnZSAlaW4lIDcwOjgwIH4gNQogICAgKSkKYGBgCgpgYGB7cn0KY2FuZCA9IGNhbmQgJT4lCiAgbXV0YXRlKGdlZGFkMiA9IGZhY3RvcihnZWRhZDIsIGxhYmVscz1jKCIzMC0zOSIsICI0MC00OSIsICI1MC01OSIsICI2MC02OSIsICI3MCsiKSkpCmBgYAoKLSAgIExhIHZhcmlhYmxlIHF1ZSByZWNvZ2UgZWwgdm90byBlbiBwcmltZXJhIHZ1ZWx0YSBlc3TDoSBlbiBmb3JtYSBkZSBwcm9wb3JjacOzbiB5IG5vIGRlIHBvcmNlbnRhamUuIFZhbW9zIGEgdHJhbnNmb3JtYXJsYSBlbiBwb3JjZW50YWplLgoKYGBge3J9CmNhbmQgPSBjYW5kICU+JQogIG11dGF0ZSh2b3RvMSA9IHYycG9yY3ZhbGlkb18xcmEpCmBgYAoKIyBEZXNjcmlwdGl2b3MgdW5pdmFyaWFkb3MKCi0gICDCv1F1w6kgcHJvcG9yY2nDs24gZGUgY2FuZGlkYXRvcyBlbiBBbcOpcmljYSBMYXRpbmEgc29uIGhvbWJyZXMgeSBtdWplcmVzPwoKYGBge3J9CnRhYmxhMSA9IGNhbmQgJT4lCiAgY291bnQoU2V4byA9IHNleG8sIG5hbWU9IkZyZWN1ZW5jaWEiKSAlPiUKICBtdXRhdGUoUG9yY2VudGFqZSA9IChGcmVjdWVuY2lhIC8gc3VtKEZyZWN1ZW5jaWEpKjEwMCApKQp0YWJsYTEKYGBgCgotICAgVmlzdWFsaXphY2nDs24gZGUgdW5hIHRhYmxhIGRlIGZyZWN1ZW5jaWFzLgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KHRhYmxhMSwgYWVzKHg9U2V4byx5PVBvcmNlbnRhamUpKSsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTAuNSkKYGBgCgotICAgwr9DdcOhbCBlcyBlbCBwcm9tZWRpbyBkZSBlZGFkIGRlIGxvcyBjYW5kaWRhdG9zIHByZXNpZGVuY2lhbGVzIGVuIEFtw6lyaWNhIExhdGluYT8KCmBgYHtyfQp0YWJsYTIgPSBjYW5kICU+JQogIHN1bW1hcmlzZShtaW5pbW8gPSBtaW4oY2FnZSwgbmEucm0gPSBUKSwgbWVkaWEgPSBtZWFuKGNhZ2UsIG5hLnJtID0gVCksIAogICAgICAgICAgICBtZWRpYW5hID0gbWVkaWFuKGNhZ2UsIG5hLnJtID0gVCksbWF4aW1vID0gbWF4KGNhZ2UsIG5hLnJtID0gVCksIAogICAgICAgICAgICBkZXN2aWFjaW9uID0gc2QoY2FnZSwgbmEucm0gPSBUKSkKdGFibGEyCmBgYAoKLSAgIFZpc3VhbGl6YWNpw7NuIGRlIHVuYSB2YXJpYWJsZSBudW3DqXJpY2EKCmBgYHtyfQpnZ3Bsb3QoY2FuZCwgYWVzKHg9Y2FnZSkpKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikrCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNTUuNiwgY29sb3IgPSAicmVkIikrCiAgeGxhYigiRWRhZCBkZSBsb3MgY2FuZGlkYXRvcyIpKwogIHlsYWIoIkZyZWN1ZW5jaWEiKSsKICB0aGVtZV9jbGFzc2ljKCkKYGBgCgotICAgwr9DdcOhbCBlcyBlbCBwcm9tZWRpbyBkZSB2b3RvcyBvYnRlbmlkb3MgcG9yIGNhbmRpZGF0b3MgcHJlc2lkZW5jaWFsZXMgZW4gQW3DqXJpY2EgTGF0aW5hPwoKYGBge3J9CnRhYmxhMyA9IGNhbmQgJT4lCiAgc3VtbWFyaXNlKG1pbmltbyA9IG1pbih2b3RvMSwgbmEucm0gPSBUKSwgbWVkaWEgPSBtZWFuKHZvdG8xLCBuYS5ybSA9IFQpLCAKICAgICAgICAgICAgbWVkaWFuYSA9IG1lZGlhbih2b3RvMSwgbmEucm0gPSBUKSxtYXhpbW8gPSBtYXgodm90bzEsIG5hLnJtID0gVCksIAogICAgICAgICAgICBkZXN2aWFjaW9uID0gc2Qodm90bzEsIG5hLnJtID0gVCkpCnRhYmxhMwpgYGAKCmBgYHtyfQpnZ3Bsb3QoY2FuZCwgYWVzKHg9dm90bzEpKSsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDUpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDE1LjQsIGNvbG9yID0gInJlZCIpKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDYuNiwgY29sb3IgPSAiZ3JlZW4iKSsKICB4bGFiKCJWb3RvIGRlIGxvcyBjYW5kaWRhdG9zIikrCiAgeWxhYigiRnJlY3VlbmNpYSIpKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCi0gICBDdcOhbCBlcyBsYSBpZGVvbG9nw61hIHByb21lZGlvIGRlIGxvcyBjYW5kaWRhdG9zIHByZXNpZGVuY2lhbGVzIGVuIEFtw6lyaWNhIExhdGluYT8KCmBgYHtyfQp0YWJsYS5pZGVvID0gY2FuZCAlPiUKICBzdW1tYXJpc2UobWluaW1vID0gbWluKHYyaWRlb2xvZ3lfY29yZSwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIG1lZGlhID0gbWVhbih2MmlkZW9sb2d5X2NvcmUsIG5hLnJtID0gVCksIAogICAgICAgICAgICBtZWRpYW5hID0gbWVkaWFuKHYyaWRlb2xvZ3lfY29yZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4aW1vID0gbWF4KHYyaWRlb2xvZ3lfY29yZSwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgIGRlc3ZpYWNpb24gPSBzZCh2MmlkZW9sb2d5X2NvcmUsIG5hLnJtID0gVCkpCnRhYmxhLmlkZW8KYGBgCgotICAgR3JhZmljYXIKCmBgYHtyfQpnZ3Bsb3QoY2FuZCwgYWVzKHg9djJpZGVvbG9neV9jb3JlKSkrCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKSsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxMS4yLCBjb2xvciA9ICJyZWQiKSsKICB4bGFiKCJJZGVvbG9nw61hIGRlIGxvcyBjYW5kaWRhdG9zIikrCiAgeWxhYigiRnJlY3VlbmNpYSIpKwogIHRoZW1lX2NsYXNzaWMoKQpgYGAKCiMgQ29tcGFyYWNpw7NuIGVudHJlIGdydXBvcwoKLSAgIMK/TG9zIGNhbmRpZGF0b3MgaG9tYnJlcyBsb2dyYW4gbcOhcyB2b3RvcyBxdWUgbGFzIGNhbmRpZGF0YXMgbXVqZXJlcyBlbiBsYXMgcHJpbWVyYXMgdnVlbHRhcyBlbiBBbcOpcmljYSBMYXRpbmE/CgpgYGB7cn0KbGlicmFyeShsc3IpCnZvdG94c2V4byA9IGNhbmQgJT4lIAogIGdyb3VwX2J5KFNleG8gPSBzZXhvKSB8PgogIHN1bW1hcml6ZShNaW5pbW8gPSBtaW4odm90bzEsIG5hLnJtID0gVCksCiAgICAgICAgICAgIE1lZGlhID0gbWVhbih2b3RvMSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgTWF4aW1vID0gbWF4KHZvdG8xLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBEZXN2LlN0ZCA9IHNkKHZvdG8xLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBMaW1pdGUuaW5mID0gY2lNZWFuKHZvdG8xLCBuYS5ybT1UKVsxXSwKICAgICAgICAgICAgTGltaXRlLnN1cCA9IGNpTWVhbih2b3RvMSwgbmEucm09VClbMl0pCnZvdG94c2V4bwpgYGAKCi0gICBHcmFmaWNhciBsYSBjb21wYXJhY2nDs24KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmdyYWYxID0gZ2dwbG90KHZvdG94c2V4bywgYWVzKHg9U2V4bywgeT1NZWRpYSkpKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1MaW1pdGUuaW5mLCB5bWF4PUxpbWl0ZS5zdXApLCB3aWR0aD0wLjIpKwogIGdlb21fdGV4dChhZXMobGFiZWw9cGFzdGUocm91bmQoTWVkaWEsIDEpKSksIHZqdXN0PS0xLCBzaXplPTQpKwogIHhsYWIoIlNleG8gZGVsIGNhbmRpZGF0byIpICsgeWxhYigiVm90b3Mgb2J0ZW5pZG9zIikrCiAgeWxpbSgwLCAyMCkKZ3JhZjEKYGBgCgotICAgwr9RdWnDqW5lcyBvYnRpZW5lbiBtw6FzIHZvdG9zIGVuIHByb21lZGlvLCBsb3MgY2FuZGlkYXRvcyBqw7N2ZW5lcyBvIGxvcyBtYXlvcmVzPwoKYGBge3J9CnZvdG94ZWRhZCA9IGNhbmQgJT4lIAogIGdyb3VwX2J5KEVkYWQgPSBnZWRhZDIpIHw+CiAgc3VtbWFyaXplKE1pbmltbyA9IG1pbih2b3RvMSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgTWVkaWEgPSBtZWFuKHZvdG8xLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBNYXhpbW8gPSBtYXgodm90bzEsIG5hLnJtID0gVCksCiAgICAgICAgICAgIERlc3YuU3RkID0gc2Qodm90bzEsIG5hLnJtID0gVCksCiAgICAgICAgICAgIExpbWl0ZS5pbmYgPSBjaU1lYW4odm90bzEsIG5hLnJtPVQpWzFdLAogICAgICAgICAgICBMaW1pdGUuc3VwID0gY2lNZWFuKHZvdG8xLCBuYS5ybT1UKVsyXSkKdm90b3hlZGFkCmBgYAoKTGEgZmlsYSBkZSBOQSBzZSBwdWVkZSBlbGltaW5hciBlbiBsYSB0YWJsZSBvIHNlIHB1ZWRlIGZpbHRyYXIgZW4gZWwgY8OzZGlnbyBjb24gYGZpbHRlcmAuCgotICAgR3JhZmljYXIgY29tcGFyYWNpw7NuIGVudHJlIHZhcmlvcyBncnVwb3MKCmBgYHtyfQpncmFmMSA9IGdncGxvdCh2b3RveGVkYWQsIGFlcyh4PUVkYWQsIHk9TWVkaWEpKSsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49TGltaXRlLmluZiwgeW1heD1MaW1pdGUuc3VwKSwgd2lkdGg9MC4yKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKHJvdW5kKE1lZGlhLCAxKSkpLCB2anVzdD0tMSwgc2l6ZT00KSsKICB4bGFiKCJFZGFkIGRlbCBjYW5kaWRhdG8iKSArIHlsYWIoIlZvdG9zIG9idGVuaWRvcyIpKwogIHlsaW0oMCwgMzApCmdyYWYxCmBgYAoKLSAgIFkgcXXDqSBwYXNhIGVuIGxhcyBzZWd1bmRhcyB2dWVsdGFzPyBDdcOhbnRhcyBtdWplcmVzIGxsZWdhbj8KCmBgYHtyfQpjYW5kID0gY2FuZCAlPiUKICBtdXRhdGUodm90bzIgPSB2MnBvcmN2YWxfMmRhKQpgYGAKCmBgYHtyfQp0YWJsYTQgPSBjYW5kICU+JQogIGZpbHRlcih2MmNhbmRzZWc9PTEpICU+JSAKICBjb3VudChTZXhvID0gc2V4bywgbmFtZT0iRnJlY3VlbmNpYSIpICU+JQogIG11dGF0ZShQb3JjZW50YWplID0gKEZyZWN1ZW5jaWEgLyBzdW0oRnJlY3VlbmNpYSkqMTAwICkpCnRhYmxhNApgYGAKCi0gICBRdcOpIHBvcmNlbnRhamUgZGUgdm90b3Mgb2J0aWVuZW4/CgpgYGB7cn0Kdm90bzJkYXhzZXhvID0gY2FuZCAlPiUgCiAgZmlsdGVyKHYyY2FuZHNlZz09MSkgJT4lIAogIGdyb3VwX2J5KFNleG8gPSBzZXhvKSAlPiUKICBzdW1tYXJpemUoTWluaW1vID0gbWluKHZvdG8yLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBNZWRpYSA9IG1lYW4odm90bzIsIG5hLnJtID0gVCksCiAgICAgICAgICAgIE1heGltbyA9IG1heCh2b3RvMiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgRGVzdi5TdGQgPSBzZCh2b3RvMiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgTGltaXRlLmluZiA9IGNpTWVhbih2b3RvMiwgbmEucm09VClbMV0sCiAgICAgICAgICAgIExpbWl0ZS5zdXAgPSBjaU1lYW4odm90bzIsIG5hLnJtPVQpWzJdKQp2b3RvMmRheHNleG8KYGBgCgojIEluZmVyZW5jaWEKCiMjIFBydWViYXMgZGUgc2lnbmlmaWNhbmNpYQoKLSAgIFJlYWxpemFyIHVuYSBwcnVlYmEgcGFyYSBwb25lciBhIHBydWViYSBsYSBjb21wYXJhY2nDs24gZW50cmUgZ3J1cG9zCgpgYGB7ciBzaWduaWZpY2FuY2lhfQpsaWJyYXJ5KERlc2NUb29scykKTGV2ZW5lVGVzdChjYW5kJHZvdG8xLCBjYW5kJHNleG8pCmBgYAoKYGBge3IgdH0KdC50ZXN0KGNhbmQkdm90bzEgfiBjYW5kJHNleG8sIHZhci5lcXVhbD1UKQpgYGAKCmBgYHtyIGFub3ZhfQphbm92YSA9IGFvdihjYW5kJHZvdG8xIH4gY2FuZCRnZWRhZDIpCnN1bW1hcnkoYW5vdmEpCmBgYAoKIyMgQ29ycmVsYWNpw7NuCgotICAgUHJlc2VudGFyIGdyw6FmaWNvIGRlIGRpc3BlcnNpw7NuIGRlbCB2b3RvIGEgY2FuZGlkYXRvIHBvciBlZGFkCgpgYGB7cn0KZ2dwbG90KGNhbmQsIGFlcyh4PWNhZ2UsIHk9dm90bzEpKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBzZT1GKSsgI2FncmVnYXIgbMOtbmVhIGRlIHRlbmRlbmNpYQogIGxhYnMoeD0iRWRhZCIsIAogICAgICAgeT0iVm90byBlbiAxZXJhIHZ1ZWx0YSIpKyAjcGFyYSBldGlxdWV0YXIgbG9zIGVqZXMKICB0aGVtZV9saWdodCgpCmBgYAoKIyMgUmVncmVzacOzbiBsaW5lYWwgc2ltcGxlCgotICAgUmVhbGl6YXIgdW4gbW9kZWxvIGRlIGFsZ3VubyBkZSBsb3MgZ3LDoWZpY29zIGRlIGRpc3BlcnNpw7NuCgpgYGB7ciBvbHN9Cm1vZGVsbzEgPSBsbShjYW5kJHZvdG8xIH4gY2FuZCRjYWdlKQpzdW1tYXJ5KG1vZGVsbzEpCmBgYAoKYGBge3J9Cm1vZGVsbzIgPSBsbShjYW5kJHZvdG8yIH4gY2FuZCRjYWdlKQpzdW1tYXJ5KG1vZGVsbzIpCmBgYAoKYGBge3J9CmNhbmQgPSBjYW5kIHw+CiAgbXV0YXRlKG11amVyID0gaWZlbHNlKGNzZXg9PTIsIDEsIDApKQpgYGAKCmBgYHtyfQptb2RlbG8zID0gbG0oY2FuZCR2b3RvMSB+IGNhbmQkbXVqZXIpCnN1bW1hcnkobW9kZWxvMykKYGBgCgojIyBSZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUKCi0gICBTZWd1aXIgY29uIGVsIG1vZGVsbyBzaW1wbGUsIGFob3JhIGludHJvZHVjaWVuZG8gY29udHJvbGVzCgpgYGB7ciBvbHMgbXVsdGlwbGV9Cm1vZGVsbzQgPSBsbShjYW5kJHZvdG8xIH4gY2FuZCRjYWdlICsgY2FuZCRtdWplciArIGNhbmQkdjJpZGVvbG9neV9jb3JlKQpzdW1tYXJ5KG1vZGVsbzQpCmBgYAoKYGBge3J9CmdncGxvdChjYW5kLCBhZXMoeD1jYWdlLCB5PXZvdG8xKSkrCiAgZ2VvbV9wb2ludCgpKwogIGdlb21fc21vb3RoKG1ldGhvZD1sbSwgc2U9RikrICNhZ3JlZ2FyIGzDrW5lYSBkZSB0ZW5kZW5jaWEKICBsYWJzKHg9IkVkYWQiLCAKICAgICAgIHk9IlZvdG8gZW4gMWVyYSB2dWVsdGEiKSsgI3BhcmEgZXRpcXVldGFyIGxvcyBlamVzCiAgZmFjZXRfd3JhcCh+IG11amVyKSAKICB0aGVtZV9saWdodCgpCmBgYAoKYGBge3J9Cm1vZGVsbzUgPSBsbShjYW5kJHZvdG8yIH4gY2FuZCRjYWdlICsgY2FuZCRtdWplcikKc3VtbWFyeShtb2RlbG81KQpgYGAKCiMgSGFjaWEgZWwgcHLDs3hpbW8gY2ljbG9bXjFdCgpbXjFdOiBTaSBhcHJ1ZWJhbgoKRWwgbcOpdG9kbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtdWx0aXZhcmlhZG8gZGViZSBjdW1wbGlyIHVub3MgcmVxdWlzaXRvcyBxdWUgbm8gc2UgdmVyw6FuIGVuIGVzdGUgY3Vyc28uCkVzdG9zIHJlcXVpc2l0b3Mgc29uOgoKLSAgIExpbmVhbGlkYWQ6IHF1ZSBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBzZWEgbGluZWFsLgoKLSAgIE11bHRpY29saW5lYWxpZGFkOiBsb3MgcHJlZGljdG9yZXMgbm8gZGViZW4gIm1lZGlyIiBlbCBtaXNtbyBjb25jZXB0by4KICAgIEVzIGRlY2lyLCB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgbm8gZGViZW4gdGVuZXIgdW5hIGFsdGEgY29ycmVsYWNpw7NuLgoKLSAgIEhldGVyb2NlZGFzdGljaWRhZDogbG9zIGVycm9yZXMgZGViZW4gc2VyIGFsZWF0b3Jpb3MgeSBubyBzZXIgc2lzdGVtw6F0aWNvcy4KICAgIFNpIGxvcyBlcnJvcmVzIHRpZW5lIHVuYSByZWxhY2nDs24gc2lzdGVtw6F0aWNhIGNvbiBsb3MgdmFsb3JlcyBkZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgc2UgaGFibGEgZGUgaGV0ZXJvY2VkYXN0aWNpZGFkLgoKLSAgIEF1dG9jb3JyZWxhY2nDs246IGVuIHBhcnRpY3VsYXIgY3VhbmRvIHNlIHRyYWJhamEgY29uIHVuYSB2YXJpYWJsZSB0ZW1wb3JhbC4KICAgIFNlIGRpY2UgcXVlIGhheSBhdXRvY29ycmVsYWNpw7NuIGN1YW5kbyBlbCB2YWxvciBlbiB0KzEgZGVwZW5kZSBkZWwgdmFsb3IgZGUgdC4KCkVzdG9zIHJlcXVpc2l0b3Mgc2UgdmVyw6FuIGVuIGVsIGN1cnNvIGRlIEVzdGFkw61zdGljYSAyLgoKT3RybyB0ZW1hIHF1ZSBzZSB2ZXLDoSBlbiBlbCBzaWd1aWVudGUgY3Vyc28gZXMgZWwgbW9kZWxvIHF1ZSBzZSB1c2EgY3VhbmRvIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIG5vIGVzIHVuYSBudW3DqXJpY2EsIHNpbm8gdW5hIHZhcmlhYmxlIGRpY290w7NtaWNhLgpDdWFuZG8gdGVuZW1vcyBlc3RhIHZhcmlhYmxlIGRlcGVuZGllbnRlIHNlIHVzYSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhLgoKIyBSZXN1bWVuCgpFbiBlc3RhIHNlY2Npw7NuIHByZXNlbnRhbW9zIHVuIG1hcGEgZGUgdGVtYXMgcXVlIGhlbW9zIHZpc3RvIGEgbG8gbGFyZ28gZGUgdG9kbyBlbCBzZW1lc3RyZS4KQ29tbyBzZSB2ZSBlbiBlbCBlc3F1ZW1hLCBsYXMgaGVycmFtaWVudGFzIHF1ZSBoZW1vcyB2aXN0byBlbiBlbCBjdXJzbyBkZXBlbmRlbiBkZSB1biBwdW50byBkZSBwYXJ0aWRhIGluaWNpYWwsIHF1ZSBlcyBsYSBkaXN0aW5jacOzbiBlbnRyZSB0aXBvcyBkZSB2YXJpYWJsZXM6IGN1YWxpdGF0aXZhcyBvIGNhdGVnw7NyaWNhcyB5IGN1YW50aXRhdGl2YXMgbyBudW3DqXJpY2FzLgpEZXBlbmRpZW5kbyBkZSBlc3RhIGNhdGVnb3JpemFjacOzbiwgc2UgZGVzcHJlbmRlIGVsIHRpcG8gZGUgYW7DoWxpc2lzIGRlc2NyaXB0aXZvLCB0YW50byBkZSBsYSB0ZW5kZW5jaWEgY2VudHJhbCwgY29tbyBkZSBsYSBkaXNwZXJzacOzbiwgYXPDrSBjb21vIGxhcyBmb3JtYXMgZGUgZ3JhZmljYXIgZXN0YXMgdmFyaWFibGVzLgoKQ29tbyBwYXNvIHByZXZpbyBhIGxhIGluZmVyZW5jaWEsIHNlIGNvbnN0cnV5ZXJvbiBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBkZSBsYSBtZWRpYSAodmFyaWFibGVzIGN1YW50aXRhdml0YXMpIG8gZGUgcHJvcG9yY2lvbmVzICh2YXJpYWJsZXMgY3VhbGl0YXRpdmFzKS4KU2UgYW5hbGl6w7MgcXVlIHNlIHBvZMOtYW4gY29uc3RydWlyIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIG1lZGlhcyBvIHByb3BvcmNpb25lcyBwYXJhIGdydXBvcy4KRXN0ZSBlcyBlbCBwcmltZXIgcGFzbyBkZSBsYSBpbmZlcmVuY2lhLgpTZSBldmFsdcOzIHNpIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBzZSB0cmFzbGFwYWJhbiBvIG5vLgpFc3RvIGRhYmEgcGFzbyBhbCBhbsOhbGlzaXMgYml2YXJpYWRvIGVuIGxhIHNlZ3VuZGEgcGFydGUgZGVsIGN1cnNvLgoKIVtdKFJlc3VtZW4ucG5nKQoKRW4gZWwgbGlicm8gZGUgUml0Y2hleSBzZSBtdWVzdHJhIGVzdGUgw6FyYm9sIGRlIGRlY2lzacOzbi4KTGEgcmFtYSBkZXJlY2hhIGRlICJEb3MgbXVlc3RyYXMgbyBkb3MgdmFyaWFibGVzIiBtdWVzdHJhIGVsIHJlc3VtZW4gZGUgbGEgc2VndW5kYSBwYXJ0ZSBkZSBlc3RlIGN1cnNvLgpFc3RhIHNlZ3VuZGEgcGFydGUgaGEgZXN0YWRvIGRlZGljYWRhIGEgbGEgaW5mZXJlbmNpYSBlbiBlbCBhbsOhbGlzaXMgYml2YXJpYWRvLgpDb21vIGhlbW9zIGF2YW56YWRvIGVuIGVzdGUgY3Vyc28sIHNlIGhhIHByZXNlbnRhZG8gbGEgcHJ1ZWJhIGRlIGluZmVyZW5jaWEgdCwgbGEgcHJ1ZWJhIEYgZGUgQU5PVkEsIGxhIHBydWViYSBkZSBjaGktY3VhZHJhZG8geSBsYSByZWdyZXNpw7NuIGJpdmFyaWFkYS4KTHVlZ28sIHNlIGRpbyBlbCBwYXNvIGFsIGFuw6FsaXNpcyBtdWx0aXZhcmlhZG8uCgohW10oYXJib2wucG5nKQoKRmluYWxtZW50ZSwgZWwgb2JqZXRpdm8gZGUgZXN0ZSBjdXJzbyBlcyBwcmVzZW50YXIgaGVycmFtaWVudGFzIGluaWNpYWxlcyBwYXJhIGVsIGFuw6FsaXNpcyBkZSBkYXRvcyBzb2NpYWxlcy4KU2UgZXNwZXJhIHF1ZSBsdWVnbyBkZSBlc3RlIGN1cnNvIGxvcyBhbHVtbm9zIHNlYW4gY29uc3VtaWRvcmVzIG8gcHJvZHVjdG9yZXMgY2FwYWNlcyBkZSBlc3RhZMOtc3RpY2EuCkNvbW8gY29uc3VtaWRvcmVzLCBsb3MgYWx1bW5vcyB2YW4gYSBlc3RhciBleHB1ZXN0b3MgYSBsaXRlcmF0dXJhIGVzcGVjaWFsaXphZGEgcXVlIHVzZSBtw6l0b2RvcyBlc3RhZMOtc3RpY29zLgpMYXMgaGVycmFtaWVudGFzIHZpc3RhcyBlbiBlc3RlIGN1cnNvIHBlcm1pdGlyw61hbiBxdWUgbG9zIGFsdW1ub3MgcHVlZGFuIGV2YWx1YXIgZXN0b3MgYXJ0w61jdWxvcyB5IGxvcyBoYWxsYXpnb3MgZGUgbWFuZXJhIGNyw610aWNhLgoKQ29tbyBwcm9kdWN0b3Jlcywgc2UgZXNwZXJhIHF1ZSBsb3MgYWx1bW5vcyB1dGlsaWNlbiBldmlkZW5jaWEgbnVtw6lyaWNhIHkgYW7DoWxpc2lzIGVzdGFkw61zdGljbyBlbiBzdXMgdHJhYmFqb3MgZGUgY3Vyc29zIHkgZW4gc3VzIHRlc2lzIGRlIHByZWdyYWRvLgpZYSBzZWEgcGFyYSBwcmVzZW50YXIgYW7DoWxpc2lzIGRlc2NyaXB0aXZvIG8gcGFyYSByZWFsaXphciBhbsOhbGlzaXMgaW5mZXJlbmNpYWwsIGxvcyBhbHVtbm9zIGRlYmVyw61hbiBlc3RhciBlbiBsYSBjYXBhY2lkYWQgZGUgcmVjb2dlciBkYXRvcyBudW3DqXJpY29zIHkgdHJhYmFqYXIgY29uIGVzdG9zIHVzYW5kbyB0w6ljbmljYXMgdmlzdGFzIGVuIGVzdGUgY3Vyc28uCkVzIGNvbXBsZXRhbWVudGUgdsOhbGlkbyBxdWUgbG9zIGFsdW1ub3MgdXNlbiBvdHJvcyBtw6l0b2RvcywgcG9yIGVqZW1wbG8gY3VhbGl0YXRpdm9zLCBwZXJvIHNpIGVzdGUgY3Vyc28geSBlbCBzaWd1aWVudGUgbG9ncmFuIHF1ZSBhbGd1bm9zIGRlIHVzdGVkZXMgc2UgImF0cmV2YW4iIGEgdXNhciBtw6l0b2RvcyBjdWFudGl0YXRpdm9zLCBlc2Ugc2Vyw6EgZWwgbWF5b3IgbG9ncm8gZGUgZXN0ZSBjdXJzby4KR3JhY2lhcyEhIQo=