Trabajando con variables nivel 2 en Multinivel

Juan Carlos Castillo - Septiembre 2017 jc-castillo.com

Desde un punto de vista operativo, las variables de nivel dos se pueden clasificar en dos tipos:

  1. Las que se pueden generar a partir desde los datos individuales (como por ejemplo, promedio/porcentaje de una variable de nivel 1)
  2. Las que provienen de fuentes externas a los datos individuales (ej: datos administrativos, nivel de democracia de un país, nivel de vulnerabilidad de una escuela, etc.)

Para los ejemplos vamos a trabajar con la base de datos de ISSP 2009 (www.issp.org), modulo desigualdad económica (datos originales: ZA5400_v4-0-0.dta), y luego con la base del Quality of Government (http://qog.pol.gu.se/)

# Librerías
pacman::p_load(haven,descr,sjmisc,dplyr,sjPlot, ggplot2)

# Data ISSP (original)
issp2009=read_dta("ZA5400_v4-0-0.dta") # establecer antes directorio de trabajo con setwd
names(issp2009)
##   [1] "V1"       "V2"       "DOI"      "V3"       "V4"       "V5"      
##   [7] "C_ALPHAN" "V6"       "V7"       "V8"       "V9"       "V10"     
##  [13] "V11"      "V12"      "V13"      "V14"      "V15"      "V16"     
##  [19] "V17"      "V18"      "V19"      "V20"      "V21"      "V22"     
##  [25] "V23"      "V24"      "V25"      "V26"      "V27"      "V28"     
##  [31] "V29"      "V30"      "V31"      "V32"      "V33"      "V34"     
##  [37] "V35"      "V36"      "V37"      "V38"      "V39"      "V40"     
##  [43] "V41"      "V42"      "V43"      "V44"      "V45"      "V46"     
##  [49] "V47"      "V48"      "V49"      "V50"      "V51"      "V52"     
##  [55] "V53"      "V54"      "V55"      "V56"      "V57"      "V58"     
##  [61] "V59"      "V60"      "V61"      "V62"      "V63"      "V64"     
##  [67] "V65"      "V66"      "V67"      "V68"      "V69"      "V70"     
##  [73] "V71"      "V72"      "V73"      "V74"      "V75"      "V73_TR"  
##  [79] "V74_TR"   "V75_TR"   "V76"      "V77"      "V78"      "SEX"     
##  [85] "AGE"      "MARITAL"  "COHAB"    "EDUCYRS"  "DEGREE"   "AR_DEGR" 
##  [91] "AT_DEGR"  "AU_DEGR"  "BE_DEGR"  "BG_DEGR"  "CH_DEGR"  "CL_DEGR" 
##  [97] "CN_DEGR"  "CY_DEGR"  "CZ_DEGR"  "DE_DEGR"  "DK_DEGR"  "EE_DEGR" 
## [103] "ES_DEGR"  "FI_DEGR"  "FR_DEGR"  "GB_DEGR"  "HR_DEGR"  "HU_DEGR" 
## [109] "IL_DEGR"  "IS_DEGR"  "IT_DEGR"  "JP_DEGR"  "KR_DEGR"  "LT_DEGR" 
## [115] "LV_DEGR"  "NO_DEGR"  "NZ_DEGR"  "PH_DEGR"  "PL_DEGR"  "PT_DEGR" 
## [121] "RU_DEGR"  "SE_DEGR"  "SI_DEGR"  "SK_DEGR"  "TR_DEGR"  "TW_DEGR" 
## [127] "UA_DEGR"  "US_DEGR"  "VE_DEGR"  "ZA_DEGR"  "WRKST"    "WRKHRS"  
## [133] "ISCO88"   "WRKTYPE"  "NEMPLOY"  "WRKSUP"   "UNION"    "SPWRKST" 
## [139] "SPISCO88" "SPWRKTYP" "AR_RINC"  "AT_RINC"  "AU_RINC"  "BE_RINC" 
## [145] "BG_RINC"  "CH_RINC"  "CL_RINC"  "CN_RINC"  "CY_RINC"  "CZ_RINC" 
## [151] "DE_RINC"  "DK_RINC"  "EE_RINC"  "ES_RINC"  "FI_RINC"  "FR_RINC" 
## [157] "GB_RINC"  "HR_RINC"  "HU_RINC"  "IL_RINC"  "IS_RINC"  "IT_RINC" 
## [163] "JP_RINC"  "KR_RINC"  "LT_RINC"  "LV_RINC"  "NO_RINC"  "NZ_RINC" 
## [169] "PH_RINC"  "PL_RINC"  "PT_RINC"  "RU_RINC"  "SE_RINC"  "SI_RINC" 
## [175] "SK_RINC"  "TR_RINC"  "TW_RINC"  "UA_RINC"  "US_RINC"  "VE_RINC" 
## [181] "ZA_RINC"  "AR_INC"   "AT_INC"   "AU_INC"   "BE_INC"   "BG_INC"  
## [187] "CH_INC"   "CL_INC"   "CN_INC"   "CY_INC"   "CZ_INC"   "DE_INC"  
## [193] "DK_INC"   "EE_INC"   "ES_INC"   "FI_INC"   "FR_INC"   "GB_INC"  
## [199] "HR_INC"   "HU_INC"   "IL_INC"   "IS_INC"   "IT_INC"   "JP_INC"  
## [205] "KR_INC"   "LT_INC"   "LV_INC"   "NO_INC"   "NZ_INC"   "PH_INC"  
## [211] "PL_INC"   "PT_INC"   "RU_INC"   "SE_INC"   "SI_INC"   "SK_INC"  
## [217] "TR_INC"   "TW_INC"   "UA_INC"   "US_INC"   "VE_INC"   "ZA_INC"  
## [223] "HOMPOP"   "HHCYCLE"  "PARTY_LR" "AR_PRTY"  "AT_PRTY"  "AU_PRTY" 
## [229] "BE_PRTY"  "BG_PRTY"  "CH_PRTY"  "CL_PRTY"  "CN_PRTY"  "CY_PRTY" 
## [235] "CZ_PRTY"  "DE_PRTY"  "DK_PRTY"  "EE_PRTY"  "ES_PRTY"  "FI_PRTY" 
## [241] "FR_PRTY"  "GB_PRTY"  "HR_PRTY"  "HU_PRTY"  "IL_PRTY"  "IS_PRTY" 
## [247] "IT_PRTY"  "JP_PRTY"  "KR_PRTY"  "LT_PRTY"  "LV_PRTY"  "NO_PRTY" 
## [253] "NZ_PRTY"  "PH_PRTY"  "PL_PRTY"  "PT_PRTY"  "RU_PRTY"  "SE_PRTY" 
## [259] "SI_PRTY"  "SK_PRTY"  "TR_PRTY"  "TW_PRTY"  "UA_PRTY"  "US_PRTY" 
## [265] "VE_PRTY"  "ZA_PRTY"  "VOTE_LE"  "RELIG"    "RELIGGRP" "ATTEND"  
## [271] "TOPBOT"   "AR_REG"   "AT_REG"   "AU_REG"   "BE_REG"   "BG_REG"  
## [277] "CH_REG"   "CL_REG"   "CN_REG"   "CY_REG"   "CZ_REG"   "DE_REG"  
## [283] "DK_REG"   "EE_REG"   "ES_REG"   "FI_REG"   "FR_REG"   "GB_REG"  
## [289] "HR_REG"   "HU_REG"   "IL_REG"   "IS_REG"   "IT_REG"   "JP_REG"  
## [295] "KR_REG"   "LT_REG"   "LV_REG"   "NO_REG"   "NZ_REG"   "PH_REG"  
## [301] "PL_REG"   "PT_REG"   "RU_REG"   "SE_REG"   "SI_REG"   "SK_REG"  
## [307] "TR_REG"   "TW_REG"   "UA_REG"   "US_REG"   "VE_REG"   "ZA_REG"  
## [313] "AR_SIZE"  "AT_SIZE"  "AU_SIZE"  "BE_SIZE"  "BG_SIZE"  "CH_SIZE" 
## [319] "CL_SIZE"  "CN_SIZE"  "CY_SIZE"  "CZ_SIZE"  "DE_SIZE"  "DK_SIZE" 
## [325] "EE_SIZE"  "ES_SIZE"  "FI_SIZE"  "FR_SIZE"  "GB_SIZE"  "HR_SIZE" 
## [331] "HU_SIZE"  "IL_SIZE"  "IT_SIZE"  "JP_SIZE"  "KR_SIZE"  "LT_SIZE" 
## [337] "LV_SIZE"  "NO_SIZE"  "NZ_SIZE"  "PH_SIZE"  "PL_SIZE"  "PT_SIZE" 
## [343] "RU_SIZE"  "SE_SIZE"  "SI_SIZE"  "SK_SIZE"  "TR_SIZE"  "TW_SIZE" 
## [349] "UA_SIZE"  "US_SIZE"  "VE_SIZE"  "ZA_SIZE"  "URBRURAL" "ETHNIC"  
## [355] "MODE"     "SUBSCASE" "WEIGHT"
names(issp2009) <- tolower(names(issp2009)) # cambia a minúsculas

Algunos ajustes preliminares a los datos:

Primero vamos a seleccionar algunas variables de la base de datos (para detalles, ver libro de códigos):

issp2009r=issp2009 %>% select(v5,v10,sex,age) # dplyr

Y ahora recodificaciones y limpieza de perdidos

# v10: Esfuerzo
  issp2009r$effort=issp2009r$v10
  freq(issp2009r$effort) # freq es de descr

## Q1e Getting ahead: How important is hard work? 
##       Frequency  Percent
## 1         17432  31.1169
## 2         24403  43.5605
## 3         10568  18.8644
## 4          2370   4.2306
## 5           539   0.9621
## 8           387   0.6908
## 9           322   0.5748
## Total     56021 100.0000
  freq(to_label(issp2009r$effort)) #  to_label de sjmisc

## Q1e Getting ahead: How important is hard work? 
##                      Frequency  Percent
## Essential                17432  31.1169
## Very important           24403  43.5605
## Fairly important         10568  18.8644
## Not very important        2370   4.2306
## Not important at all       539   0.9621
## Cant choose                387   0.6908
## NA                         322   0.5748
## Total                    56021 100.0000
  issp2009r$effort=set_na(issp2009r$effort,na = c(8,9))
  issp2009r$effort=rec(issp2009r$effort, rec = "rev") # Reverse code, sjmisc 
  freq(to_label(issp2009r$effort)) # ok.

## Q1e Getting ahead: How important is hard work? 
##                      Frequency  Percent Valid Percent
## Not important at all       539   0.9621        0.9745
## Not very important        2370   4.2306        4.2848
## Fairly important         10568  18.8644       19.1062
## Very important           24403  43.5605       44.1188
## Essential                17432  31.1169       31.5158
## NA's                       709   1.2656              
## Total                    56021 100.0000      100.0000
  freq(issp2009r$effort) # ok.

## Q1e Getting ahead: How important is hard work? 
##       Frequency  Percent Valid Percent
## 1           539   0.9621        0.9745
## 2          2370   4.2306        4.2848
## 3         10568  18.8644       19.1062
## 4         24403  43.5605       44.1188
## 5         17432  31.1169       31.5158
## NA's        709   1.2656              
## Total     56021 100.0000      100.0000
# Sex
  freq(issp2009r$sex);freq(to_label(issp2009r$sex))  # freq es de descr

## R: Sex 
##       Frequency   Percent
## 1         25184  44.95457
## 2         30792  54.96510
## 9            45   0.08033
## Total     56021 100.00000

## R: Sex 
##             Frequency   Percent
## Male            25184  44.95457
## Female          30792  54.96510
## NA, refused        45   0.08033
## Total           56021 100.00000
  issp2009r$sex=rec(issp2009r$sex, rec="1=0 [Male];2=1[Female]; 9=NA")

# Age
  freq(issp2009r$age)

## R: Age 
##       Frequency   Percent
## 15            6 1.071e-02
## 16           92 1.642e-01
## 17          131 2.338e-01
## 18          838 1.496e+00
## 19          895 1.598e+00
## 20          911 1.626e+00
## 21          861 1.537e+00
## 22          861 1.537e+00
## 23          830 1.482e+00
## 24          887 1.583e+00
## 25          877 1.565e+00
## 26          901 1.608e+00
## 27          923 1.648e+00
## 28          941 1.680e+00
## 29          959 1.712e+00
## 30         1016 1.814e+00
## 31          887 1.583e+00
## 32         1039 1.855e+00
## 33          951 1.698e+00
## 34          975 1.740e+00
## 35         1085 1.937e+00
## 36         1033 1.844e+00
## 37         1004 1.792e+00
## 38         1060 1.892e+00
## 39         1056 1.885e+00
## 40         1122 2.003e+00
## 41          970 1.731e+00
## 42         1089 1.944e+00
## 43         1069 1.908e+00
## 44         1021 1.823e+00
## 45         1095 1.955e+00
## 46          973 1.737e+00
## 47         1042 1.860e+00
## 48         1071 1.912e+00
## 49         1117 1.994e+00
## 50         1104 1.971e+00
## 51          984 1.756e+00
## 52         1012 1.806e+00
## 53         1007 1.798e+00
## 54          937 1.673e+00
## 55          986 1.760e+00
## 56         1008 1.799e+00
## 57          969 1.730e+00
## 58          915 1.633e+00
## 59          968 1.728e+00
## 60         1079 1.926e+00
## 61          905 1.615e+00
## 62          934 1.667e+00
## 63          814 1.453e+00
## 64          774 1.382e+00
## 65          807 1.441e+00
## 66          742 1.325e+00
## 67          738 1.317e+00
## 68          679 1.212e+00
## 69          663 1.183e+00
## 70          712 1.271e+00
## 71          540 9.639e-01
## 72          578 1.032e+00
## 73          516 9.211e-01
## 74          516 9.211e-01
## 75          471 8.408e-01
## 76          406 7.247e-01
## 77          360 6.426e-01
## 78          350 6.248e-01
## 79          307 5.480e-01
## 80          324 5.784e-01
## 81          222 3.963e-01
## 82          223 3.981e-01
## 83          157 2.803e-01
## 84          144 2.570e-01
## 85          121 2.160e-01
## 86           85 1.517e-01
## 87           63 1.125e-01
## 88           48 8.568e-02
## 89           57 1.017e-01
## 90           24 4.284e-02
## 91            8 1.428e-02
## 92            8 1.428e-02
## 93            8 1.428e-02
## 94            6 1.071e-02
## 95            4 7.140e-03
## 97            5 8.925e-03
## 98            7 1.250e-02
## 99          138 2.463e-01
## Total     56021 1.000e+02
  issp2009r$age=set_na(issp2009r$age, na=c(99)) 

a) Datos nivel 2 generados a partir de datos individuales

