1 Introducción

R y RStudio constituyen herramientas muy populares tanto para el manejo de bases de datos como para el análisis de las mismas, sin embargo la presente guía abarca únicamente las operaciones y comandos básicos que a manera de introducción pueden guiar en los primeros pasos de un estudiante de Econometría.

2 Recomendaciones de uso

Utilizar siempre letras minúsculas, sin tildes, ni caracteres especiales. Determinar separaciones con comas (,). Determinar decimales con puntos (.).

3 Creación de objetos

En el contexto de RStudio se entiende por objeto cualquier elemento que sea “cargado” en la interfaz para su uso. Los objetos por tanto, podrían ser elementos numéricos tales como escalares o mejor aún elementos más “extensos” como bases de datos.

3.1 Escalares

Entendemos por escalares aquellos números caracterizados únicamente por su valor numérico y su unidad. Para “crearlos” dentro de RStudio podemos utilizar los siguientes comandos:

escalar1 <- 3
escalar2 <- 5

En el ejemplo mostrado se ha asignado al objeto escalar1 eln valor de 3 y al escalar2 el valor de 5.

escalar1
## [1] 3

3.2 Operaciones

Otra de las ventajas de RStudio es su capacidad de trabajar como calculadora.

escalar1 + escalar2 
## [1] 8
escalar3 <- escalar1 + escalar2
escalar3 <- escalar1 + escalar2
escalar4 <- escalar3 * escalar2
escalar5 <- escalar4 / escalar1

3.3 Visualización de objetos

Para conocer el valor de cada objeto basta con “llamarlo”.

escalar1
## [1] 3

Aunque también se puede usar los siguientes comandos:

escalar5
## [1] 13.33333
summary(escalar5)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   13.33   13.33   13.33   13.33   13.33   13.33
table(escalar5)
## escalar5
## 13.3333333333333 
##                1

3.4 Vectores

Para configurar un vector se requiere usar la siguiente estructura:

vect1 <- c(2,1.5,4) #vector numérico
vect2 <- c("Juan","Pedro","Sara") #vector de caracteres
vect3 <- c(7,6,2) #vector numérico

Para realizar operaciones con vectores se pueden emplear operaciones algebraicas.

prd1 <- vect1 *escalar4 #multiplica el vector1 por el escalar4

Para realizar cambios en los vectores se pueden usar los siguientes comandos:

vect1[2] #devuelve el valor de la posición 2 del vector1
## [1] 1.5
vect2[3] #devuelve el valor de la posición 3 del vector2
## [1] "Sara"
objeto1 <- vect3[1] #crea el objeto1 con el valor de la posición 1 del vector3 
objeto2 <- vect2[2:3] #crea el objeto2 con los valores de las posiciones 2 y 3 del vector2
objeto3 <- vect2[1:2] #crea el objeto3 con los valores de las posiciones 1 y 2 del vector2
objeto4 <- vect2[c(1,3)] #crea el objeto4 solo con los valores de las posiciones 1 y 3 del vector2
objeto4
## [1] "Juan" "Sara"
objeto4_f2 <- vect2[-2] #crea el objeto4_f2 excluyendo el valor de las posición 2 del vector2
objeto4_f2
## [1] "Juan" "Sara"

3.5 Matrices

Para conformar matrices se pueden organizar sus respectivos vectores. Primero se establecen los vectores:

vector1 <- c(1,2,3)
vector2 <- c(4,5,6)
vector3 <- c(7,8,9)

Para armar columnas en matrices se las puede “unir” así:

matrizA <- cbind(vector1,vector2,vector3) #crea una matriz donde cada columna es un vector.
matrizA
##      vector1 vector2 vector3
## [1,]       1       4       7
## [2,]       2       5       8
## [3,]       3       6       9

Para armar filas en matrices se las puede “unir” de esta manera:

