1 Creación de objetos

1.1 Escalares

Un escalar es un número, o una magnitud expresada en una sola dimensión. Para asignar un escalar, por ejemplo el número 3, a un objeto, por ejemplo escalar1, se puede utilizar el siguiente c[odigo:

escalar1<-3

Para conocer el valor del objeto escalar1, basta con “invocarlo”, es decir, escribir su nombre, de la siguiente forma:

escalar1
## [1] 3

1.2 Operaciones

Con los objetos en R se pueden realizar operaciones, por ejemplo, operaciones aritm[eticas simples.] Para ello, crearemos un escalar m[as]:

escalar2<-4

Ahora podemos realizar operaciones entre estos dos escalares. Esas operaciones nos dar[an como resultado otros escalares que, a su vez, podremos asignarlos a nuevos objetos:

escalar1+escalar2
## [1] 7
escalar3<-escalar1+escalar2
escalar4<-escalar3*escalar2
escalar5<-escalar4/escalar1
escalar4
## [1] 28
escalar5
## [1] 9.333333

Para mostrar un resumen de las estad[isticas descriptivas de un objeto se puede recurrir a la funci[on summary() y para ver el objeto en formato tabular se puede usar la funci[on table():

summary(escalar5)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   9.333   9.333   9.333   9.333   9.333   9.333
table(escalar5)
## escalar5
## 9.33333333333333 
##                1

1.3 Vectores

Un vector es una magnitud en varias dimensiones. Para crear un vector y asignarlo a un objeto a partir de sus elementos, se puede utilizar la funci[on c()(de concatenar), de la siguiente forma:

vect1<-c(2,1.5,4)
vect2<-c("Juan","Pedro","Sara")
vect3<-c(5,6,2)

De esta forma, tenemos un vector1 formado por lo elementos num[ericos 2, 1, 5y 4, un vector2formado por lo elementos Juan, Pedroy Sara.

vect1
## [1] 2.0 1.5 4.0
vect2
## [1] "Juan"  "Pedro" "Sara"
vect3
## [1] 5 6 2

Tambi[en se pueden realizar operaciones entre estos vectores y escalares, por ejemplo:

prd1<-vect1*escalar4
prd1
## [1]  56  42 112

Donde prd1no es otra cosa que cada elemento del vect1multiplicado por el ``èscalar4```.

1.3.1 Ubicaci[on

Cada elemento de un vector tiene asignada una ubicación, en el caso de un vector, para llamar un elemento del vector basta con usar el nombre del vector y la ubicación del elemento entre corchete. sí, por ejemplo:

vect1[2]
## [1] 1.5
vect1
## [1] 2.0 1.5 4.0
vect2[3]
## [1] "Sara"
vect2
## [1] "Juan"  "Pedro" "Sara"

Y podemos crear objetos asignándoles estos elementos:

objeto1<-vect3[1]
objeto1
## [1] 5

Objetos que podrían ser otros vectores

objeto2<-vect2[2:3]
objeto2
## [1] "Pedro" "Sara"
objeto3<-vect2[1:2]
objeto3
## [1] "Juan"  "Pedro"

Las siguientes expresiones generan dos objetos idénticos:

objeto4<-vect2[c(1,3)]
objeto4
## [1] "Juan" "Sara"
objeto4_2<-vect2[-2]
objeto4_2
## [1] "Juan" "Sara"

1.4 Matrices

Las matrices son conjuntos de elementos dispuestos en filas (rows) y columnas (columns). Cada una de estas filas o de estas columnas pueden ser entendidas como vectores. De esta forma, suponiendo tres vectores:

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

Puedo generar una matriz en la que cada uno de estos vectores sea una columna:

matrizA<-cbind(vector1,vector2,vector3)
matrizA
##      vector1 vector2 vector3
## [1,]       1       4       7
## [2,]       2       5       8
## [3,]       3       6       9

O una en la que cada uno de esos vectores sea una fila:

matrizB<-rbind(vector1,vector2,vector3)
matrizB
##         [,1] [,2] [,3]
## vector1    1    2    3
## vector2    4    5    6
## vector3    7    8    9

Así como se pueden llamar elementos de vectores, se pueden llamar elementos (escalares o vectores) de otras matrices:

vectorB<-matrizA[3]
vectorC<-matrizB[,2]
vectorD<-matrizB[1,-2]
vectorB
## [1] 3
vectorC
## vector1 vector2 vector3 
##       2       5       8
vectorD
## [1] 1 3

###Bases de datos a partir de matrices Se pueden convertir matrices en bases de datos, lo que puede facilitar su manejo:

base1<-as.data.frame(matrizA)
base2<-as.data.frame(matrizB)

1.4.1 Ingresar a objetos en bases de datos (tomar variables con $)

En una base de datos, el acceso no se da por la ubicación de los elementos, sino por lo campos (columnas) a través de $. Por ejemplo,

base1$vector1
## [1] 1 2 3

Podemos saber cuáles son los nombres de los campos a través de la función names():

names(base1)
## [1] "vector1" "vector2" "vector3"

1.4.2 Cambiar de nombre a variables dentro de una base de datos

Esto nos permite también sustituir los nombres de los campos, quizás para asignar algunos que nos sean más fáciles de manipular en líneas de código.

nombre_vectores<-c("variable1","variable2","variable3")
names(base1)<-nombre_vectores

Confirmemos que estén cambiados esos nombres:

names(base1)
## [1] "variable1" "variable2" "variable3"

2 Cargar bases de datos internas

R cuenta con algunas bases de datos precargadas. Podemos trabajar con ellas. Por ejemplo, ahora podemos utilizar la base mtcars. Para facilitar su manejo dentro de nuestro código, vamos crear el objeto base que sea la base mtcars.

base<-mtcars
dim(base)
## [1] 32 11

Por las dimensiones de la base (dim(base)), sabemos que tiene 32 observaciones (filas) de las cuales recoge 11 variables (columnas).

Pero ¿qué contiene esta base? R también contiene ayuda acerca de sus distintos objetos. Se puede invocar la ayuda a través de ??, por ejemplo ??mtcars. Esta ayuda nos dará una dscripción general, fuente, dimensiones, diccionario de variables y otros detalles.

2.1 Filtrar información de una base de datos

Creemos una base de datos que parta de mtcars, pero que sólo incluya a los vehículos con más de cuatro cilindros.

##1 forma
base1<-subset(base,base$cyl>4)
##2 forma (matricial)
base1_2<-base[base$cyl>4,]
dim(base1)
## [1] 21 11
dim(base1_2)
## [1] 21 11

Como ambas formas dan la misma base, vemos que tiene las mismas dimensiones. Como era de esperarse, mantiene las mismas 11 variables, pero ahora sólo 21 observaciones (por lo que deducimos que 11 registros, 32 - 21, contenían autos con 4 cilindros o más).

Existe una tercera forma de generar la misma base, a través de la librería dplyr. Pero para ello primero tenemos que instalar el paquete:

install.packages('dplyr')

Una vez que se cuenta instalado el paquete, invocamos la librería

library(dplyr)

Y apliquemos

base1_3<-base%>%
  filter(cyl>4)
dim(base1_3)
## [1] 21 11

De la misma forma podemos usar filtros para generar distintas bases a partir de la base original. Por ejemplo: * Vehículos con cuatro cilindros o más

base2<-subset(base,base$cyl>=4)
base2_2<-base[base$cyl>=4,]
base2_3<-base%>%
  filter(cyl>=4)
  • Vehículos con menos de cuatro cilindros o con más de 6 cilindros
base3<-subset(base,base$cyl<4|base$cyl>6)
base3_2<-base[base$cyl<4|base$cyl>6,]
base3_3<-base%>%
  filter(cyl<4|cyl>6)
  • Vehículos con un número de cilindros entre 4 y 6
base4<-subset(base,base$cyl>4&base$cyl<6)
base4_2<-base[base$cyl>4&base$cyl<6,]
base4_3<-base%>%
  filter(cyl>4&cyl<6)

2.2 Operar con operación filtrada

Esto nos es útil porque nos permite aplicar operaciones a subconjuntos de una base original. Por ejemplo, con los veh[iculos que tienen menos de cuatro o más de seis cilindros calcule la media (promedio) de la variable wt:

mean(base3$wt)
## [1] 3.999214

2.3 Ejercicio práctico 1

  • Quédese con los vehículos que tienen una potencia de entre 100 y 200 Hp, luego indique el promedio de mpg
base_deber<-base[base$hp>100&base$hp<200,]
mean(base_deber$mpg)
## [1] 19.21875
  • Quédese con los vehículos que tienen una potencia menor a 100 y mayor a 200 Hp, luego indique el promedio de mpg
base_deber2<-base[base$hp<100|base$hp>200,]
mean(base_deber2$mpg)
## [1] 20.9625

3 Cargar bases de datos externas

Lo más probable es que debamos trabajar con bases de datos que no se encuentran precargadas en R. Para que este trabajo sea replicable, es recomendable trabajar con proyectos.

En este caso puntual, vamos a cargar una pequeña base de datos que se encuentra en formato xlsx. Para ello, requerimos del paquete readxl.

install.packages('readxl')
library(readxl)

Este paquete contiene la función read_excel() que requiere exclusivamente la dirección en la que se encuentra la base, dentro de la carpeta del proyecto. En este caso, se encuentra dentro de la carpeta “insumos”.

base.clase3<-read_excel("insumos/pib_can_anual.xlsx")
## New names:
## • `` -> `...20`
dim(base.clase3)
## [1] 2210   20

También se puede utilizar las opciones de RStudio para ’‘’importar’’’ bases externas, mediante la opción ’‘’File/Import dataset’’’:

{}

Como se mencionó previamente, puede resultar útil modificar los nombres de algunos campos. Por ejemplo:

names(base.clase3)[6]<-'agricultura'

O se puede reemplazar los datos no disponibles (NA) por ceros (0):

base.clase3[is.na(base.clase3)]<-0

Para describir la base, para hacer una estadística básica o, inclusive, para mantener un seguimiento de la base, puede resultar útil saber cuántas observaciones tengo por variable, por ejemplo, para las variables año y provincia:

table(base.clase3$year)
## 
## 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 
##  221  221  221  221  221  221  221  221  221  221
table(base.clase3$prov)
## 
##            AZUAY          BOLÍVAR            CAÑAR           CARCHI 
##              150               70               70               60 
##       CHIMBORAZO         COTOPAXI           EL ORO       ESMERALDAS 
##              100               70              140               71 
##        GALÁPAGOS           GUAYAS         IMBABURA             LOJA 
##               30              250               60              160 
##         LOS RÍOS           MANABÍ  MORONA SANTIAGO             NAPO 
##              130              220              120               50 
##         ORELLANA          PASTAZA        PICHINCHA      SANTA ELENA 
##               40               40               80               30 
##    SANTO DOMINGO        SUCUMBÍOS       TUNGURAHUA ZAMORA CHINCHIPE 
##               19               70               90               90

Y también la podemos filtrar. Por ejemplo, podemos crar una base más pequeña que sólo incluya a la provincia de Santo Domingo:

base_stodgo<-base.clase3 %>%
  filter(dpa_prov=="23")
dim(base_stodgo)
## [1] 19 20

O a la provincia de Manabí:

base_manabi<-base.clase3 %>%
  filter(prov=="MANABÍ")
dim(base_manabi)
## [1] 220  20

Además, podemos quedarnos sólo con las variables necesarias:

names(base_manabi)
##  [1] "year"                                     
##  [2] "prov"                                     
##  [3] "dpa_prov"                                 
##  [4] "canton"                                   
##  [5] "dpa_can"                                  
##  [6] "agricultura"                              
##  [7] "Explotacion de minas y canteras"          
##  [8] "Manufactura\r\n\r\n"                      
##  [9] "Suministro de electricidad y de agua"     
## [10] "Construccion\r\n\r\n"                     
## [11] "comercio\r\n\r\n"                         
## [12] "Alojamiento y servicios de comida"        
## [13] "Transporte, informacion y comunicaciones" 
## [14] "Actividades financieras\r\n"              
## [15] "Actividades profesionales e inmobiliarias"
## [16] "Administracion publica \r\n"              
## [17] "Enseñanza\r\n\r\n"                        
## [18] "Salud\r\n\r\n"                            
## [19] "Otros servicios\r\n\r\n"                  
## [20] "...20"
base_manabi1<-base_manabi %>%
  select(year, prov, dpa_prov, canton, dpa_can, agricultura, 'Explotacion de minas y canteras')
dim(base_manabi1)
## [1] 220   7

4 Mínimos cuadrados ordinarios

A través de la metodología de mínimos cuadrados ordinarios, se puede estimar la relación lineal existente entre dos o más variables, y determinar si esta es estadísticamente significativa.

Por ejemplo, contamos con una base de datos utilizada por un profesor de economía:

base.clase4<-read.csv("insumos/base_final.csv")
names(base.clase4)
##  [1] "anio"             "pib"              "consumo"          "inversion"       
##  [5] "gasto"            "exportaciones"    "importaciones"    "impuestos"       
##  [9] "oferta_monetaria" "interes_real"

De los nombres de la base vemos que esta incluye 10 variables.

base.clase4$anio
##  [1] 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974
## [16] 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989
## [31] 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004
## [46] 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
## [61] 2020 2021 2022 2023 2024

Al invocar el elemento ``ànio``` observamos que este va de 1960 a 2024, por tanto, podemos deducir que esta base de datos incluye 65 observaciones.

dim(base.clase4)
## [1] 65 10

De hecho, tiene 65 observaciones para 10 variables (incluyendo anio).

Ahora bien, podemos plantearnos la siguiente instrucción: estime la propensión marginal al consumo para el Ecuador desde 1980 hasta 2024.

Conviene recordar dos cosas: * Al momento, tenemos intalado el paquete dplyr e invocada la librería dplyr. Si ha empezado una nueva sesión en R, no olvide invocar esta librería. * La propensión marginal al consumo se refiere al aumento en el consumo producto de un aumento del ingreso disponible en la ecuación keynesiana del consumo: \[ C= A + cYd \] donde Ces el consumo, À es el consumo autónomo, que no depende del ingreso disponible, Ydes el ingreso disponible, y ces la propensión marginal al consumo.

4.1 Filtramos la base de datos

Primero debemos filtrar la base para que incluya sólo los años correspondientes, esto se puede hacer de la siguiente forma:

base_cl41980_2024<-base.clase4 %>%
  filter(base.clase4$anio>=1980&base.clase4$anio<=2024)
dim(base_cl41980_2024)
## [1] 45 10

Como era de esperarse, en esta nueva base sólo tenemos 45 observaciones.

Nótese que bien pudimos utilizar sólo el siguiente código para filtrar la base, porque 2024 es el año límite de nuestra base original:

base_cl41980_2024<-base.clase4 %>%
  filter(base.clase4$anio>=1980)
dim(base_cl41980_2024)
## [1] 45 10

4.2 Creamos una nueva variable

Sucede que nuestra base no incluye el ingreso disponible (Yd), pero la podemos calcular sabiendo que el ingreso disponible es el ingreso total menos impuestos: Yd=PIB-impuestos:

base_cl41980_2024$yd<-base_cl41980_2024$pib-base_cl41980_2024$impuestos

O, de otra forma:

base_cl41980_2024<-base_cl41980_2024%>%
  mutate(yd2=pib-impuestos)

Note que hemos creado dos nuevas variables (yd y yd2), lo cual debería verse reflejado en las dimensiones de nuestra base:

dim(base_cl41980_2024)
## [1] 45 12

¿Son yd y yd2 iguales?

base_cl41980_2024$yd==base_cl41980_2024$yd2
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [31] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

Sí, son iguales en todos y cada uno de sus elementos. (La operación ==, no es un operador de asignación, sino de comprobación lógica)

4.3 Determinación del modelo econométrico

Partimos de la ecuación del consumo keynesiano que describimos anteriormente (C= A + cYd), pero la ajustamos a aquello que vamos a estimar mediante el modelo:

\[ Consumo = \beta_0 + \beta_1*Yd + \mu \]

Ahora llega el momento de correr esa regresión lineal en R con la función lm(). Para facilitar la lectura, vamos a utilizar nomenclatura científica, así que incluimos la opción scipen.

modelo<-lm(consumo~yd,data=base_cl41980_2024)
modelo
## 
## Call:
## lm(formula = consumo ~ yd, data = base_cl41980_2024)
## 
## Coefficients:
## (Intercept)           yd  
##   1.417e+10    6.847e-01
summary(modelo)
## 
## Call:
## lm(formula = consumo ~ yd, data = base_cl41980_2024)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -4.901e+09 -1.070e+09 -1.952e+08  1.233e+09  6.870e+09 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 1.417e+10  9.352e+08   15.15   <2e-16 ***
## yd          6.847e-01  1.397e-02   49.01   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.45e+09 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: < 2.2e-16

Para nuestra siguiente instrucción podríamos plantearnos cuál es la elasticidad del consumo frente al ingreso disponible, utilizando el logaritmo natural de las variables, para ello creamos las nuevas variables de logaritmo natural y corremos el modelo de mínimos cuadrados ordinarios:

base_cl41980_2024<-base_cl41980_2024%>%
  mutate(ln_consumo=log(consumo),
         ln_yd=log(yd))

modelo2<-lm(ln_consumo~ln_yd,data=base_cl41980_2024)
summary(modelo2)
## 
## Call:
## lm(formula = ln_consumo ~ ln_yd, data = base_cl41980_2024)
## 
## 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   <2e-16 ***
## ln_yd        0.72715    0.01852   39.26   <2e-16 ***
## ---
## 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: < 2.2e-16

5 Proceso de creación de un modelo econométrico

  1. Una idea
  2. La idea se transforma en una pregunta de investigación
  3. Se responde esta pregunta con una hipótesis (intuición, conocimiento previo, sentido común)
  4. Revisión bibliográfica
  5. Identificar fuentes de información
  6. Modelo teórico
  7. El modelo econométrico
  8. Evaluación del modelo econométrico
  9. Resultados
  10. Conclusiones

En el caso ecuatoriano, puede ser de utilidad empezar por el paso 5, como una especie de paso 0.

5.1 Ejemplo 1: Desempleo y PIB

Por ejemplo, se nos ha provisto con una base que incluye algunos indicadores del país.

base<-read.csv('insumos/datos_ecuador.csv')

Los indicadores son:

names(base)
## [1] "anio"                     "trim"                    
## [3] "RiesgoPais"               "PIB_MillonesUSD"         
## [5] "TasaDesempleo_Porcentaje" "IED_MillonesUSD"

Al incluir la variable trim, parecen ser datos trimestrales que se encuentran entre:

base$anio[1]
## [1] 2010
base$anio[63]
## [1] 2025

Contando con estos datos, nos podemos preguntar si el empleo se encuentra relacionado con el PIB.

Hipótesis: el desempleo tiene una relación negativa con el PIB

Esta hipótesis puede surgir de haber observado un gráfico de mabs variables:

plot(base$PIB_MillonesUSD,base$TasaDesempleo_Porcentaje)

Para demostrar esta hipótesis, podemos plantear el siguiente modelo: Modelo1: \[ Desempleo = \beta_0 + \beta_1 * PIB \]

Que puede responder al siguiente código (se presentan dos formas diferentes de llegar a lo mismo, compruebe que se obtengan los mismos resultados):

modelo_desempleo<-lm(TasaDesempleo_Porcentaje~PIB_MillonesUSD,data=base)
modelo_desempleo2<-lm(base$TasaDesempleo_Porcentaje~base$PIB_MillonesUSD)
summary(modelo_desempleo)
## 
## Call:
## lm(formula = TasaDesempleo_Porcentaje ~ PIB_MillonesUSD, data = base)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.6369 -0.8933 -0.1452  0.4323  7.6118 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      8.373e+00  9.208e-01   9.093 5.95e-13 ***
## PIB_MillonesUSD -1.072e-04  3.556e-05  -3.014  0.00376 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.377 on 61 degrees of freedom
## Multiple R-squared:  0.1296, Adjusted R-squared:  0.1153 
## F-statistic: 9.081 on 1 and 61 DF,  p-value: 0.003758
summary(modelo_desempleo2)
## 
## Call:
## lm(formula = base$TasaDesempleo_Porcentaje ~ base$PIB_MillonesUSD)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.6369 -0.8933 -0.1452  0.4323  7.6118 
## 
## Coefficients:
##                        Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           8.373e+00  9.208e-01   9.093 5.95e-13 ***
## base$PIB_MillonesUSD -1.072e-04  3.556e-05  -3.014  0.00376 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.377 on 61 degrees of freedom
## Multiple R-squared:  0.1296, Adjusted R-squared:  0.1153 
## F-statistic: 9.081 on 1 and 61 DF,  p-value: 0.003758

Debemos considerar el significado de estos resultados:

  • ¿Qué significa el intercepto? (Esto es particularmente importante cuando la variable independiente puede adoptar valores cercanos a cero o, dicho de otra forma, puede estar ausente)
  • ¿Cuál es el signo del coeficiente \[ \beta_2 \] ? Esto define la relación entre las variables: directa (ambas se incrementan o disminuyen al mismo tiempo) o inversa (la una se incrementa cuando la otra disminuye y viceversa).
  • ¿Cuál es la magnitud del coeficiente? Particularmente importante para predicciones.
  • ¿Cuál es el grado de significancia del coeficiente? Esto nos indicará si es probable que este coeficiente sea cero (0), es decir, no exista relación entre la variable dependiente e independiente.

5.2 Ejemplo 2: Inversión extranjera directa y riesgo país

En la misma base, contamos con datos de la inversión extranjera directa (IED_MillonesUSD) y del Riesgo País (RiesgoPais).

Podemos partir de la idea generalizada de que la IED depende del riesgo país, y nos generamos la hipótesis de que a un mayor Riesgo País, una menor IED, es decir, tienen una relación inversa.

plot(base$RiesgoPais,base$IED_MillonesUSD)

Comprobemos con el método de mínimos cuadrados ordinarios:

modelo_ied<-lm(base$IED_MillonesUSD~base$RiesgoPais)
summary(modelo_ied)
## 
## Call:
## lm(formula = base$IED_MillonesUSD ~ base$RiesgoPais)
## 
## 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 1.29e-10 ***
## base$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

Se observa que el signo es negativo, pero…la variable es significativa sólo al 80% de confianza.

Esto significa que, al 90% de confianza, la variable puede adoptar el valor de cero (0):

confint(modelo_ied)
##                        2.5 %       97.5 %
## (Intercept)     170.41669562 289.37637141
## base$RiesgoPais  -0.09236639   0.00594765

Pero al 80% de confianza, no:

confint(modelo_ied, level = 0.8)
##                        10 %         90 %
## (Intercept)     191.3587003 268.43436676
## base$RiesgoPais  -0.0750589  -0.01135984

Alguno podría plantear que quizás el Riesgo País toma un poco de tiempo para atraer a la IED, así que quizás convenga relacionar el Riesgo País con la IED atraída 1 ó 2 trimestres después, sí que creamos esas variables rezagadas y corramos los modelos correspondientes:

# Creamos el riesgo país rezagado a un periodo
base<-base%>%
  mutate(RP_tminus1=lag(RiesgoPais,n=1))

# modelo rezagado
modelo_iedlag1<-lm(base$IED_MillonesUSD~base$RP_tminus1)
summary(modelo_iedlag1)
## 
## Call:
## lm(formula = base$IED_MillonesUSD ~ base$RP_tminus1)
## 
## 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 5.78e-09 ***
## base$RP_tminus1  -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
# Creamos el riesgo país rezagado a dos periodos, y realizamos el modelo
base<-base%>%
  mutate(RP_tminus2=lag(RiesgoPais,n=2))
modelo_iedlag2<-lm(base$IED_MillonesUSD~base$RP_tminus2)
summary(modelo_iedlag2)
## 
## Call:
## lm(formula = base$IED_MillonesUSD ~ base$RP_tminus2)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -320.59  -53.15  -14.34   49.29  266.92 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     214.06880   30.81112   6.948 3.32e-09 ***
## base$RP_tminus2  -0.02707    0.02533  -1.069     0.29    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 111 on 59 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.01899,    Adjusted R-squared:  0.002358 
## F-statistic: 1.142 on 1 and 59 DF,  p-value: 0.2896

Nótese que, si bien se mantiene el signo, los coeficientes tienen magnitudes menores y son menos significativos. De hecho, no son significativos, por lo que no parece que exista una relación entre el Riesgo País y la entrada de Inversión Extranjera Directa uno o dos trimestres después.

Noten que hemos realizado estas dos estimaciones manualmente, pero los modelos ARMA (Auto Regressive Mobile Average) permiten realizarlo para un número indefinido de regos automáticamente. Ello será revisado, si es posible, en una próxima oportunidad.

6 Consejos útiles

  • En R el punto (.) es el separador de decimales, la coma (,) es el separador de objetos.
  • Una vez que he instalado un paquete, para que no se esté instalando continuamente, puedo colocar un numeral (#) antes del código de instalación (install.packages())