En este caso se habla también de datos “agregados” o “colapsados”. Para agregar, utilizaremos primero una función simple para hacerlo en base al promedio

Por ejemplo, agregar a la base de datos el promedio de edad por país (v5)

issp2009r = issp2009r %>%  group_by(v5) %>% mutate(meanage = mean(age, na.rm = TRUE))

# Otros posibles agregados:
  
  # Desviación estándar
    issp2009r = issp2009r %>%  group_by(v5) %>% mutate(sdage = sd(age, na.rm = TRUE))
  # Tamaño
    issp2009r = issp2009r %>%  group_by(v5) %>% mutate(count = length(v5))

# Visualizar datos en tabla
  issp2009r %>% group_by(Country=to_label(v5)) %>% summarise("Mean Age"=mean(meanage), "SD Age"=mean(sdage), N=mean(count)) %>% print(n = nrow(.))  
## # A tibble: 41 x 4
##                                   Country `Mean Age` `SD Age`     N
##                                    <fctr>      <dbl>    <dbl> <dbl>
##  1                           AR-Argentina   46.67696 17.48260  1133
##  2                           AU-Australia   52.53437 16.77629  1525
##  3                             AT-Austria   45.06477 17.08093  1019
##  4                             BE-Belgium   48.88430 17.63474  1115
##  5                            BG-Bulgaria   49.12638 17.24295  1000
##  6                               CL-Chile   46.56146 17.63539  1505
##  7                               CN-China   43.01661 14.12625  3010
##  8                              TW-Taiwan   44.81293 16.59189  2026
##  9                             HR-Croatia   45.70833 17.56166  1201
## 10                              CY-Cyprus   42.62400 15.41487  1000
## 11                      CZ-Czech Republic   46.78803 16.78173  1205
## 12                             DK-Denmark   50.20817 16.95529  1518
## 13                             EE-Estonia   50.94428 18.76131  1005
## 14                             FI-Finland   47.61889 16.46157   880
## 15                              FR-France   55.06425 15.66263  2817
## 16                             DE-Germany   49.55115 17.89945  1395
## 17                             HU-Hungary   46.16931 15.92985  1010
## 18                             IS-Iceland   46.05597 17.34253   947
## 19                              IL-Israel   43.45118 17.53211  1193
## 20                               IT-Italy   48.32986 17.05597  1084
## 21                               JP-Japan   49.22145 17.58666  1296
## 22                         KR-South Korea   43.50534 15.24948  1599
## 23                              LV-Latvia   44.36109 16.95700  1069
## 24                           LT-Lithuania   51.47937 18.44074  1023
## 25                         NZ-New Zealand   50.57589 17.00656   935
## 26                              NO-Norway   48.00000 15.22970  1246
## 27                         PH-Philippines   42.48000 16.09696  1200
## 28                              PL-Poland   45.95487 17.10345  1263
## 29                            PT-Portugal   49.37500 18.11283  1000
## 30                              RU-Russia   46.83344 18.41932  1603
## 31                            SK-Slovakia   46.26603 16.33037  1159
## 32                            SI-Slovenia   46.65540 17.82134  1065
## 33                        ZA-South Africa   39.33222 15.67957  3305
## 34                               ES-Spain   47.09383 17.89235  1215
## 35                              SE-Sweden   48.45734 16.34343  1137
## 36                         CH-Switzerland   50.06509 17.66004  1229
## 37                              TR-Turkey   41.19066 15.47256  1569
## 38                             UA-Ukraine   48.16352 17.65118  2012
## 39 GB-Great Britain and/or United Kingdom   50.13375 17.19835   958
## 40                       US-United States   49.52659 17.07174  1581
## 41                           VE-Venezuela   36.78535 15.05744   969
# Exploración gráfica
bar_age=ggplot(issp2009r, aes(reorder(to_label(v5), -meanage),meanage))
bar_age + geom_bar(stat = "summary") + 
  coord_flip() +
  theme(axis.text=element_text(size=5),
        axis.title=element_text(size=10,face="bold")) + 
  labs(x=" ", y="Age ")
