##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

Algunos Dashboards elaborados son:

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