matrizB <- rbind(vector1,vector2,vector3) #crea una matriz donde cada fila es un vector.
matrizB
##         [,1] [,2] [,3]
## vector1    1    2    3
## vector2    4    5    6
## vector3    7    8    9

4 Bases de datos (data frames)

Para crear bases de datos se puede emplear la siguiente forma:

base1 <- as.data.frame(matrizA) 
base1
##   vector1 vector2 vector3
## 1       1       4       7
## 2       2       5       8
## 3       3       6       9
base2 <- as.data.frame(matrizB)
base2
##         V1 V2 V3
## vector1  1  2  3
## vector2  4  5  6
## vector3  7  8  9

Para seleccionar objetos en bases de datos se puede seleccionar las variables antecediendo el símbolo $.

base1$vector1
## [1] 1 2 3

Para cambiar de nombre a las variables se puede usar el comando name.

nombre_vectores <- c("variable1","variable2","variable3") #cambia los nombres de los Vx por "variablex"
names(base1) <- nombre_vectores #asigna los nombres de de las variables a la base1
base1
##   variable1 variable2 variable3
## 1         1         4         7
## 2         2         5         8
## 3         3         6         9

4.1 Carga de bases de datos internas

Antes de iniciar un nuevo ejercicio se recomienda “limpiar” la consola.

rm(list = ls()) #limpia la consola

Para la ejecución de código, en muchos casos se requiere instalar y cargar las librerías necesarias. La instalación de librerías se realiza de la siguiente forma:

install.packages('readxl') #instala la librería readxl que permite importar datos desde Microsoft Excel

La carga de librerías se ejecuta con el comando library

library(readxl) #carga la librería readxl
library(dplyr) #carga la librería dplyr
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Para cargar bases de datos incorporadas en RStudio, es decir bases de datos internas se realiza lo siguiente:

base <- mtcars #carga la base de datos de datos interna mtcars y la asigna a base 
base
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
## Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

4.2 Filtrado de bases de datos

A continuación se mostrarán 3 formas de filtrar bases de datos:

4.2.1 Primera forma: comando subset

Utiliza la estructura: subset(base, columna_de_la_base + operador_condicional + valor_para_filtrar)

base1_f1 <- subset(base, base$cyl > 4) #filtra los datos menores a 4 de la columna cyl
base1_f1
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.2.2 Segunda forma: matricial

Utiliza la estructura: base(columna_de_la_base + operador_condicional + valor_para_filtrar, dejar en blanco apra aplicar a todas las columnas)

base1_f2 <- base[base$cyl>4,] #elimina 
base1_f2
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.2.3 Tercera forma: comando dplyr

Utiliza la estructura: base Ctrl+Shif+M filter(columna_de_la_base + operador_condicional + valor_para_filtrar)

base1_f3 <- base %>% #el sìmbolo %>% se condigue con Ctrl+Shift+M
  filter(cyl>4) #filtra la columna cyl para valores mayores a 4
base1_f3
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.2.4 Ejemplos de filtrado

4.2.4.1 Ejemplo 1:

Quédese con los vehículos que tienen menos de 4 y más de 6 cilindros.

base_ejemplo1 <- base[base$cyl < 4 | base$cyl > 6,]
base_ejemplo1 
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.2.4.2 Ejemplo 2:

Quédese con los vehiculos que tienen una potencia entre 100 y 200 Hp.

base_ejemplo2 <- subset(base, base$hp>100 & base$hp<200)
base_ejemplo2 
##                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
## Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
## Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
## Merc 280C         17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
## Merc 450SE        16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
## Merc 450SL        17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
## Merc 450SLC       15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
## Dodge Challenger  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
## AMC Javelin       15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
## Pontiac Firebird  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
## Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
## Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
## Volvo 142E        21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

4.2.4.3 Ejemplo 3:

Quédese con los vehiculos que tienen una potencia menor a 100 y mayor a 200 Hp.