## No summary function supplied, defaulting to `mean_se()

box_age= ggplot(issp2009r, aes(reorder(to_label(v5), -meanage),age)) 
box_age + geom_boxplot() +  
  coord_flip() + 
  theme(axis.text=element_text(size=5),
        axis.title=element_text(size=10,face="bold")) + 
  labs(x=" ", y="Age ")
## Don't know how to automatically pick scale for object of type labelled. Defaulting to continuous.
## Warning: Removed 138 rows containing non-finite values (stat_boxplot).

b) Datos nivel 2 externos

Para esto usaremos la base del Quality of Government Indicators (QoG). La base es algo pesada, bajar directamente del sitio original: http://www.qogdata.pol.gu.se/data/qog_std_ts_jan17.dta

qog=read_stata("/media/ntfs/Dropbox/proyectos y papers compartidos/Meritocracy and preferences/meritocracy_pref_international/data/qog/qog_std_ts_jan17.dta")

dim(qog) # tenemos 2070 variables para 14981 filas (países/años)
## [1] 14981  2070
qog %>% group_by(cname) %>% summarise() # 211 países
## # A tibble: 211 x 1
##                  cname
##                  <chr>
##  1         Afghanistan
##  2             Albania
##  3             Algeria
##  4             Andorra
##  5              Angola
##  6 Antigua and Barbuda
##  7           Argentina
##  8             Armenia
##  9           Australia
## 10             Austria
## # ... with 201 more rows
qog %>% group_by(year) %>% summarise() # 71 años países
## # A tibble: 71 x 1
##     year
##    <dbl>
##  1  1946
##  2  1947
##  3  1948
##  4  1949
##  5  1950
##  6  1951
##  7  1952
##  8  1953
##  9  1954
## 10  1955
## # ... with 61 more rows
211*71 # número de filas
## [1] 14981
    # Extract 2009 data
        qog2009=qog %>% filter(year==2009) %>% select(wdi_gini,cname)   
        qog2009 %>% group_by(cname) %>% na.omit() %>% summarise_all(mean)
