Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía de Ejercicios 1
Profesor: Víctor Macías E.
Pregunta 1
(a) Genere un vector que contenga la siguiente secuencia de números de 1 al 10: 1, 2, 3, ..., 10
A continuación se presentan tres formas para generar dicho vector:
seq(1,10,1) #forma 1. Esto es lo que ustedes escriben en el R Script
## [1] 1 2 3 4 5 6 7 8 9 10
1:10 #forma 2. Esto es lo que ustedes escriben en el R Script
## [1] 1 2 3 4 5 6 7 8 9 10
seq(10) #forma 3. Esto es lo que ustedes escriben en el R Script
## [1] 1 2 3 4 5 6 7 8 9 10
Notas:
• Lo que escribas después de # se entiende como texto. ¡No es código!
• La sintaxis de la forma 1 contiene 3 argumentos:
## [1] 1 3 5 7 9
1
## [1] 1.000000 1.444444 1.888889 2.333333 2.777778 3.222222 3.666667
## [8] 4.111111 4.555556 5.000000
(d) Genere un vector cuyos elementos sean cinco ceros y cada uno tenga como nombre las letras A, B, C, D, E.
ceros1 <- numeric(5) #define vector de ceros # forma 1
names(ceros1) <- c("A", "B", "C", "D", "E") #asigna nombre a elementos
ceros1
## A B C D E
## 0 0 0 0 0
ceros2 <- rep(0, 5) #forma 2
names(ceros2) <- c("A", "B", "C", "D", "E") #asigna nombre a elementos
ceros2
## A B C D E
## 0 0 0 0 0
(e) Genere un vector z que repita la letra A cinco veces y la letra B dos veces.
z = rep(c("A", "B"), c(5,2)) #forma 1
z
(f) Genere un vector de los pagos de un bono que tiene 9 pagos de $100 y un último pago de $1100.
flujo <- c(rep(100,9), 1100)
flujo
## [1] 100 100 100 100 100 100 100 100 100 1100
Pregunta 2
El vector x contiene las edades de 5 estudiantes:
2
x = c("Pedro"=17, "Ana"=NA, "Maya"=23, "Max"=NA, "Paula"=20)
Pregunta: ¿Por qué se usa []? (Ayuda: Si escribe x[2], ¿qué obtiene?. Y si escribe x[c(1,3)],
¿qué obtiene?
## Pedro Ana
## 17 NA
z <- x[1:2] #forma 2
z
## Pedro Ana
## 17 NA
mean(x)
## [1] NA
3
mean(x, na.rm = TRUE) #forma 1
## [1] 20
## [1] 20
Pregunta: ¿Cómo escribiría la fórmula para la desviación estándar muestral usando R? Re-
cuerde que la desviación estándar muestral se define como:
sP
n
i=1 (xi − x)
2
σ=
n−1
## [1] 0.6666667
(e) Calcule el promedio de edad de los estudiantes cuyas edades son 20 años o menos
mean(x[x<=20], na.rm = TRUE)
## [1] 18.5
Para entender esta sintaxis, les recomiendo deconstruir el código de la siguiente manera:
x<=20
## [1] 18.5
## [1] 2
(g) Calcule la suma de las edades de los alumnos con edades menores o iguales a 20 años
4
sum(x[x<=20], na.rm = TRUE)
## [1] 37
(h) Calcule la suma de las edades cuyos valores son distintos a NAs
sum(x[!is.na(x)])
## [1] 60
Pregunta 3
Para un vector x definido como una secuencia de números de 1 a 10,
(a) Calcule la suma de los cuadrados del inverso de cada uno de sus elementos
x = 1:10 #crea vector del 1 al 10. Otra forma para crearlo es: x = seq(1,10,1)
sum((1/x)^2) #forma 1
## [1] 1.549768
sum((1/x)**2) #forma 2
## [1] 1.549768
## [1] 1 3 6 10 15 21 28 36 45 55
Pregunta 4
Calcule el retorno de un portafolio que contiene dos acciones, A y B, usando los vectores ret y pond que
contienen los retornos y ponderaciones, respectivamente.
ret <- c(5, 7) # retorno
pond <- c(0.4, 0.6) # ponderaciones
## [1] 6.2
paste0("Retorno Portafolio ","= ", retorno_portafolio,"%")
5
#Otra forma de calcular el retorno del portafolio es usando una media ponderada:
Pregunta 5
(a) Calcule el valor presente de un flujo de efectivo de $1000 por un total de diez períodos. Asuma una
tasa de descuento de 10%.
10
X 1000 1000
VP = = (1 − (1 + 0.1)−10 ) ≈ 6145
t=1
(1 + 0.1) t 0.1
## [1] 6144.567
paste0("Valor Presente", "=","$", round(valor_presente,0)) #forma 1
(b) Calcule el valor presente neto de un flujo de efectivo de $300, $1200, $1000 y una inversión inicial de $900.
Asuma que las tasas de descuento para cada uno de los períodos son 10%, 20%, 15%, respectivamente.
En este caso, el valor presente neto se calcula como:
# Tasa de interés
r <- c(0.1, 0.2, 0.15)
# Factores de descuento
yearly_discount_factors <- (1 + r) ^ - 1
6
# Definir vector de flujos
cash_flow <- c(-900, 300, 1200, 1000)
Pregunta 6
Los flujos de efectivo de un proyecto se detallan en la siguiente tabla:
Período Flujo
0 -10000
1 -2000
2 500
3 1500
4 2500
5 5000
6 6500
7 9000
8 8500
9 9500
10 10000
cumsum(flujo)
## [1] -10000 -12000 -11500 -10000 -7500 -2500 4000 13000 21500 31000
## [11] 41000
paste0("Payback period = ", min(which(cumsum(flujo) >= 0)) - 1)
(b) Calcule el payback period usando los flujos descontados a una tasa de descuento de 10%
r = 0.1 #tasa de descuento
n= length(flujo) - 1
periodo = 0:n #períodos
7
Pregunta 7
Para los siguientes vectores a, b y c:
a <- c(0,10,-5)
b <- c(5,8,-4)
c <- c(0,1,-1)
(a) Defina un vector d que identifique los elementos del vector a que son menores a los correspondientes en
el vector b
d <- a<b
d
## [1] 8
(c) Defina un nuevo vector e que incluya el segundo y tercer elementos del vector a
e <- a[c(2,3)]
e
## [1] 10 -5
## L1 L2 L3
## 0 10 -5
## L1 L2 L3
## a 0 10 -5
## b 5 8 -4
## c 0 1 -1
B <- cbind(a,b,c)
B
## a b c
## L1 0 5 0
## L2 10 8 1
## L3 -5 -4 -1
8
Pregunta 8
A partir de los siguientes vectores x e y,
x = c(3,2)
y = c(1,0)
(a) Defina una matriz W de 2x2 donde ambos vectores sean las filas de la matriz y una matriz Z donde
ambos vectores sean las columnas de la matriz.
W <- rbind(x,y) #vectores x e y son filas de la matriz
W
## [,1] [,2]
## x 3 2
## y 1 0
Z <- cbind(x,y) #vectores x e y son columnas de la matriz
Z
## x y
## [1,] 3 1
## [2,] 2 0
## columna1 columna2
## fila1 3 1
## fila2 2 0
Pregunta 9
A partir del vector e = c(-1, 0, 2, 4, -2, 3), cree una matriz K de 3x2 y una matriz L de 2x3
e = c(-1, 0, 2, 4, -2, 3)
K = matrix(e, nrow=3, ncol=2, byrow = TRUE)
K
## [,1] [,2]
## [1,] -1 0
## [2,] 2 4
## [3,] -2 3
L = matrix(e, nrow=2, ncol=3)
L
9
Pregunta: ¿Qué obtiene si escribe K = matrix(e, nrow=3, ncol=2), o bien, K = matrix(e,
nrow=3, ncol=2, byrow = FALSE)?
Pregunta 10
(a) Construya una matriz identidad de 4x4
Z = diag(4)
Z
## [,1] [,2]
## [1,] NA NA
## [2,] NA NA
## [3,] NA NA
## [4,] NA NA
## [5,] NA NA
## [6,] NA NA
## [7,] NA NA
## [8,] NA NA
## [9,] NA NA
## [10,] NA NA
Pregunta 11
A partir del vector z=(1,4,-1,3,-2), construya una matriz cuyos elementos de la diagonal principal correspondan
al vector z
z=c(1,4,-1,3,-2)
G=diag(z)
G
10
Pregunta 12
Para la siguiente matriz:
1 1 1
X= 3 −2 1
2 1 −1
(a) Calcule la traspuesta e inversa
fila1=c(1,1,1)
fila2=c(3,-2,1)
fila3=c(2,1,-1)
X=rbind(fila1, fila2, fila3)
X
## fila3
## 2
## [1] 3 -2 1
## fila2 fila3
## 1 -1
11
Pregunta 13
Use matrices para resolver los siguientes sistemas de ecuaciones:
(a)
a+b+c=6
3a − 2b + c = 2
2a + b − c = 1
Antes de resolver este sistema de ecuaciones, formula el problema en forma matricial en una
hoja de papel.
fila1=c(1,1,1)
fila2=c(3,-2,1)
fila3=c(2,1,-1)
k=c(6,2,1)
A=rbind(fila1,fila2,fila3)
solve(A)%*%k
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
(b)
3a + 4b − 5c + d = 10
2a + 2b + 2c − d = 5
a − b + 5c − 5d = 7
5a + d = 4
fila1=c(3,4,-5,1)
fila2=c(2,2,2,-1)
fila3=c(1,-1,5,-5)
fila4=c(5,0,0,1)
k=c(10,5,7,4)
X=rbind(fila1,fila2,fila3,fila4)
solve(X)%*%k
## [,1]
## [1,] 1.2477876
## [2,] 1.0176991
## [3,] -0.8849558
## [4,] -2.2389381
12
Pregunta 14
(a) Genere una lista que consista del vector A igual a {8, 12, 16,. . . , 36}, un vector B que contenga las
palabras hola y ¿Cómo estás? y una matriz identidad de 3x3 denominada C
lista_elem = list(A=seq(8, 36, 4), B=c("hola","¿Cómo estás?"), C=diag(3))
lista_elem
## $A
## [1] 8 12 16 20 24 28 32 36
##
## $B
## [1] "hola" "¿Cómo estás?"
##
## $C
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
Pregunta 15
Genere un vector denominado fecha que contenga las fechas de los primeros cinco días del mes de marzo del
2020, definidas con el formato yyyy-mm-dd (ISO 8601 ¿A qué se refieren estas normas ISO?). A continuación
construya un tibble con las siguientes columnas a partir del vector fecha:
• Día de la columna fecha
• Mes de la columna fecha
• Año de la columna fecha
Nota: En esta pregunta deberá instalar los paquetes tibble y lubridate ¿Cómo debe instalarlo?
(Ver documento introductorio)
library(tibble)
library(lubridate) #trabaja con fechas
fecha <- seq(as.Date("2020-03-01"), as.Date("2020-03-05"), by="days")
## # A tibble: 5 x 4
## fecha dia mes agno
## <date> <int> <dbl> <dbl>
## 1 2020-03-01 1 3 2020
## 2 2020-03-02 2 3 2020
## 3 2020-03-03 3 3 2020
## 4 2020-03-04 4 3 2020
## 5 2020-03-05 5 3 2020
13
A continuación escriba lo siguiente:
fecha
## [1] "Date"
as.numeric(fecha) #¿Qué significan los números que obtiene?
Pregunta 16
La siguiente tabla presenta las ventas mensuales de 3 productos:
14
• purrr
A continuación se presentan 4 verbos del paquete dplyr (https://cran.r-project.org/web/packages/dplyr/
dplyr.pdf) que se usarán mucho en manipulación de datos:
• filter
• select
• arrange
• mutate
library(dplyr) #manipulación de datos
library(stringr) #manipulación de strings
## Observations: 4
## Variables: 3
## $ mes <fct> Ene, Feb, Mar, Abr
## $ producto1 <dbl> 1000, 3000, 6000, 9000
## $ producto2 <dbl> 1000, 2000, 3000, 5000
(e) Presente las primeras tres y últimas dos observaciones del dataframe ventas
15
head(ventas, n=3)
## # A tibble: 4 x 3
## mes producto1 producto2
## <fct> <dbl> <dbl>
## 1 Ene 1000 1000
## 2 Feb 3000 2000
## 3 Mar 6000 3000
## 4 Abr 9000 5000
(g) Construya una tabla con las observaciones de las variables mes y producto2
producto2 <- sales %>% select(mes, producto2)
producto2
## # A tibble: 4 x 2
## mes producto2
## <fct> <dbl>
## 1 Ene 1000
## 2 Feb 2000
## 3 Mar 3000
## 4 Abr 5000
(h) Construya una tabla con las ventas de los meses de Enero y Marzo
sales %>% filter(mes=="Ene" | mes=="Mar")
## # A tibble: 2 x 3
## mes producto1 producto2
## <fct> <dbl> <dbl>
## 1 Ene 1000 1000
## 2 Mar 6000 3000
(i) Construya una variable ventastot que sea igual a las ventas mensuales totales de los 3 productos
sales <- sales %>% mutate(ventastot = producto1 + producto2)
sales
## # A tibble: 4 x 4
## mes producto1 producto2 ventastot
## <fct> <dbl> <dbl> <dbl>
16
## 1 Ene 1000 1000 2000
## 2 Feb 3000 2000 5000
## 3 Mar 6000 3000 9000
## 4 Abr 9000 5000 14000
(j) Genere una variable que toma el valor “alto” si las ventas mensuales son mayores al promedio de ventas
del período Enero-Abril, e igual a “bajo”, si no son mayores.
promedio_ventas <- mean(sales$ventastot, na.rm = TRUE)
sales <- sales %>% mutate(mayor = ifelse(ventastot > promedio_ventas, "alto", "bajo"))
sales
## # A tibble: 4 x 5
## mes producto1 producto2 ventastot mayor
## <fct> <dbl> <dbl> <dbl> <chr>
## 1 Ene 1000 1000 2000 bajo
## 2 Feb 3000 2000 5000 bajo
## 3 Mar 6000 3000 9000 alto
## 4 Abr 9000 5000 14000 alto
(k) ¿Cuántos meses tienen ventas totales mayores a $15000?
nrow(subset(sales, ventastot > 15000)) #forma 1
## [1] 0
sales %>% filter(ventastot > 15000) %>% count() #forma2
## # A tibble: 1 x 1
## n
## <int>
## 1 0
(l) Guarde sales con extensión .csv
library(readr)
write_csv(sales, path = "/cloud/project/solución/sales.csv")
17
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 2
Profesor: Víctor Macías E.
Paquete “jsonlite”
JSON (JavaScript Object Notation) y XML (eXtensible Markup Language) son formatos de archivo que
son usados ampliamente para transferir datos en la web. Para trabajar con archivos json se usa el paquete
jsonlite, el cual se describe en el siguiente link: https://cran.r-project.org/web/packages/jsonlite/jsonlite.pdf
A continuación se presentan dos ejemplos de creación de un archivo json, lectura del archivo y transformación
a un data frame.
Ejemplo 1:
library(jsonlite)
ventas <- '{"Mes": ["Enero", "Febrero", "Marzo"],
"Producto_1": [1000, 2000, 1300],
"Producto_2": [3000, 2800, 2000]}'
ventas_json <- fromJSON(ventas)
ventas_df <- as.data.frame(ventas_json)
ventas_df
Ejemplo 2:
library(jsonlite)
ventas <- '[{"Mes": "Enero", "Producto_1": 1000, "Producto_2": 3000},
{"Mes": "Febrero", "Producto_1": 2000, "Producto_2": 2800},
{"Mes": "Marzo", "Producto_1": 1300, "Producto_2": 2000}]'
ventas_df <- fromJSON(ventas)
ventas_df
1
Paquete “tidyverse”
El paquete tidyverse consiste de un conjunto de paquetes. Para una descripción detallada se recomienda
revisar la siguiente página: https://www.tidyverse.org/.
Entre los paquetes que son parte de tidyverse y que permiten la importación de datos en varios formatos, se
encuentran:
• readr (https://readr.tidyverse.org/)
• readxl (https://readxl.tidyverse.org/)
• haven (https://haven.tidyverse.org/)
readr
Comando Formato
read_csv valores separados por coma (csv)
read_csv2 valores separados por punto y coma (csv)
read_tsv valores delimitados por tab (tsv)
read_delim formato de archivo de texto general
readxl
Comando Formato
read_excel autodetecta el formato (xls, xlsx)
read_xls formato antiguo (xls)
read_xlsx formato nuevo (xlsx)
Notas:
1. Si un archivo excel contiene más de una hoja puede usarse la función excel_sheets para identificar la
hoja que nos interesa y luego agregar como argumento el nombre de la hoja a importar.
2. Para chequear cómo están separados los valores y si el archivo contiene un header se puede usar
read_lines.
haven
Comando en R Formato
read_dta Stata
read_sav SPSS
read_sas SAS
Paquete “tidyquant”:
Este es uno de los paquetes más usados en el modelamiento de series de tiempo financieras. Para una
descripción detallada se recomienda revisar la siguiente página: https://cran.r-project.org/web/packages/
tidyquant/tidyquant.pdf
2
Paquete “data.table”:
Este paquete se utiliza para manipulación de datos, pero también para importar datos, especialmente archivos
muy grandes. Uno de sus atractivos más importantes es su gran rapidez. Para una descripción detallada, se
recomienda ir al siguiente link https://cran.r-project.org/web/packages/data.table/data.table.pdf
Paquete “WDI”:
“World Development Indicators” (WDI) constituye el principal conjunto de indicadores de desarrollo del
Banco Mundial que se extiende desde 1960 a la actualidad. Los datos se recolectan de diferentes fuentes
internacionales reconocidas oficialmente y se pueden obtener de la siguiente página:
https://data.worldbank.org/products/wdi
Cada indicador tiene su propio código. Por ejemplo, las primeras 10 variables que incluyen en su nombre
“gdp per cápita”, se pueden obtener con el siguiente comando:
WDIsearch(‘gdp per capita’)[1:10,]
Estos datos pueden ser importados a R, usando varios paquetes, según se detalla a continuación:
"The WDI module and wbstats module offer excellent options for reading World Bank data
directly into R, and both packages integrate with ggplot2 for graphing. Other option is to use the
Quandl package, which also provides access to data sources from many other organizations.
The rWBclimate package provides access to the climate data api".
Para bajar estos datos usaremos el paquete WDI.
3
Pregunta 1
Importe a R los datos de ventas de los productos 1 y 2, usados en el ejercicio 16 de la guía 1 que se encuentran
grabados como sales.csv
rm(list = ls())
library(readr)
sales <- read_csv("/cloud/project/datos/sales.csv")
sales
Pregunta 2
Importe a R los datos de mortalidad para menores de 5 años en Argentina, Brazil, Chile, China y Estados
Unidos en el período 1970-2016 en el archivo mortality_under_five.xls.
rm(list = ls())
library(tidyr)
library(readxl) # leer excel file
library(dplyr)
excel_sheets("/cloud/project/datos/mortality_under_five.xls")
Pregunta 3
Importe los datos del archivo Guns.dta que son usados en el libro “Introduction to Econometrics” de James
Stock y Mark Watson. A continuación se describen los datos:
Guns is a balanced panel of data on 50 US states, plus the District of Columbia (for a total of 51
“states”), by year for 1977 – 1999. Each observation is a given state in a given year. There are a
total of 51 states × 23 years = 1173 observations. These data were provided by Professor John
Donohue of Stanford University and were used in his paper with Ian Ayres: “Shooting Down the
‘More Guns Less Crime’ Hypothesis” Stanford Law Review, 2003, Vol. 55, 1193-1312.
4
rm(list = ls())
library(dplyr)
library(haven)
guns <- read_dta("/cloud/project/datos/Guns.dta")
glimpse(guns)
Pregunta 4
Obtenga datos del precio de la acción de Facebook para el período 01/01/2015 hasta el 02/04/2020 desde
Yahoo! Finance.
rm(list = ls())
library(tidyquant)
fb <- tq_get("FB", get = "stock.prices", from = "2015-01-01", to = "2020-04-02")
Pregunta 5
Usando el paquete WDI, obtenga datos de población, expectativa de vida al nacer y PIB per cápita ajustado
por paridad de poder de compra para todos los países incluidos en la base de datos en el período 1960-2019.
rm(list = ls())
library(dplyr)
library(WDI)
#Población - SP.POP.TOTL
#Expectativa de vida al nacer (Años) - SP.DYN.LE00.IN
#PIB per cápita - NY.GDP.PCAP.PP.CD
wbData = WDI(
indicator=c("SP.POP.TOTL", "SI.POV.GINI", "SP.DYN.LE00.IN", "NY.GDP.PCAP.PP.CD"),
country="all", extra = TRUE, start=1960, end=2019)
saveRDS(wbData, "/cloud/project/datos/wbData2019.rds" )
5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 3
Profesor: Víctor Macías E.
“Exploratory data analysis can never be the whole story, but nothing else can serve as the
foundation stone”.
John Tukey
En esta guía usaremos los datos de población, expectativa de vida al nacer y PIB per cápita obtenidos de
“World Development Indicators” (WDI) en la Guía de Ejercicios 2.
library(dplyr)
Pregunta 1
Nombre a las variables SP.POP.TOTL,SP.DYN.LE00.IN y NY.GDP.PCAP.PP.CD como population, lifeEx-
pectancy y gdppc, respectivamente.
wbData2 <- wbData1 %>% rename(population= SP.POP.TOTL,
lifeExpectancy = SP.DYN.LE00.IN,
gdppc = NY.GDP.PCAP.PP.CD,
gini = SI.POV.GINI)
Pregunta 2
Ordene los datos en orden ascendente primero por country y luego por year
wbData2 <- wbData2 %>% arrange(country, year)
Pregunta 3
Cambie los nombres de las regiones a español. Por ejemplo, cambie la región “Middle East & North Africa” a
“Medio Oriente y Norte de Africa”.
1
wbData2 <- wbData2 %>%
mutate(region = recode(region,
"East Asia & Pacific" = "Este Asiático y Pacífico",
"Europe & Central Asia" = "Europa y Asia Central" ,
"Latin America & Caribbean " = "América Latina y el Caribe",
"Middle East & North Africa" = "Medio Oriente y Norte de Africa",
"North America" = "Norteamérica",
"South Asia" = "Asia del Sur",
"Sub-Saharan Africa " = "Africa Subsahariana"))
Pregunta 4
¿Cuántos países tiene la base de datos?
wbData3 <- wbData2 %>% filter(region != "Aggregates") %>% droplevels()
Pregunta 5
Identifique los 5 países con mayor población el año 2015
wbData3 %>% filter(year == 2015) %>%
select(country, population) %>%
arrange(desc(population)) %>% head(5)
Pregunta 6
Identifique los 10 países con menor PIB per cápita el año 2015
wbData3 %>% filter(year == 2015) %>% select(country, gdppc) %>%
arrange(gdppc) %>% head(10)
Pregunta 7
Para cada una de las regiones del mundo, determine los valores mínimos y máximos del PIB per cápita el
año 2015. Además, identifique los países con los mínimos y máximos del PIB per cápita en cada una de las
regiones.
wbData3 %>% filter(year==2015) %>% group_by(region) %>%
summarise(
gdppc_min=round(min(gdppc, na.rm = TRUE),0),
gdppc_max=round(max(gdppc, na.rm = TRUE),0))
2
gdppc_max=max(gdppc, na.rm = TRUE),
max_country = country[which(gdppc == gdppc_max)])
Pregunta 8
Compare el PIB per cápita de Chile y Estados Unidos en 1990 y 2015
wbData3 %>% filter(year %in% c(1990,2015) & country %in% c("Chile","United States")) %>%
select(country, year, gdppc)
Pregunta 9
Calcule la media aritmética y desviación estándar del PIB per cápita del año 2015 para los países de América
Latina y el Caribe.
wbData3 %>% filter(region=="América Latina y el Caribe" & year==2015) %>%
summarise(gdppc_prom=mean(gdppc, na.rm = TRUE),
gdppc_sd=sd(gdppc, na.rm = TRUE))
Pregunta 10
Genere una variable que sea igual a la población en miles de personas
wbData4 <- wbData3 %>% mutate(pop1000=population/1000)
Pregunta 11
¿Cuántos missing values existen para las variables population, gdppc y lif eExpectancy?
wb <- wbData3 %>% select(population, gdppc, lifeExpectancy)
summary(wb)
wbData3 %>%
summarise_at(c("population", "gdppc", "lifeExpectancy"), funs(sum(is.na(.))))
saveRDS(wbData3, "/cloud/project/datos/wbData3.rds")
3
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 4
Profesor: Víctor Macías E.
Bibliografía obligatoria
Wickham, H. 2019. ggplot2: elegant graphics for data analysis.
https://ggplot2-book.org/
Tipos de gráficos
Trabajaremos con tres tipos de gráficos:
• Estáticos
• Interactivos
• Dinámicos
Paquetes
En esta guía usaremos varios paquetes para realizar gráficos. Sin embargo, el paquete ggplot2 constituirá la
base. Una descripción de este paquete se encuentra en los siguientes links:
https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf
https://ggplot2.tidyverse.org/
https://www.ggplot2-exts.org/
Otros paquetes que usaremos son: gridExtra, ggstance, ggthemes y ggrepel. Para una descripción de
estos paquetes ver:
https://cran.r-project.org/web/packages/gridExtra/gridExtra.pdf
https://cran.r-project.org/web/packages/ggstance/ggstance.pdf
https://cran.r-project.org/web/packages/ggthemes/ggthemes.pdf
https://cran.r-project.org/web/packages/ggrepel/ggrepel.pdf
Dado que en las últimas dos preguntas de esta Guía trabajaremos con gráficos interactivos, se recomienda
revisar una descripción del paquete plotly:
https://plot.ly/r/
1
ColorBrewer
Tipo palette
Diverging BrBG, PiYG, PRGn, PuOr, RdBu, RdGy,
RdYlBu, RdYlGn, Spectral
Qualitative Accent, Dark2, Paired, Pastel1, Pastel2, Set1, Set2,
Set3
Sequential Blues, BuGn, BuPu, GnBu, Greens, Greys,
Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples,
RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd
2
Para responder las siguientes preguntas use los datos de población, expectativa de vida al nacer y PIB per
cápita obtenidos de “World Development Indicators” (WDI) en la Guía de Ejercicios 2 y que fue explorado
en la Guía 3.
library(dplyr)
library(ggplot2)
library(ggthemes)
#library(RColorBrewer)
Pregunta 1
Grafique la expectativa de vida al nacer para Chile, Japón y Estados Unidos
80
75
lifeExpectancy
country
Chile
70 Japan
United States
65
60
3
Expectativa de vida al nacer
1960−2016
85
80
75
70
65
60
4
Expectativa de vida al nacer
1960−2016
85
Expectativa de vida al nacer (años)
80
75
70
Chile
65 Japón
Estados Unidos
60
Pregunta 2
Usando un diagrama de caja, compare la expectativa de vida al nacer entre las diferentes regiones del mundo
para el año 2015
Pregunta 3
Usando un gráfico de dumbbell, muestre el cambio en la expectativa de vida al nacer entre los años 1970
y 2015 para los siguientes países: Chile, Argentina, Brazil, Bolivia, Perú, México, Colombia, Costa Rica y
Uruguay.
library(ggalt)
library(tidyr)
5
"Peru", "Mexico", "Colombia", "Costa Rica", "Uruguay"),
year %in% c(1970, 2015)) %>%
select(country, year, lifeExpectancy) %>%
spread(year, lifeExpectancy) %>%
mutate(gap = `2015` - `1970`) %>%
arrange(desc(gap))
Pregunta 4
Construya un histograma que represente la distribución del PIB per cápita el año 2015
Pregunta 5
Construya la función de distribución acumulada del PIB per cápita para el año 2015
6
wbData3 %>% filter(year==2015) %>%
ggplot(aes(x = gdppc)) +
stat_ecdf() +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000),
expand = c(0,0)) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "PIB per cápita mundial 2015",
subtitle = "Distribución acumulada",
x = "PIB per cápita (miles de dólares)",
y = "Proporción") +
theme_classic()
Pregunta 6
Construya un gráfico de la región en el eje X y el PIB per cápita del año 2015 en el eje Y , representando
cada país por un punto.
wbData3 %>% filter(year==2015) %>%
ggplot(aes(x = region, y=gdppc, col = region))+
geom_point(alpha = 0.3, position = position_jitter(width = 0.2)) +
scale_colour_brewer(palette = "Dark2") +
labs(title = "PIB per cápita por región",
subtitle = "2015",
x = "",
y = "PIB per cápita") +
coord_flip() +
theme_classic() +
theme(legend.position = 'none')
Pregunta 7
Use un gráfico de dispersión de la expectativa de vida al nacer y PIB per cápita para el año 2015. Presente
también un gráfico en que el eje X sea logarítmica en base 10.
wbData3 %>% filter(year==2015) %>%
ggplot(aes(x=gdppc, y=lifeExpectancy, col=region))+
geom_point(alpha = 0.6) +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
scale_colour_brewer(name = NULL, palette = "Set1") +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic()
7
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares - escala logarítmica)",
y = "Expectativa de vida al nacer (años)") +
scale_colour_brewer(name ="", palette = "Set1") +
theme_classic()
Pregunta 8
Construya un gráfico de dispersión de la expectativa de vida al nacer y PIB per cápita para cada uno de los
años 1990, 2000 y 2015, incluyendo sólo a los países de América Latina y el Caribe. Use la misma escala para
representar los valores del eje Y.
wbData3 %>%
filter(year %in% c(1990, 2000, 2015) & region == "América Latina y el Caribe") %>%
ggplot(aes(x=gdppc, y=lifeExpectancy))+
geom_point(alpha = 0.6, col = "#800000") +
scale_x_continuous(limits = c(0, 50000),
labels = function(x) x/1000,
breaks = c(0,10000,20000, 30000, 40000)) +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic() +
facet_grid(cols = vars(year))
Pregunta 9
Genere un gráfico de dispersión interactivo de la expectativa de vida al nacer y PIB per cápita para el año
2015. Además, considere que el tamaño de cada punto sea proporcional a la población del país.
library(plotly)
p1 <- wbData3 %>% filter(year==2015) %>%
ggplot(aes(x= gdppc,y=lifeExpectancy, col=region, group = country))+
geom_point(aes(size = population), alpha = 0.6) +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
scale_size_area(name="", guide = FALSE, max_size = 12) +
scale_colour_brewer(name ="", palette = "Set1") +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic()
ggplotly(p1)
8
Pregunta 10
Genere un gráfico de dispersión interactivo de la expectativa de vida al nacer y PIB per cápita para el período
1990-2016. Además, considere que el tamaño de cada punto sea proporcional a la población del país.
library(plotly)
p2 <- wbData3 %>% filter(year>=1990) %>%
ggplot(aes(x= gdppc,y=lifeExpectancy, col=region))+
geom_point(aes(size = population, frame=year, ids = country), alpha = 0.7) +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
scale_size_area(name="", guide = FALSE, max_size = 12) +
scale_color_brewer(name ="", palette = "Set2") +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "1990-2016",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic()
ggplotly(p2) %>%
animation_opts(frame = 1000,
easing = "linear",
redraw = TRUE) %>%
animation_slider(
currentvalue = list(
prefix = "Año ",
font = list(color = "red", size = 20)
))
9
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 5
Profesor: Víctor Macías E.
En esta guía usaremos datos de la Encuesta Nacional de Empleo del Instituto Nacional de Estadísticas para
el trimestre Diciembre-Febrero 2020. Las bases de datos se encuentran disponibles en la siguiente página:
https://www.ine.cl/estadisticas/sociales/mercado-laboral/ocupacion-y-desocupacion
Además se recomienda revisar los siguientes documentos:
• Libro de Códigos Base de Datos de la Encuesta Nacional de Empleo (ENE) https://www.
ine.cl/docs/default-source/ocupacion-y-desocupacion/metodologia/espanol/libro-de-c%C3%
B3digos-base-ene-2020.pdf?sfvrsn=833eaacc_6
• Boletín Complementario Empleo Trimestral https://www.ine.cl/docs/default-source/ocupacion-y-desocupacion/
boletines/2020/pa%C3%ADs/bolet%C3%ADn-complementario-nacional-trimestre-m%C3%
B3vil-diciembre-2019---febrero-2020.pdf
• Metodología de la Encuesta Nacional de Empleo 2020
1
library(dplyr)
library(ggplot2)
library(treemapify)
Pregunta 1
¿Cuántas observaciones tiene la base de datos? ¿Cuál es la unidad de observación? ¿Cuántas variables y de
qué tipo son? ¿Cuál variable identifica el factor de expansión?
glimpse(ene)
Pregunta 2
Construya un histograma que muestre la distribución por edades de la muestra.
ene %>% ggplot(aes(x = edad, y = ..density..)) + geom_histogram()
Pregunta 3
Construya una base que incluya sólo observaciones que pertenezcan a la población en edad de trabajar ¿Cuál
es el tamaño muestral de ocupados, desocupados e inactivos? Usando el factor de expansión trimestral
¿Cuántos ocupados, desocupados e inactivos se estima hay en el país?
# Población en edad de trabajar
pea <- ene %>% filter(!is.na(activ))
# Status ocupacional
pea <- pea %>% mutate(status_ocup = recode(activ,
"1" = "Ocupados",
"2" = "Desocupados",
"3" = "Inactivos"))
# Tamaño muestral por status ocupacional
pea %>% group_by(status_ocup) %>% tally() %>% mutate(prop_pea = n/sum(n)) %>% knitr::kable()
2
Pregunta 4
Represente la distribución porcentual de la población en edad de trabajar por status ocupacional (ocupados,
desocupados e inactivos) usando tres tipos de gráficos: torta, waffle y treemap
# Pie chart
# Waffle
library(waffle)
# Treemap
3
Pregunta 5
Usando un gráfico de barras compare las tasas de participación en la fuerza de trabajo de hombres y mujeres
# Creando variable ft = 1 si individuo pertenece a la fuerza de trabajo, =0 en otro caso
pea <- pea %>% mutate(ft = ifelse(status_ocup == "Ocupados" | status_ocup == "Desocupados", 1, 0))
Pregunta 6
Use un gráfico de doughnut para mostrar la fracción del total de ocupados que son extranjeros.
pea <- pea %>% mutate(nacionalidad = ifelse(nacionalidad == 0, "Nacional", "Extranjero"))
4
Pregunta 7
Use un gráfico de barras para mostrar la proporción de ocupados formales versus informales tanto para los
nacionales como los extranjeros.
pea <- pea %>% mutate(informalidad = ifelse(ocup_form == 1, "Formal", "Informal"))
5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 6
Profesor: Víctor Macías E.
Lovelace, R., Nowosad, J. y J. Muenchow. 2019. “Geocomputation with R”. CRC Press.
https://geocompr.robinlovelace.net/index.html
Entre los paquetes que existen para leer datos geográficos y construir mapas, se encuentran: rgdal, sp,
ggmap, tmap, rworldmap, chilemapas y leaflet. A continuación se presentan algunos recursos para el
aprendizaje:
rgdal
• https://cran.r-project.org/web/packages/rgdal/rgdal.pdf
sp
• https://cran.r-project.org/web/packages/sp/sp.pdf
1
ggmap
• https://cran.r-project.org/web/packages/ggmap/ggmap.pdf
tmap
• https://cran.r-project.org/web/packages/tmap/tmap.pdf
• https://cran.r-project.org/web/packages/tmap/vignettes/tmap-nutshell.html
• Para visualizar la paleta de colores: tmaptools::palette_explorer()
• Tennekes, M. 2018.“tmap: Thematic maps in R”. Journal of the Statistical Software, vol.84(6)
https://www.jstatsoft.org/article/view/v084i06/v84i06.pdf
rworldmap
• https://cran.r-project.org/web/packages/rworldmap/rworldmap.pdf
• Artículo: “rworldmap: a new R package for mapping global data” (South, A. (2011), The R Journal
Vol. 3/1, June)
https://journal.r-project.org/archive/2011-1/RJournal_2011-1_South.pdf
leaflet
• https://cran.r-project.org/web/packages/leaflet/leaflet.pdf
• https://rstudio.github.io/leaflet/
El paquete leaflet permite acceso a más de 100 fuentes de mapas. Por defecto, se usa OpenStreetMap. Si se
quiere acceder a otros tipos de mapas, revisarlos escribiendo names(providers).
library(leaflet)
library(dplyr)
2
Pregunta 1
Use el paquete leaflet para representar en un mapa de la comuna de Santiago los establecimientos educacionales
existentes el año 2018.
La lista de establecimientos se puede obtener del Directorio de Establecimientos Educacionales del Ministerio
de Educación, el cual se encuentra disponible en la siguiente página:
http://datos.mineduc.cl/dataviews/247363/vista-directorio-de-establecimientos-2018/
rm(list = ls())
library(readr)
library(dplyr)
library(stringr)
library(leaflet)
3
Pregunta 2
Usando los paquetes ggplot2 y chilemapas represente en un mapa el porcentaje de la población que tiene 65 y
más años en cada una de las comunas de las Región Metropolitana, según el Censo 2017.
rm(list = ls())
library(readxl)
library(chilemapas)
library(ggplot2)
library(dplyr)
# Graficando polígonos
rm %>%
ggplot() +
geom_sf(aes(geometry = geometry, fill = mas65)) +
scale_fill_gradient(name = "% personas edades 60 y más", low = "white", high = "black") +
labs(title = "% personas 65 y más en comunas de la Región Metropolitana",
caption = "Fuente: Elaboración propia en base a Censo 2017") +
theme_void()
4
Pregunta 3
Usando el paquete leaflet represente en un mapa interactivo el porcentaje de la población que tiene 65 y más
años en cada una de las comunas de las Región Metropolitana, según el Censo 2017.
Para resolver este ejercicio deberá usar los polígonos de las comunas de la Región Metropolitana, los cuales
fueron obtenidos de la siguiente página:
http://geoine-ine-chile.opendata.arcgis.com/datasets/589bb9676dc04a18b2dced0d4b9043bf_6
En este caso, se usará un SpatialPolygonsDataFrame con la extensión shp que contiene la siguiente información:
• data: datos asociados con cada polígono
• polygons: coordenadas para representar los polígonos
• plotOrder: orden en el cual los polígonos son representados en el mapa
• bbox: bounding box para los datos geográficos (por ejemplo, un rectángulo)
• proj4string: sistema de referencia de coordenadas
rm(list = ls())
library(dplyr)
library(rgdal)
library(leaflet)
# Polígonos comunales
comunas_RM <- readOGR("/cloud/project/datos/limites_comunales/", "RM")
# Graficando polígonos
5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 7
Profesor: Víctor Macías E.
Pregunta 1
El archivo anscombe.dta contiene datos de 8 variables.
(a) Grafique la relación entre x e y
rm(list = ls())
library(ggplot2)
library(dplyr)
library(stargazer)
library(gridExtra)
library(haven)
1
Pregunta 2
La base de datos ceosal1 contiene información, correspondiente al año 1990, sobre 209 CEO. Los datos son
usados en el libro “Introducción a la econometría” de Jeffrey Wooldridge. La siguiente tabla presenta las
variables y su descripción contenida en esta base de datos.
Variable Descripción
salary salario de 1990 (miles de dólares)
pcsalary % cambio en salarios 1989-1990
sales ventas de la empresa en 1990 (millones de dólares)
roe ROE, promedio 1988-1990
pcroe % cambio en ROE, 1988-1990
ros retorno accionario, 1988-1990
indus =1 si firma pertenece al sector industrial
finance =1 si firma pertenece al sector financiero
consprod =1 si firma pertenece al retail
utility =1 si firma pertenece al sector transporte o
servicios de útilidad pública
lsalary logaritmo natural del salario
lsales logaritmo natural de las ventas
Usando estos datos se estimará el siguiente modelo que muestra la relación entre el rendimiento sobre el
capital (roe)1 y el sueldo anual que reciben los CEO (salary):
salary = β0 + β1 roe + u
donde el parámetro de interés es β1 que mide la variación del sueldo anual, en miles de dólares, que corresponde
a un incremento de un punto porcentual en el rendimiento sobre capital.
rm(list = ls())
library(ggplot2)
library(dplyr)
library(wooldridge)
library(stargazer)
(a) Esevatime el modelo especificado arriba usando Mínimos Cuadrados Ordinarios, considerando una
especificación con constante y otra sin constante
modelA <- lm(salary ~ roe, data = ceosal1) # modelo con constante
modelB <- lm(salary ~ 0 + roe, data = ceosal1) # modelo sin constante
summary(modelA)
(b) Muestre la relación entre rendimiento sobre el capital y sueldos de los CEO, usando un gráfico de
dispersión, incluyendo la función de regresión muestral estimada en (a).
ggplot(ceosal1, aes(x = roe, y = salary)) + geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "Rendimiento sobre el capital (%)", y = "Salario CEO (miles de dólares)") +
theme(
panel.background = element_blank(),
1 El rendimiento sobre el capital se define en términos de utilidad neta como porcentaje de acciones comunes.
2
axis.line = element_line()
)
(c) Calcule los sueldos predichos por el modelo estimado y los residuos
ceosal1$PredSalary <- predict(modelA) # sueldo estimado
ceosal1$Residuo <- residuals(modelA) # residuos
(d) Muestre las primeras 7 observaciones de las variables salary, roe, salario predicho y residuos.
head(ceosal1[, c("salary","roe","PredSalary","Residuo")], n= 7)
(e) Calcule el intervalo de confianza para β1 usando un nivel de confianza de 90%, 95% y 99%
confint(modelA, "roe", level = 0.90)
confint(modelA, "roe", level = 0.95)
confint(modelA, "roe", level = 0.99)
(f) Estime el modelo por MCO usando la forma matricial del modelo de regresión lineal múltiple
y = ceosal1$salary
x = cbind(1, ceosal1$roe)
(g) Obtenga los errores estándar de β̂’s, usando la matriz de varianzas y covarianzas de β̂
round(diag(sqrt(vcov(modelA))),3)
Pregunta 3
En este ejemplo se usarán 526 observaciones sobre trabajadores en la base de datos wage1.dta 2 para estimar
los retornos a la educación. A continuación se presentan las variables incluidas en la base de datos:
Variable Descripción
wage Salario por hora (en dólares)
educ Años de educación
exper Años de experiencia potencial
tenure Años de trabajo con empleador actual
nonwhite =1 si la persona no es blanca
female =1 si persona es mujer
married =1 si persona es casada
numdep Número de dependientes
smsa =1 si persona reside en SMSA
northcen =1 si persona reside en zona Central Norte
south =1 si persona reside en zona Sur
west =1 si persona reside en zona Oeste
2 Estos datos también son usados en el libro “Introducción a la econometría” de Jeffrey Wooldridge
3
Variable Descripción
construc =1 si persona trabaja en construcción
ndurman =1 si persona trabaja en manufactura de no
durable
trcommpu =1 si persona trabaja en transporte,
comunicaciones y servicios públicos
trade =1 si persona trabaja en retail o comercio
mayorista
services =1 si persona trabaja en industria de servicios
profserv =1 si persona trabaja en industria de servicios
profesionales
profocc =1 si persona tiene ocupación profesional
clerocc =1 si persona tiene ocupación de tareas de oficina
servocc =1 si persona tiene ocupación de servicios
lwage logaritmo del salario
expersq cuadrado de la experiencia potencial
tenuresq cuadrado de años de trabajo con empleador actual
En este ejemplo se busca estimar el efecto de la variable educación sobre el salario para lo cual se incluyen 3
especificaciones. La especificación más simple sólo incluye la variable educ como regresor.
log(wage) = β0 + β1 educ + u
donde el parámetro de interés es β1 que mide el efecto de la variable educación (educ) sobre el salario (wage),
manteniendo constantes todos los otros factores que afectan a wage. En este caso, β1 mide los retornos a la
educación.
rm(list = ls())
library(wooldridge)
data(wage1)
(a) Replique los resultados de las estimaciones por Mínimos Cuadrados Ordinarios de distintas especifica-
ciones del modelo que se presentan en la siguiente tabla3 .
modelw_1 <- lm(log(wage) ~ educ, data = wage1)
(b) Calcule el R2 de la especificación (3) a partir del cuadrado del coeficiente de correlación entre los valores
observados del logaritmo de los salarios y los valores estimados a partir del modelo.
wage1$PredSalary <- predict(modelw_3) # sueldo estimado
paste0("R2 = ", round(cor(log(wage1$wage), wage1$PredSalary)^2,3))
H0 : β 1 = β 2 = β 3 = β 4 = β 5 = β 6 = β 7 = 0
3 Se usará el paquete stargazer que produce tablas bien formateadas con los resultados de una regresión. Una descripción de
4
y la hipótesis alternativa es que por lo menos uno de los βj es distinto de cero. Nota: Use el siguiente
estadígrafo de prueba:
R2 /k
2
∼ Fk,n−k−1
(1 − R )/(n − k − 1)
paste0("F Statistic = ", round(
(summary(modelw_3)$r.squared/7)/((1-summary(modelw_3)$r.squared)/(526-7-1)),2)
)
paste0("p-value = ", round(1-pf(58.37,7,518),3))
5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 9
Profesor: Víctor Macías E.
Pregunta 1
Construya un loop que itere sobre el vector (1, 2, 3, 4, 5, . . . , 10)
# Forma 1
for (i in seq(1,10,1)) {
cat("Iteración ", i, "\n")
#print(paste("Iteración", i))
}
# Forma 2
i=1
while (i<=10) {
print(paste("Iteración", i))
i=i+1
}
Pregunta 2
Genere un loop que itere sobre el vector que contiene a las letras A, B, C, D y E.
# Forma 1
#x=LETTERS[1:5]
x = c("A", "B", "C", "D", "E")
for (i in x) {
#print(i)
cat(i, "\n")
}
# Forma 2
i=1
while (i<=length(x)) {
cat(x[i], "")
1
i=i+1
}
Pregunta 3
Genere un loop que entregue el siguiente resultado:
0+1=1
1+2=3
2+3=5
3+4=7
4+5=9
# Forma 1
for (i in 0:4) {
cat(i,"+",i+1,"=", 2*i+1, "\n")
}
# Forma 2
#for (i in 1:5) {
# cat(i-1,"+",i,"=", 2*i-1, "\n")
#}
# Forma 3
#for (i in 0:4) {
# print(paste(i,"+",i+1,"=", 2*i+1))
#}
# Forma 4
#i=0
#while (i<=4) {
# cat(i,"+",i+1,"=", 2*i+1, "\n")
# i=i+1
#}
Pregunta 4
Construya un loop que itere sobre cada uno de los números que constituyen la secuencia {1, 2, 3, 4, 5, 6, 7, 8,
9, 10} y calcule el cuadrado del número si es menor o igual a 6, si es 7 o 9, que entregue el número 0 y, en
cualquier otro caso que entregue el número 2.
for (i in 1:10) {
if (i<=6) {
cat("El cuadrado del número", i, "es", i^2, "\n")
}
else if (i==7 | i==9) {
2
cat(0, "\n")
}
else {
cat(2, "\n")
}
}
Pregunta 5
Construya un loop que itere sobre cada uno de los números que constituyen la secuencia {1, 2, 3, . . . , 15} y
entregue un output que señale si el número es o no divisible por 6.
for (n in 1:15) {
if (n %% 6 == 0) {
print(paste(n, "es divisible por 6"))
#cat(n, "es divisible por 6", "\n")
}
else {
print(paste(n, "no es divisible por 6"))
#cat(n, "no es divisible por 6", "\n")
}
}
Pregunta 6
Construya un loop que genere la secuencia de Fibonacci la que se caracteriza porque cada número es la suma
de los dos números previos. Por ejemplo, 0,1,1,2,3,5,8,13,21,34,55,89,144,233
fib <- 0 #almacena secuencia de Fibonacci
fib[2] <- 1
i <- 1
while (i <= 12){
fib[i + 2] <- fib[i] + fib[i+1]
i <- i + 1
}
fib
Pregunta 7
Genere un tibble con las variables x e y y calcule la media aritmética de cada una de ellas.
x y
1 2
2 0
3 1
4 4
5 NA
3
# Forma 1
library(tibble)
df <- tibble(
x = 1:5,
y = c(2,0,1,4,NA)
)
for (i in 1:length(df)) {
promedio = mean(df[[i]], na.rm = TRUE)
cat(promedio, "es el promedio de la columna", i, "\n")
}
# Forma 2
library(dplyr)
df %>% summarise_all(list(mean), na.rm = TRUE)
Pregunta 8
Construya la siguiente matriz y genere un loop que imprima el mensaje de abajo.
2 4 0
X = −1 9 6
0 0 1
for (i in 1:nrow(A)) {
for (j in 1:ncol(A)) {
print(paste("El elemento de la fila", i, " y columna ", j, "de la matriz A es", A[i,j]))
}
}
4
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 10
Profesor: Víctor Macías E.
Pregunta 1
Contruya una función que entregue como output si un número es o no divisible por 6
div6 <- function(x) {
if (x %% 6 == 0) {
print(paste(x, "es divisible por 6"))
}
else {
print(paste(x, "no es divisible por 6"))
}
}
1
Pregunta 2
Construya una función denominada moneda que permita simular el lanzamiento de una moneda. Dicha
función debe tener dos argumentos: num que representa el número de lanzamientos y pcara es la probabilidad
de obtener una cara.
moneda <- function(num, pcara = 0.5) {
lado <- c("cara", "sello")
p <- c(pcara, 1-pcara)
sample(lado, num, replace = TRUE, prob = p)
}
Pregunta 3
Construya una función que para una tasa de crecimiento dada entregue el número de períodos que se necesitan
para que una variable doble su valor.
dos_a <- function(x) {
n <- log10(2)/log10(1+(x/100))
return(n)
}
Pregunta 4
Construya una función que entregue la media aritmética o media geométrica de un conjunto de datos.
avg <- function(x, arithmetic = TRUE) {
x = x[!is.na(x)]
n = length(x)
ifelse(arithmetic, sum(x)/n, prod(x)^(1/n))
}
v=c(4,5,6,NA,2)
avg(v, arithmetic = TRUE)
avg(v, arithmetic = FALSE)
Pregunta 5
Construya una función que entregue la media aritmética y desviación estándar de un conjunto de datos.
des <- function(x) {
x = x[!is.na(x)]
media = sum(x)/length(x)
sdesv = sqrt(sum((x-media)^2)/(length(x) - 1))
return(list(MEDIA= media, DESVIACION_ESTANDAR= sdesv))
}
v = c(1,10,6,4,3, NA, 19,2)
des(v)
2
Pregunta 6
Construya una función que permita graficar el valor de una máquina en el año t que es igual a:
At = A0 (1 − δ)t
data=data.frame(t, valor)
data %>% ggplot() +
geom_line(aes(t,valor), size=1.2) +
labs(title =
paste0("Vida útil =", vida_util," años", "\n", "Tasa depreciación = ", tasa*100, "%"),
x = "Año",
y = "Valor de máquina ($)") +
theme(panel.background = element_blank(),
axis.line = element_line())
}
Pregunta 7
Construya una función que permita calcular el valor presente neto (V P N ) de un flujo de efectivo.
T
X Ft
V PN =
t=0
(1 + r)t
Ejemplo:
3
Si la tasa de descuento es 12% el valor presente neto es:
100000 150000 180000 200000 300000
V P N = −500000 + + + + + = 134317
(1 + 0, 12) (1 + 0, 12)2 (1 + 0, 12)3 (1 + 0, 12)4 (1 + 0, 12)5
4
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 11
Profesor: Víctor Macías E.
1
rm(list = ls())
library(dplyr)
library(ggplot2)
Pregunta 1
Represente gráficamente la distribución normal para µ = 0 y σ = 1, 1.5, 2
data.frame(x=c(-6,6)) %>% ggplot(aes(x)) +
stat_function(fun=dnorm, args=list(mean=0, sd=1),
geom="line", colour="red", size=1.2) +
stat_function(fun=dnorm, args=list(mean=0, sd=1.5),
geom="line", colour="black", size=1.2) +
stat_function(fun=dnorm, args=list(mean=0, sd=2),
geom="line", colour="blue", size=1.2) +
ylab("Densidad") +
theme(
panel.background = element_blank(),
axis.line = element_line()
)
Pregunta 2
Sea z ∼ N (0, 1). Muestre gráficamente P r(1 ≤ z ≤ 2)
z=seq(-3,3,0.01)
densidad=dnorm(z)
dn = data.frame(z, densidad)
dn %>% ggplot(aes(z,densidad)) +
geom_line() +
geom_area(aes(x = ifelse(z>1 & z < 2, z, NA)), fill = "#8C446F") +
scale_x_continuous(expand = c(0,0)) +
scale_y_continuous(expand = c(0,0), limits = c(0, 0.5)) +
theme(
panel.background = element_blank(),
axis.line.x = element_line(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
)
2
Pregunta 3
Grafique la siguiente función y = −x2 + 10x donde 0 ≤ x ≤ 10.
# Forma 1
x = seq(0,15,0.01)
y = -x^2 + 10*x
df <- data.frame(x,y)
Pregunta 4
La función de demanda es Qd = AP − , donde es el valor absoluto de la elasticidad precio de la demanda.
Grafique la función de demanda para A = 5 y = 1
A=5
eps=1
data=data.frame(Q,P)
data %>% ggplot(aes(x = Q, y = P)) + geom_line(size=1.2) +
labs(x = "Cantidad demandada", y = "Precio") +
theme(
panel.background = element_blank(),
axis.line = element_line()
)
3
Pregunta 5
Las curvas de oferta y demanda de un mercado están representadas por:
P
Qs = −1
2
P
Qd = 15 −
2
Grafique estas curvas y determine el precio y cantidad de equilibrio usando uniroot()
demanda <- function(q) {30 - 2*q}
oferta <- function(q) {2*q + 2}
# Rango de cantidades
x <- 0:15
# Cantidad de equilibrio
q <- uniroot(function(x) demanda(x) - oferta(x), range(x))$root
# Precio de equilibrio
p <- oferta(q)
paste0("Precio de equilibrio es ", p, " y la cantidad de equilibrio es ", q)
ggplot(data.frame(x=c(0,15))) +
stat_function(fun = demanda, size = 1) +
stat_function(fun = oferta, size = 1) +
labs(x = "Cantidad", y = "Precio") +
scale_x_continuous(expand = c(0,0), breaks =c(5,10,15),
labels =c(5,10,15),
limits = c(0,18)) +
scale_y_continuous(expand = c(0,0), limits = c(0,32)) +
annotate("point", x = q, y = p, colour = "grey10", size = 2.5) +
annotate("segment", x = q, xend = q, y = 0, yend = p,
linetype = "dashed", color = "blue") +
annotate("segment", x = 0, xend = q, y = p, yend = p,
linetype = "dashed", color = "blue") +
annotate("text", x = 14.8, y = 3, label = "Demanda") +
annotate("text", x = 13, y = 30, label = "Oferta") +
theme(panel.background = element_blank(),
axis.line = element_line())
Pregunta 6
Represente gráficamente el camino aleatorio yt = yt−1 + t , donde t ∼ N (0, 1)
#set.seed(123)
y <- rep(NA,1000)
e <- rep(NA,1000)
y[1]=10
for (t in 2:1000) {
e[t] <- rnorm(1)
y[t] <- y[t-1]+e[t]
}
4
time <- 1:1000
data <-data.frame(time, y)
data %>% ggplot(aes(time, y)) + geom_line(size=0.8) +
theme(
panel.background = element_blank(),
axis.line = element_line()
)
Pregunta 7
Represente gráficamente los siguientes procesos ARIM A(p, d, q) (autoregressive integrated moving average)1 .
(a) Yt = t + 0.9t−1 (M A(1))
plot(arima.sim(list(order = c(0,0,1), ma = 0.9), n = 500))
Pregunta 8
En un campus universitario de 1000 alumnos, dos alumnos fueron diagnosticados con una enfermedad
altamente contagiosa. Las autoridades universitarias se encuentran fuertemente preocupadas, ya que la
literatura científica evidencia una alta tasa de propagación.
Un especialista recomienda usar el siguiente modelo que describe la evolución del número de personas
contagiadas:
mt+1 = mt + k × mt × (1000 − mt )
donde mt es el número de personas contagiadas en el día t y k es un parámetro relacionado a la tasa de
contagio.
Si no se toman medidas, ¿Después de cuántos días se llega a aproximadamente 1000 contagiados? (Asuma
k = 0.001).
m <- rep(NA,15)
m[1] = 3 # contagiados en el periodo incicial
k = 0.001
for (t in 1:14) {
m[t+1] = m[t]+k*m[t]*(1000 - m[t])
}
5
scale_x_continuous(breaks = c(2,4,6,8,10,12,14,16), labels = c(2,4,6,8,10,12,14,16)) +
labs(x = "Número de días", y = "Número de personas contagiadas", title =
"Evolución número de contagiados") +
theme(
panel.background = element_blank(),
axis.line = element_line()
)