base_ejemplo3 <- base[base$hp<100 | base$hp >200,]
base_ejemplo3 
##                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.3 Cálculo de la media

Se utiliza el comando mean y se puede asignar la columna con los datos a promediar.

mean(base_ejemplo3$wt) #calcula el promedio de la columna wt
## [1] 3.188687

4.4 Cambio de nombre de una columna en una base de datos

names(base_ejemplo3)[2] <- 'cilindros' #cambia el nombre de la columna 6 por "cilindros"
base_ejemplo3 
##                      mpg cilindros  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710          22.8         4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Duster 360          14.3         8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4         4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8         4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Cadillac Fleetwood  10.4         8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4         8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7         8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4         4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4         4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9         4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5         4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Camaro Z28          13.3         8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Fiat X1-9           27.3         4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0         4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Ford Pantera L      15.8         8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Maserati Bora       15.0         8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.5 Reemplazar valores inexistentes

Algunas bases de datos registran los valores faltantes con las letras “na”. Para evitar errores se recomienda reemplazar estas siglas por ceros.

base_ejemplo3[is.na(base_ejemplo3)]<- 0
base_ejemplo3 
##                      mpg cilindros  disp  hp drat    wt  qsec vs am gear carb
## Datsun 710          22.8         4 108.0  93 3.85 2.320 18.61  1  1    4    1
## Duster 360          14.3         8 360.0 245 3.21 3.570 15.84  0  0    3    4
## Merc 240D           24.4         4 146.7  62 3.69 3.190 20.00  1  0    4    2
## Merc 230            22.8         4 140.8  95 3.92 3.150 22.90  1  0    4    2
## Cadillac Fleetwood  10.4         8 472.0 205 2.93 5.250 17.98  0  0    3    4
## Lincoln Continental 10.4         8 460.0 215 3.00 5.424 17.82  0  0    3    4
## Chrysler Imperial   14.7         8 440.0 230 3.23 5.345 17.42  0  0    3    4
## Fiat 128            32.4         4  78.7  66 4.08 2.200 19.47  1  1    4    1
## Honda Civic         30.4         4  75.7  52 4.93 1.615 18.52  1  1    4    2
## Toyota Corolla      33.9         4  71.1  65 4.22 1.835 19.90  1  1    4    1
## Toyota Corona       21.5         4 120.1  97 3.70 2.465 20.01  1  0    3    1
## Camaro Z28          13.3         8 350.0 245 3.73 3.840 15.41  0  0    3    4
## Fiat X1-9           27.3         4  79.0  66 4.08 1.935 18.90  1  1    4    1
## Porsche 914-2       26.0         4 120.3  91 4.43 2.140 16.70  0  1    5    2
## Ford Pantera L      15.8         8 351.0 264 4.22 3.170 14.50  0  1    5    4
## Maserati Bora       15.0         8 301.0 335 3.54 3.570 14.60  0  1    5    8

4.6 Visualización de cantidad de observaciones por variable

table(base_ejemplo3$hp) #genera una tabla ordenada de los datos de la variable solicitada
## 
##  52  62  65  66  91  93  95  97 205 215 230 245 264 335 
##   1   1   1   2   1   1   1   1   1   1   1   2   1   1

4.7 Carga de una base de datos externa

Para utilizar otras bases de datos en formato .xlsx o en formato .csv podemos emplear los comandos siguientes:

base <- read_excel('insumos/pib_can_anual.xlsx') #para archivos excel
base <- read.csv('insumos/base_final.csv') #para valores separados por comas

4.8 Operaciones en la base de datos

Para seleccionar solo una variable se puede emplear:

base_santo <- base %>% 
  filter(dpa_prov == "23") #indica la variable para el filtro

Para trabajar solamente con los valores de la variable filtrada:

base_manabi <- base %>% 
  filter(prov == "MANABÍ") #selecciona solo los valores de la variable filtrada