## # A tibble: 74 x 2
##           cname wdi_gini
##           <chr>    <dbl>
##  1    Argentina    45.27
##  2      Armenia    29.58
##  3      Austria    31.50
##  4      Belarus    27.69
##  5      Belgium    28.70
##  6      Bolivia    49.65
##  7     Botswana    60.46
##  8       Brazil    53.87
##  9     Bulgaria    33.82
## 10 Burkina Faso    39.76
## # ... with 64 more rows
        names(qog2009)
## [1] "wdi_gini" "cname"

El procedimiento ahora corresponde a un “merge”, que como sabemos requiere un vector (variable) que identifique de la misma manera en ambas bases de datos a los casos presentes, en este caso países.

En general no es fácil que en ambas bases de datos exista una columna que identifique de la misma manera a las unidades de nivel 2. Por ejemplo, si son países, puede que estos se identifiquen por un código diferente, o que sus nombres en algunos casos se escriban distinto (ej: con/sin acento, distintos idiomas,etc). Si este es el caso, la opción más básica es la “manual”, es decir, generar una variable en alguna de las bases de datos a combinar que posea valores idénticos a los de la otra base de datos.

Por ejemplo, en la base ISSP la variable de identificación de país es v5, que posee un código y un valor:

issp2009r %>% group_by("Country"=to_label(v5)) %>% summarise("Country code"=mean(v5))
## # A tibble: 41 x 2
##         Country `Country code`
##          <fctr>          <dbl>
##  1 AR-Argentina             32
##  2 AU-Australia             36
##  3   AT-Austria             40
##  4   BE-Belgium             56
##  5  BG-Bulgaria            100
##  6     CL-Chile            152
##  7     CN-China            156
##  8    TW-Taiwan            158
##  9   HR-Croatia            191
## 10    CY-Cyprus            196
## # ... with 31 more rows

