##Haga Click Aqui para ver Certificado Machine Learning MIT https://www.credential.net/4dd365ea-ea5a-46a2-a72e-539e70545c6e
##Haga Click Aqui para ver Certificado Columbia Python for Managers https://certificates.emeritus.org/0a2e1de7-add2-4710-ad49-417d1dadfb61#gs.4a92hv ##Contacto: rchang@unah.edu.hn
Para Bolsa de Valores https://rchang.shinyapps.io/rchang-stock-exchange/
Para el Estado del Clima https://rchang.shinyapps.io/rchang-app_clima_ho/
Para Machine Learning https://rchang.shinyapps.io/rchang-app/
Para Empresariales e Industriales https://rchang.shinyapps.io/rchang-app_final_emp/
Para Dashboards con log in https://rchang.shinyapps.io/clase_3-shiny-2/_w_ae4e775f/_w_f249a9a1/?page=sign_in
y para Sistemas de Información Geográfica
Números Índices
Se han creado 5 funciones que van a permitir:
#Obtener una serie de números índices: SerieIndiceSimple().
#Enlazar series de números índices con distinta base: EnlaceSeries().
#Cambiar de base en series de números índices: CambioBase().
#Calcular la tasa media de variación: TMV().
#Deflactar series económicas: Deflactacion().
SerieIndiceSimple <- function(SerieValores, ValorPeriodoBase) {
SerieIndice <- (SerieValores/ValorPeriodoBase)*100
SerieIndice
}
EnlaceSeries <- function(SerieAntigua, SerieNueva) {
longitud <- length(SerieAntigua)
denominador <- SerieAntigua[longitud]
NuevaSerieAntigua <- (SerieAntigua/denominador)*100
SerieEnlazada <- c(NuevaSerieAntigua[1:(longitud-1)], SerieNueva)
SerieEnlazada
}
CambioBase <- function(SerieNumeroIndice, IndiceNuevaBase) {
NuevaSerieNumeroIndice <- (SerieNumeroIndice/IndiceNuevaBase)*100
NuevaSerieNumeroIndice
}
Deflactacion <- function(PreciosActuales, Deflactor) {
PreciosConstantes <- (PreciosActuales/Deflactor)*100
PreciosConstantes
}
TMV <- function(valorinicial, valorfinal, periodo) {
cociente <- valorfinal/valorinicial
raiz <- cociente^(1/periodo)
tmv <- raiz - 1
}
Para probar el código anterior basta con escribir:
Serie <- c(55, 63, 65, 72)
Serie1 <- c(121, 123, 126, 131, 135)
Serie2 <- c(100, 103, 106, 109, 113, 117)
Serie3 <- c(78, 85, 95, 100)
SerieIndiceSimple(Serie, Serie[1])
## [1] 100.0000 114.5455 118.1818 130.9091
EnlaceSeries(Serie1, Serie2)
## [1] 89.62963 91.11111 93.33333 97.03704 100.00000 103.00000 106.00000
## [8] 109.00000 113.00000 117.00000
CambioBase(Serie1, Serie1[3])
## [1] 96.03175 97.61905 100.00000 103.96825 107.14286
TMV(Serie[1], Serie[4], 3)
Deflactacion(Serie, Serie3)
## [1] 70.51282 74.11765 68.42105 72.00000
#Análisis descriptivo de Series Cronológicas
Se han creado las funciones siguientes para:
Métodos de análisis de la tendencia: funciones TendenciaMediasMoviles (que a su vez usa las funciones Par y MediasGrupos) y TendenciaRegresion.
Métodos de análisis de las variaciones estacionales: funciones EstacionalMediasMoviles (que a su vez usa las funciones TendenciaMediasMoviles y Media) y EstacionalRegresion (que a su vez usa la función Regresion).
Par <- function(numero)
{
modulo <- numero %% 2
modulo
# si modulo = 0, entonces numero es par
# si modulo = 1, entonces numero es impar
}
MediasGrupos <- function(SerieTemporal, p)
{
longitud <- length(SerieTemporal)
grupo <- array(0,c(longitud-p+1,p))
mediagrupo <- array(0,c(longitud-p+1,1))
i <- 1
k <- 1
grupo[i,1:p] <- SerieTemporal[1:p]
mediagrupo[i] <- mean(grupo[i,1:p])
while (p+k <= longitud)
{
i <- i + 1
grupo[i,1:p] <- SerieTemporal[(1+k):(p+k)]
mediagrupo[i] <- mean(grupo[i,1:p])
k <- k + 1
}
#grupo
mediagrupo
}
TendenciaMediasMoviles <- function(SerieTemporal, p, representacion=TRUE)
{
#represento la serie original por defecto
if (representacion==TRUE)
{
win.graph()
#postscript("SerieOriginal.eps", horizontal=FALSE, onefile=FALSE, height=8, width=6, pointsize=10)
jpeg("SerieOriginal.jpg")
plot(SerieTemporal, xlab="Tiempo", ylab="Serie Temporal", type="o")
dev.off()
}
#calculo la serie suavizada y la centro
Medias <- MediasGrupos(SerieTemporal, p)
SerieSuavizada <- array(NA,c(1,length(SerieTemporal)))
centrada <- Par(p)
if (centrada == 1)
{
k <- (p+1)/2
for (i in 1:length(Medias))
{
SerieSuavizada[k] <- Medias[i]
k <- k + 1
}
}
else
{
Medias <- MediasGrupos(Medias, 2)
k <- ((p+1)/2+0.5)
for (i in 1:length(Medias))
{
SerieSuavizada[k] <- Medias[i]
k <- k + 1
}
}
#represento la serie original y suavizada de forma conjunta
if (representacion==TRUE)
{
win.graph()
#postscript("SerieOriginalSuavizada.eps", horizontal=FALSE, onefile=FALSE, height=8, width=6, pointsize=10)
jpeg("SerieOriginalSuavizada.jpg")
plot(SerieTemporal, type="n")
Series <- ts(matrix(c(SerieTemporal, SerieSuavizada), length(SerieTemporal), 2))
plot(Series, plot.type="single", xlab="Tiempo", ylab="Serie Temporal Original y Suavizada", lty=1:2, col=1:2)
dev.off()
graphics.off()
}
#devuelvo la serie suavizada
SerieSuavizada
}
TendenciaRegresion <- function(SerieTemporal, Tiempos, representacion=TRUE)
{
mediaSerieTemporal <- mean(SerieTemporal)
varianzaSerieTemporal <- var(SerieTemporal)
mediaTiempos <- mean(Tiempos)
varianzaTiempos <- var(Tiempos)
covarianza <- cov(SerieTemporal, Tiempos)
pendiente <- covarianza/varianzaTiempos
independiente <- mediaSerieTemporal - pendiente*mediaTiempos
coeficientedeterminacion <- (covarianza^2)/(varianzaSerieTemporal*varianzaTiempos)
informe <- c(mediaSerieTemporal, varianzaSerieTemporal, mediaTiempos, varianzaTiempos, covarianza, coeficientedeterminacion, independiente, pendiente)
names(informe) <- c("Media Serie Temporal", "Varianza Serie Temporal", "Media Tiempos", "Varianza Tiempos", "Covarianza", "Coeficiente Determinacion", "Término Independiente", "Pendiente")
#represento los puntos y la recta calculada
if (representacion==TRUE)
{
#postscript("SerieOriginalRecta.eps", horizontal=FALSE, onefile=FALSE, height=8, width=6, pointsize=10)
jpeg("SerieOriginalRecta.jpg")
plot(Tiempos, SerieTemporal, type="o", las=2)
abline(independiente, pendiente, lty=2, col=2)
dev.off()
}
#salida
informe
}
Media <- function(vector)
{
longitud <- length(vector)
media <- 0
total <- 0
for (i in 1:longitud)
{
if (is.na(vector[i]) == FALSE)
{
media <- vector[i] + media
total <- total + 1
}
}
media <- media/total
media
}
EstacionalMediasMoviles <- function(SerieTemporal, p, representacion=TRUE)
{
SerieSuavizada <- TendenciaMediasMoviles(SerieTemporal, p, FALSE)
Serie1 <- SerieTemporal/SerieSuavizada
Serie2 <- matrix(Serie1, ncol=p, byrow=T)
M <- array(0, c(1, p))
for (i in 1:p)
{
M[i] <- Media(Serie2[,i])
}
MA <- mean(M)
IVE <- array(0, c(1, p))
for (i in 1:p)
{
IVE[i] <- M[i]/MA
}
dimensiones <- dim(Serie2)
SerieDesestacionalizada <- matrix(0, nrow=dimensiones[1], ncol=dimensiones[2])
Serie3 <- matrix(SerieTemporal, ncol=p, byrow=T)
for (i in 1:p)
{
SerieDesestacionalizada[,i] <- Serie3[,i]/IVE[i]
}
# represento serie original y desestacionalizada
if (representacion==TRUE)
{
SerieDesestacionalizada0 <- as.vector(t(SerieDesestacionalizada))
Series <- ts(matrix(c(SerieTemporal, SerieDesestacionalizada0), length(SerieTemporal), 2))
#postscript("SerieOriginalDesestacionalizada.eps", horizontal=FALSE, onefile=FALSE, height=8, width=6, pointsize=10)
jpeg("SerieOriginalDesestacionalizada.jpg")
plot(Series, plot.type="single", lty=1:2, col=1:2)
dev.off()
}
# salida
salida <- list(IVE, SerieDesestacionalizada)
names(salida) <- c("Índices Variación Estacional", "Serie Desestacionalizada")
salida
}
RegresionT <- function(Y, X)
{
mediaX <- mean(X)
varianzaX <- var(X)
mediaY <- mean(Y)
varianzaY <- var(Y)
covarianza <- cov(Y,X)
pendiente <- covarianza/varianzaX
independiente <- mediaY - pendiente*mediaX
coeficientedeterminacion <- (covarianza^2)/(varianzaX*varianzaY)
informe <- c(independiente, pendiente, mediaX, varianzaX, mediaY, varianzaY, covarianza, coeficientedeterminacion)
informe
}
EstacionalRegresion <- function(SerieTemporal, Tiempos, p, representacion=TRUE)
{
Serie1 <- matrix(SerieTemporal, ncol=p, byrow=T)
dimensiones <- length(Tiempos)
MediasAnuales <- array(0, c(1, dimensiones))
for (i in 1:dimensiones)
{
MediasAnuales[i] <- mean(Serie1[i,])
}
b <- RegresionT(as.vector(MediasAnuales), Tiempos)
M <- array(0, c(1, p))
MM <- array(0, c(1, p))
for (i in 1:p)
{
M[i] <- mean(Serie1[,i])
resto <- b[2]*(i-1)
MM[i] <- M[i] - resto/p
}
MA <- mean(MM)
IVE <- array(0, c(1, p))
for (i in 1:p)
{
IVE[i] <- MM[i]/MA
}
dimensiones <- dim(Serie1)
SerieDesestacionalizada <- matrix(0, nrow=dimensiones[1], ncol=dimensiones[2])
for (i in 1:p)
{
SerieDesestacionalizada[,i] <- Serie1[,i]/IVE[i]
}
# represento serie original y desestacionalizada
if (representacion==TRUE)
{
SerieDesestacionalizada0 <- as.vector(t(SerieDesestacionalizada))
Series <- ts(matrix(c(SerieTemporal, SerieDesestacionalizada0), length(SerieTemporal), 2))
jpeg("SerieOriginalDesestacionalizada.jpg")
plot(Series, plot.type="single", lty=1:2, col=1:2)
dev.off()
}
# salida
salida <- list(IVE, SerieDesestacionalizada)
names(salida) <- c("Índices Variación Estacional", "Serie Desestacionalizada")
salida
}
datos <- c(82, 70, 49, 76, 99, 111, 101, 133, 115, 121, 93, 123)
anos1 <- c(2001, 2002, 2003)
anos2 <- c(2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012)
TendenciaMediasMoviles(datos,4)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
## [1,] NA NA 71.375 78.625 90.25 103.875 113 116.25 116.5 114.25 NA NA
TendenciaRegresion(datos,anos2)
## Media Serie Temporal Varianza Serie Temporal Media Tiempos
## 9.775000e+01 6.178409e+02 2.006500e+03
## Varianza Tiempos Covarianza Coeficiente Determinacion
## 1.300000e+01 6.586364e+01 5.400965e-01
## Término Independiente Pendiente
## -1.006805e+04 5.066434e+00
EstacionalMediasMoviles(datos, 4)
## $`Índices Variación Estacional`
## [,1] [,2] [,3] [,4]
## [1,] 1.054859 1.076925 0.7998816 1.068334
##
## $`Serie Desestacionalizada`
## [,1] [,2] [,3] [,4]
## [1,] 77.73550 64.99987 61.25906 71.1388
## [2,] 93.85139 103.07123 126.26868 124.4929
## [3,] 109.01929 112.35693 116.26720 115.1325
EstacionalRegresion(datos,anos1,4)
## $`Índices Variación Estacional`
## [,1] [,2] [,3] [,4]
## [1,] 1.101844 1.063107 0.7824114 1.052638
##
## $`Serie Desestacionalizada`
## [,1] [,2] [,3] [,4]
## [1,] 74.42071 65.84473 62.6269 72.19958
## [2,] 89.84940 104.41093 129.0881 126.34927
## [3,] 104.37051 113.81732 118.8633 116.84932
#El índice de Laspeyres
Generalmente, el índice de Laspeyres es usado en las mediciones económicas como una medida de la variación del volumen, siendo una media ponderada del ratio de las cantidades entre el valor de ellas, lo que dicho de otra forma, es una media ponderada de los ratios de las cantidades producidas en la economía, la cual puede expresarse en la siguiente ecuación:
LQ=∑i=1nQit+1Qit∗Vit∑ni=1∗Vit
Donde Vit es el valor de producción total y el periodo t como el año base con el que se va a comparar la variación de cantidades. El índice de Laspeyres también puede ser utilizado considerar la variabilidad en los precios, por lo que la ecuación 1.28 puede ser modificada a:
LP=∑i=1nPit+1Pit∗Vit∑ni=1∗Vit
Ahora, regresando a la ecuación 1.28, sabemos que Vi es equivalente a Pi∗Qi, por lo que la ecuación puede ser simplificada de la siguiente manera:
LQ=∑ni=1Pt∗Qt+1∑ni=1Pt∗Qt
Siendo las ecuaciones última y penúltima similares algebraicamente, por lo que utilizando cualquiera de ambas, se obtendrá el mismo resultado para calcular la variación de los precios/cantidades. Ahora, también se debe de considerar que el índice de Laspeyres es que presupone que las cantidades en el año base siempre son las mismas (razón por la que usualmente es utilizado para calcular variaciones en cantidades y no en precios), por lo que dada dicha inconveniencia que puede ser poco realista a lo largo del tiempo, se implementó el índice de Paasche.
#El índice de Paasche
Este índice es definido de manera recíproca al índice de Laspeyres, aplicando los valores a precios corrientes en el periodo t+1 como ponderaciones, utilizando una media armónica (índice no ponderado que es igual a la inversa de la media aritmética) del precio y el ratio de las cantidades en lugar de la media aritmética. El índice en cuestión puede ser expresado con la siguiente ecuación:
PP=∑ni=1Vt+1∑ni=1Vt+1∗PtPt+1
Al igual que con el índice de Laspeyres, Vit+1 equivale a Pit+1+Qit+1, por lo que la ecuación 1.31 puede ser simplificada por la expresión siguiente:
PP=∑ni=1Pt+1∗Qt+1∑ni=1Pt∗Qt+1
}Como se puede observar en la ecuación anterior, lo que permanece constante es la variación en los volúmenes de producción, teniendo un inverso del índice de Laspeyres, lo que de hecho resulta bastante útil si obtenemos la variación en volumen por el índice de Laspeyres y la variación de los precios por el índice de Paasche, por lo que se puede inferir que al obtener el producto de ambos índices en una sola ecuación, entonces habremos obtenido la variación en valor (precio por cantidad) de los bienes y servicios a precios corrientes (nominales) en una economía, lo que puede ser expresado de la siguiente manera:
LQ∗PP=∑ni=1Pt∗Qt+1∑ni=1Pt∗Qt∗∑ni=1Pt+1∗Qt+1∑ni=1Pt∗Qt+1=∑ni=1Vt+1∑ni=1Vt
De hecho, la ecuación anterior nos muestra que la variación de un agregado a precios corrientes es igual a multiplicar el índice de volumen por el índice de precios. La ecuación anterior es utilizada comúnmente como “deflactor”, por ejemplo, cuando se quiere obtener indirectamente el índice de volumen, por lo que se divide la variación relativa del valor entre el índice de precios calculo por el método de Paasche, lo que de hecho es una forma más sencilla de calcular el volumen, lo que puede verse de la siguiente manera:
LQ=∑ni=1Vt+1∑ni=1VtPP
#El índice de Fisher
Como hemos visto anteriormente, tanto el índice de Laspeyres como el de Paasche tienen ventajas y desventajas, en la obtención de información y en sus resultados, por lo tanto, no existe ningún índice que cumpla todos los requisitos para ser el ideal. El índice de Laspeyres tiende a sobreponderar los bienes cuyos precios aumentan (darle “más peso a la inflación”), mientras que por el contrario, el índice de Paasche tiende a sobreponderar los bienes cuyos precios disminuyen (darle “menor peso a la inflación”), por lo que una forma de compensar dichas desventajas en ambos casos fue la de implementar el índice ideal de Fisher, que se basa en una media geométrica de los números índices anteriormente discutidos, por lo que en particular verifica el criterio de la inversión temporal y el criterio de la inversión de factores, teniendo la siguiente ecuación:
FP=(∑ni=1Pt+1∗Qt∑ni=1Pt∗Qt)(∑ni=1Pt+1∗Qt+1∑ni=1Pt∗Qt+1
Sin embargo, a pesar de que este índice trata de compensar los problemas de los otros dos, en cuentas nacionales no es muy usado debido a que su interpretación sigue a discusión entre los economistas actualmente, motivo por el que no nos detendremos mucho a analizar este índice.
#Ejercicio
Para la obtención de índices de precios/cantidades haremos uso del paquete micEconIndex, el cual nos ahorrará mucho trabajo de cálculo. Los datos a utilizar provendrán del paquete micEcon, por lo que no es necesario que el lector tenga que descargar ninguna base de datos externa a la consola de R. A continuación presentamos el método para ello:
# Cargamos los respectivos paquetes
library(micEconIndex)
## Warning: package 'micEconIndex' was built under R version 4.1.3
library(micEcon)
## Warning: package 'micEcon' was built under R version 4.1.3
##
## If you have questions, suggestions, or comments regarding one of the 'micEcon' packages, please use a forum or 'tracker' at micEcon's R-Forge site:
## https://r-forge.r-project.org/projects/micecon/
# Visualizamos los datos
data( Missong03E7.7, package = "micEcon" )
head(Missong03E7.7)
## p.beef q.beef p.veal q.veal p.pork q.pork
## 1986 11.31 1.270 13.68 0.068 8.20 3.829
## 1987 11.22 1.225 13.94 0.066 8.03 3.727
## 1988 11.64 1.149 14.79 0.048 8.03 3.365
## 1989 12.66 0.958 16.06 0.033 9.24 2.854
Como podemos observar, la base cuenta con 3 variables para precios y 3 para cantidades respectivamente, los cuales se distribuyen a lo largo de 4 años. Ahora, procederemos a calcular índices de precios con la función priceIndex. Primero, hay que analizar rápidamente la función que vamos a implementar. Para poder obtener de manera correcta los respectivos índices hay que darle a la función un vector de precios, el cual fue el primero que indicamos (c( “p.beef”, “p.veal”, “p.pork” )), después, hay que darle un vector de cantidades (c( “q.beef”, “q.veal”, “q.pork” )), después indicamos el año base, la base de datos de donde obtendremos la información y el método que vamos a utilizar para calcular el índice (en esta última parte podemos no escribir nada y la función va a calcular un índice de Laspeyres por default). A continuación se presentan los resultados:
# Indices de precios
# Indice de Laspeyres
priceIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 1, Missong03E7.7, method = "Laspeyres" )
## 1986 1987 1988 1989
## 1.0000000 0.9839897 0.9966514 1.1254719
# Indice de Paasche
priceIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 1, Missong03E7.7, method = "Paasche" )
## 1986 1987 1988 1989
## 1.0000000 0.9839652 0.9966153 1.1251109
# Indice de Fisher
priceIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 1, Missong03E7.7, method = "Fisher" )
## 1986 1987 1988 1989
## 1.0000000 0.9839775 0.9966334 1.1252914
Podemos observar que el al ser la primer observación el año base entonces tendremos un valor de 1. Si decidieramos cambiar de año base a, por ejemplo, 1988, simplemente tendremos que indicarle a la función que queremos que nuestro año base sea el de la tercera observación de la siguiente manera:
# Indice de Laspeyres con año base 1988
priceIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 3, Missong03E7.7, method = "Laspeyres" )
## 1986 1987 1988 1989
## 1.0033962 0.9872673 1.0000000 1.1290490
Ahora, para calcular los índices de cantidades la metodología es prácticamente la misma, pero en lugar de usar la función priceIndex utilizaremos la función quantityIndex, de la siguiente manera:
# Indices de cantidades
# Indice de Laspeyres
quantityIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 1, Missong03E7.7, method = "Laspeyres" )
## 1986 1987 1988 1989
## 1.0000000 0.9706006 0.8833432 0.7429413
# Indice de Paasche
quantityIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 1, Missong03E7.7, method = "Paasche" )
## 1986 1987 1988 1989
## 1.0000000 0.9705765 0.8833112 0.7427030
# Indice de Fisher
quantityIndex( c( "p.beef", "p.veal", "p.pork" ),
c( "q.beef", "q.veal", "q.pork" ), 1, Missong03E7.7, method = "Fisher" )
## 1986 1987 1988 1989
## 1.0000000 0.9705885 0.8833272 0.7428221