Para mantener únicamente las variables necesarias para el análisis

names(base_manabi) 
base_manabi <- base_manabi %>%
  select(year, prov, dpa_prov, canton, dpa_can, agricultura,`Explotacion de minas y canteras`) #selecciona solo las variables deseadas

Con el comando summary se obtiene la vista resumen de una variable.

summary(base_manabi$ agricultura)

Para eliminar una variable que se encuentre en la última columna de la base, se puede eliminar su respectiva columna. En el siguiente ejemplo se dejará en blanco el espacio antes de la coma para dejar sin cambios las columnas anteriores a la última.

base_manabi1 <- base_manabi[,-7]

4.8.1 Creación de una variable dicotómica

Se lleva a cabo mediante el comando mutate

base_manabi1 <- base_manabi1 %>% 
  mutate(tipo_pib = ifelse(agricultura > 29351, "pib_alto","pib_bajo"))

Adicionalmente se puede agregar otro formato binario para la variable dicotómica

base_manabi1 <- base_manabi1 %>% 
  mutate(tipo = ifelse(agricultura > 29351, "1","0"))

También es posible crear variables que filtren los periodos deseados. Para el ejemplo se creará una nueva variable pre terremoto y post terremoto de Manabí 2016.

base_manabi1 <- base_manabi1 %>% 
  mutate(periodo = ifelse(year < 2016, "pre","post"))

De esta manera se puede separar la base de datos por periodos.

base_manabi_pre <-base_manabi1 %>% 
  filter(periodo == "pre")
base_manabi_post <-base_manabi1 %>% 
  filter(periodo == "post")

4.8.2 Obtención de agregados por variables

Para el ejemplo procederemos a sumar el PIB de agricultura por Cantón teniendo en cuenta los periodos pre y post evento de Manabí.

b_m_pre_agg <- base_manabi_pre %>% 
  group_by(canton) %>% 
  summarise(total_agricultura_pre = sum(agricultura))
b_m_post_agg <- base_manabi_post %>% 
  group_by(canton) %>% 
  summarise(total_agricultura_post = sum(agricultura))

5 Regresiones lineales

Las regresiones lineales tienen pora base la Ecuación de la recta y su finalidad es encontrar el modelo que mejor la satisface con respecto a un conjunto de datos. Adicionalmente para la ecuación buscada se tendrán en cuenta los errores en las distancias desde cada punto (dato) a la recta. En resumen: mediante la resgresión lineal se busca el modelo que mejor explica la base de datos.

Para prevenir la aparición de resultados en notación científica, previamente ejecutaremos el comando options.

options(scipen = 999)

Ecuación de la recta como modelo de regresión lineal: \(y = B1 + B2*x + u\)

A modo de ejemplo buscaremos la regresión lineal como relación entre las variables consumo e ingreso disponible: \(C = B1 + B2*Y + u\)

Si llamamos modelo a la regresión lineal entre la variable “consumo” (C) y la variable “ingreso_disponible” (Y), se realizará de la siguiente forma:

modelo <- lm(consumo ~ ingreso_disponible, data = base)

El resultado obtenido con el comando summary(modelo) sería:

lm(formula = consumo ~ ingreso_disponible, data = base)

Residuals:
        Min          1Q      Median          3Q         Max 
-4901431887 -1069569495  -195228251  1233327995  6870277166 

Coefficients:
                            Estimate        Std. Error t value
(Intercept)        14165415645.32893   935246532.56462   15.15
ingreso_disponible           0.68472           0.01397   49.01
                              Pr(>|t|)    
(Intercept)        <0.0000000000000002 ***
ingreso_disponible <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2450000000 on 43 degrees of freedom
Multiple R-squared:  0.9824,    Adjusted R-squared:  0.982 
F-statistic:  2402 on 1 and 43 DF,  p-value: < 0.00000000000000022

5.1 Variables logarítmicas