En base a esto, se puede generar una variable en la base qog con estos mismos códigos para los países:

str(qog2009$cname)
##  atomic [1:211] Afghanistan Albania Algeria Andorra ...
##  - attr(*, "label")= chr "Country Name"
##  - attr(*, "format.stata")= chr "%29s"
qog2009 %>% group_by(cname) 
## # A tibble: 211 x 2
## # Groups:   cname [211]
##    wdi_gini               cname
##       <dbl>               <chr>
##  1       NA         Afghanistan
##  2       NA             Albania
##  3       NA             Algeria
##  4       NA             Andorra
##  5       NA              Angola
##  6       NA Antigua and Barbuda
##  7       NA          Azerbaijan
##  8    45.27           Argentina
##  9       NA           Australia
## 10    31.50             Austria
## # ... with 201 more rows
# Generar variable para merge igual a la de ISSP
  qog2009$v5=qog2009$cname

# Y ahora recodificar de acuerdo a ISSP
  qog2009$v5=rec(qog2009$cname, rec="Argentina=32;Australia=36") # ... y así para todos
  qog2009 %>% group_by(v5) %>%  select(v5,cname) %>% slice(1:10)
## # A tibble: 12 x 2
## # Groups:   v5 [3]
##       v5               cname
##    <dbl>               <chr>
##  1    32           Argentina
##  2    36           Australia
##  3    NA         Afghanistan
##  4    NA             Albania
##  5    NA             Algeria
##  6    NA             Andorra
##  7    NA              Angola
##  8    NA Antigua and Barbuda
##  9    NA          Azerbaijan
## 10    NA             Austria
## 11    NA             Bahamas
## 12    NA             Bahrain

Luego, cuando la variable esté lista, se puede hacer el merge. Pero antes de mostrar el procedimiento de merge, veamos otra posibilidad que nos ahorra la recodificación al trabajar con países, que es mediante la librería “countrycode”, diseñada específicamente para estos casos. Para utilizarla, se requiere tener claro los formatos de las variables de input y de output. En este caso, el input es la variable que viene en la base de datos (nombre de los países en qog2009),y queremos el output con los códigos en que vienen los países en ISSP (v5).

La base ISSP (ver codebook) sigue el estandar ISO-3166 para los códigos y labels de los países, que es uno de los formatos tradicionales para codificar países. Este entonces es el output que queremos generar en la base qog2009 para luego realizar el merge.

pacman::p_load(countrycode)
qog2009$v5=countrycode(qog2009$cname, 'country.name','iso3n') # iso3n es ISO-3,para detalles ver documentación librería ?countrycode
## Warning in countrycode(qog2009$cname, "country.name", "iso3n"): Some values were not matched unambiguously: Germany, East, Germany, West, Korea, North, Micronesia, Serbia and Montenegro, Tibet, Yemen, North, Yugoslavia
## Warning in countrycode(qog2009$cname, "country.name", "iso3n"): Some strings were matched more than once, and therefore set to <NA> in the result: Germany, West,280,276
qog2009 %>% group_by(v5) %>%  select(v5,cname) %>% slice(1:10)
## # A tibble: 211 x 2
## # Groups:   v5 [195]
##       v5               cname
##    <int>               <chr>
##  1     4         Afghanistan
##  2     8             Albania
##  3    12             Algeria
##  4    20             Andorra
##  5    24              Angola
##  6    28 Antigua and Barbuda
##  7    31          Azerbaijan
##  8    32           Argentina
##  9    36           Australia
## 10    40             Austria
## # ... with 201 more rows