Para aplicar variables logarítmicas podemos utilizar las funciones mutate y log.

base <- base %>% 
  mutate(ln_consumo = log(consumo),
         ln_ingreso_disponible = log(ingreso_disponible2))

Obteniendo los siguientes resultados:

Call:
lm(formula = ln_consumo ~ ln_ingreso_disponible, data = base)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.113225 -0.021156  0.005125  0.031844  0.124035 

Coefficients:
                      Estimate Std. Error t value            Pr(>|t|)    
(Intercept)            6.70498    0.45862   14.62 <0.0000000000000002 ***
ln_ingreso_disponible  0.72715    0.01852   39.26 <0.0000000000000002 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.05187 on 43 degrees of freedom
Multiple R-squared:  0.9729,    Adjusted R-squared:  0.9722 
F-statistic:  1541 on 1 and 43 DF,  p-value: < 0.00000000000000022

5.2 Intervalos de confianza

Para determinar los intervalos de confianza se puede usar la función confint obteniendo el resultado siguiente:

confint(modelo)
                                 2.5 %              97.5 %
(Intercept)        12279311258.7509937 16051520031.9068737
ingreso_disponible           0.6565423           0.7128939

5.3 Indicadores

La lógica de cualquier indicador es una proporción o porcentaje. Un indicador se puede ejemplificar como:

\(I = (cantidad de observaciones con cierta caracteristica ) / (total de poblacon de interes)\)

Si y solo si tenemos el total de la población o la muestra provenga de un muestreo aleatorio simple. Un Muestreo Aleatorio Simple (MAS) al menos requiere: 1. Un listado de todos los elementos de la población; 2. Que la probabilidad de selección sea la misma para todos los individuos, y 3. Que el resultado sea representativo de la población.

5.4 Variables rezagadas

Se consideran rezagadas aquellas variables cuyos efectos se observan en periodos posteriores a su ocurrencia. Para implementarlas se puede usar el comando lag.

Supongamos un modelo con la hipótesis de que el aumento del Riesgo país disminuye la inversión extranjera directa. \(Modelo: IED = B1 + B2*RP + u\)

names(base)
modelo_ied <- lm(IED_MillonesUSD ~ RiesgoPais, data = base)
summary(modelo_ied)

Resultando en:

Call:
lm(formula = IED_MillonesUSD ~ RiesgoPais, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-317.37  -55.76  -16.82   54.14  279.09 

Coefficients:
             Estimate Std. Error t value       Pr(>|t|)    
(Intercept) 229.89653   29.74552   7.729 0.000000000129 ***
RiesgoPais   -0.04321    0.02458  -1.758         0.0838 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 107.9 on 61 degrees of freedom
Multiple R-squared:  0.04821,   Adjusted R-squared:  0.0326 
F-statistic: 3.089 on 1 and 61 DF,  p-value: 0.08382

Considerando que la Inversión extranjera directa no se efectúa de manera inmediata, entonces se vuelve necesario incluir un rezago en la acción de la variable Riesgo país.

Hipótesis: RP de (t-1) afecta la IED en un (t)

base<- base %>% 
  mutate(ied_rezagado1 = lag(IED_MillonesUSD, n=1),
         rp_rezagado1 = lag(RiesgoPais, n=1))

names(base)
model_ied_lag1 <- lm(IED_MillonesUSD ~ rp_rezagado1, data = base) 

Obteniéndose:

Call:
lm(formula = IED_MillonesUSD ~ rp_rezagado1, data = base)

Residuals:
    Min      1Q  Median      3Q     Max 
-319.35  -55.08  -20.33   52.81  271.41 

Coefficients:
              Estimate Std. Error t value      Pr(>|t|)    
(Intercept)  208.40204   30.70883   6.786 0.00000000578 ***
rp_rezagado1  -0.02284    0.02527  -0.904          0.37    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 110.7 on 60 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.01343,   Adjusted R-squared:  -0.003015 
F-statistic: 0.8167 on 1 and 60 DF,  p-value: 0.3698

6 Manejo de encuestas

Para el manejo de encuestas será necesarias la instalación de las siguientes librerías:

library("dplyr")

library("srvyr")

library("rio")

library("import") #para archivos de spss o .dta

Luego de la carga de la base, se procede a realizar el diseño muestral dm. Para el ejemplo se utilizará una base con datos oficiales sobre desnutrición crónica infantil en Ecuador para el año 2018.

dm <- personas %>%                     #diseño muestral de la base personas
  as_survey_design(ids = upm,          #unidad primaria de muestreo, viene del diccionario de variables de la base
                   strata = estrato,   #el estrato a usar, viene de la base
                   weights = fexp)     #el factor de expansion, viene de la base
options(survey.lonely.psu = "certainty") #para forzar que las observaciones sean unicas e individuales

Una vez realizado el diseño muestral se puede determinar la prevalencia de la variable requerida.

prev_nac_dci2 <- dm %>% 
  summarise(survey_mean(dcronica_2, vartype = c("se", "cv"), na.rm = T),
            n_muestra =sum(!is.na(dcronica_2))) %>% 
  mutate(dominio = "Nacional") %>% 
  select(dominio, porcentaje = coef, se = `_se`, cv =`_cv`, n_muestra) %>% 
  mutate(porcentaje = round((porcentaje*100), digits = 1))

Como resultado se obtendría la siguiente tabla:

dominio porcentaje se cv n_muestra
Nacional 27.2 0.009166789 0.03373667 7801

6.1 Actividades con indicadores

Para replicar indicadores podemos utilizar las librerías:

library(haven)

library(tidyverse)

Como ejemplo realizaremos la evaluación de la tasa de desempleo a nivel nacional con los datos del estudio ENEMDU del II trimestre de 2025

tasa_desempleo_nac <- dm %>% 
  filter(p03 >= 15) %>%   #filtra para que aplique en la población de 15 años en adelante
  summarise(
    tasa_desempleo = survey_ratio(
     numerator=(condact == 7 | condact == 8),  #utilizando el diccionario de la base de datos se aplican los códigos que pertenezcan al desempleo  
     denominator=(condact %in% 1:8),       #para que la condicion actual se encuentre entre 1 y 8
     vartype = c("se", "ci")     #configuran el error estandar y el intervalo de confianza
     )
  )

print(tasa_desempleo_nac)

Como resultado se obtiene:

tasa_desempleo tasa_desempleo_se tasa_desempleo_low tasa_desempleo_upp
0.0388 0.00239 0.0341 0.0435

Para obtener el resultado como porcentaje con 1 decimal se emplea el comando round

tasa_desempleo_nac$tasa_desempleo <- round((tasa_desempleo_nac$tasa_desempleo*100), digits =1)
tasa_desempleo
3.9

Para el caso de la tasa de empleo adecuado, se puede realizar lo siguiente:

library(haven)
library(tidyverse)

tasa_empleo_adecuado <- dm %>% 
  filter(p03 >= 15) %>%   #se filtra para que aplique en la población de 15 en adelante
  summarise(
    tasa_empleo_adecuado = survey_ratio(
      numerator=(condact == 1),  #que pertenezcan al desempleo abierto o que la condicion actual sea igual a 8  
      denominator=(condact %in% 1:8),       #que la condicion actual este entre 1 y 8
      vartype = c("se", "ci")     #se coloca el error estandar y el intervalo de confianza
    )
  )

print(tasa_empleo_adecuado)

tasa_empleo_adecuado$tasa_empleo <- round((tasa_empleo_adecuado$tasa_empleo_adecuado*100), digits =1)
tasa_de empleo
36.2

Con las mismas consideraciones se puede encontrar otras variables como las tasas de subempleo o de empleo no remunerado.