(Se generan algunos warnings por países no transformados, tener en cuenta por si luego falta información).

Ahora que tenemos una variable identica para los países en ambas bases de datos, es posible realizar el merge de ambas bases:

data_tot <- merge(issp2009r,qog2009,by=c("v5"))

# Para ver el resultado
  data_tot %>% group_by("Country"=cname) %>% summarise("Country code"=mean(v5),"Gini"=mean(wdi_gini)) 
## # A tibble: 44 x 3
##           Country `Country code`  Gini
##             <chr>          <dbl> <dbl>
##  1      Argentina             32 45.27
##  2      Australia             36    NA
##  3        Austria             40 31.50
##  4        Belgium             56 28.70
##  5       Bulgaria            100 33.82
##  6          Chile            152 52.00
##  7          China            156    NA
##  8        Croatia            191 33.18
##  9 Cyprus (-1974)            196    NA
## 10 Cyprus (1975-)            196 32.11
## # ... with 34 more rows

Atención: vemos que hay missings para algunos países en la variable Gini, probablemente porque para ese año no hay información del indicador, eventualmente se puede recurrir a otras fuentes de información para completar.

Ejemplo de gráfico descriptivo de asociación entre variables nivel 1 y nivel 2

Vamos a considerar la variable de esfuerzo (issp) según desigualdad (qog).

names(data_tot)
##  [1] "v5"       "v10"      "sex"      "age"      "effort"   "meanage" 
##  [7] "sdage"    "count"    "wdi_gini" "cname"
dat_scat=data_tot %>% group_by(v5) %>% select(wdi_gini,effort) %>% na.omit() %>% summarise_all(mean)
## Adding missing grouping variables: `v5`
names(dat_scat)
## [1] "v5"       "wdi_gini" "effort"
sjp.scatter(dat_scat$wdi_gini, dat_scat$effort,
            dot.labels = to_label(dat_scat$v5),
            fit.line = TRUE,
            show.ci = TRUE
            )

Para identificar mejor los países, podemos también usar la librería countrycode y generar una variable que contenga los nombres de países abreviados en 3 letras (formato iso3c)

data_tot$country3=countrycode(data_tot$v5,'iso3n','iso3c')

dat_scat2=data_tot %>% group_by(country3) %>% na.omit() %>% 
select(wdi_gini,effort,country3) %>% summarise_all(mean)

sjp.scatter(dat_scat2$wdi_gini, dat_scat2$effort,
            dot.labels = to_label(dat_scat2$country3),
            fit.line = TRUE,
            show.ci = TRUE
            )