Posit Cloud: sube este archivo
.Rmdy los tres CSV al mismo proyecto. Puedes usar Files → Upload.
Si no encuentras los CSV, este informe los generará con valores por defecto en el directorio del proyecto.
# Instalación rápida en Posit Cloud
req <- c("tidyverse","lubridate","scales","readr","glue")
new <- req[!(req %in% installed.packages()[,"Package"])]
if(length(new)) install.packages(new, dependencies = TRUE, quiet = TRUE)
options(repos = c(CRAN = "https://cloud.r-project.org"))
# Fuerza actualización de rlang primero
install.packages("rlang", dependencies = TRUE)
# Verifica versión (debe ser >= 1.1.0)
packageVersion("rlang")
## [1] '1.1.6'
# Ahora instala/actualiza los demás
install.packages(c("scales", "tidyverse", "lubridate", "readr", "glue"), dependencies = TRUE)
# Opcional: actualiza todo lo desactualizado sin preguntar
# update.packages(ask = FALSE)
library(tidyverse)
library(lubridate)
library(scales)
library(readr)
library(glue)
# Archivos esperados en el directorio de trabajo del proyecto
fn_param <- "parametros_modelo.csv"
fn_cat <- "categorias_canasta.csv"
fn_esc <- "escenarios_modelo.csv"
# Si no están, crearlos con valores por defecto
if(!file.exists(fn_param)){
write_lines("variable,valor
canasta_basica_inicial_usd,813.82
canasta_vital_inicial_usd,798.31
diesel_precio_anterior,1.80
diesel_precio_nuevo,2.80
inflacion_base_anual_no_diesel,0.03
mes_inicio,2026-01-01
mes_fin,2026-12-01", fn_param)
}
if(!file.exists(fn_cat)){
write_lines("categoria,peso_canasta,intensidad_transporte
Alimentos y bebidas no alcohólicas,0.26,0.60
Transporte,0.13,0.90
Vivienda, agua, electricidad y gas,0.22,0.40
Restaurantes y hoteles,0.09,0.50
Muebles y artículos para el hogar,0.06,0.45
Recreación y cultura,0.05,0.35
Salud,0.04,0.30
Educación,0.05,0.20
Comunicaciones,0.03,0.25
Prendas de vestir y calzado,0.04,0.35
Misceláneos,0.03,0.30", fn_cat)
}
if(!file.exists(fn_esc)){
write_lines("escenario,peso_transporte_basket,pass_through,segunda_ronda,half_life_meses
Bajo,0.20,0.40,0.10,5
Base,0.25,0.60,0.20,3
Alto,0.30,0.80,0.30,2", fn_esc)
}
# Carga
parametros <- read_csv(fn_param, show_col_types = FALSE)
categorias <- read_csv(fn_cat, show_col_types = FALSE)
escenarios <- read_csv(fn_esc, show_col_types = FALSE)
parametros_tbl <- tidyr::pivot_wider(parametros, names_from = variable, values_from = valor)
parametros_tbl
Notas para Posit Cloud - Puedes editar los CSV
directamente en el panel Files → clic en el nombre del
archivo.
- Para subir versiones nuevas, usa Upload y
sobreescribe.
- Al hacer Knit, se cachean piezas pesadas para
acelerar re-ejecuciones.
diesel_old <- as.numeric(parametros_tbl$diesel_precio_anterior)
diesel_new <- as.numeric(parametros_tbl$diesel_precio_nuevo)
shock_diesel <- diesel_new / diesel_old - 1
inicio <- as_date(parametros_tbl$mes_inicio)
fin <- as_date(parametros_tbl$mes_fin)
meses <- seq.Date(from = inicio, to = fin, by = "month")
pi_base_anual <- as.numeric(parametros_tbl$inflacion_base_anual_no_diesel)
pi_base_mensual <- (1 + pi_base_anual)^(1/12) - 1
BASE_CB <- as.numeric(parametros_tbl$canasta_basica_inicial_usd)
BASE_CV <- as.numeric(parametros_tbl$canasta_vital_inicial_usd)
glue("Shock diésel: {percent(shock_diesel, accuracy = 0.01)} | Inflación base mensual: {percent(pi_base_mensual, 0.01)}")
## Shock diésel: 55.56% | Inflación base mensual: 0.25%
geom_weights <- function(n, half_life){
r <- 0.5^(1/half_life)
w <- r^(0:(n-1))
w / sum(w)
}
build_escenario <- function(esc){
n <- length(meses)
pass <- esc$pass_through
sr <- esc$segunda_ronda
hl <- esc$half_life_meses
# Impacto por rubro (desagregado)
deltaP_rubro <- categorias %>%
mutate(impacto_rubro = shock_diesel * pass * (1 + sr) * intensidad_transporte)
deltaP_total <- sum(deltaP_rubro$peso_canasta * deltaP_rubro$impacto_rubro)
# Distribución temporal
w <- geom_weights(n, hl)
infl_diesel_m <- deltaP_total * w
# Inflación total mensual con base
infl_total_m <- (1 + infl_diesel_m) * (1 + pi_base_mensual) - 1
acum_factor <- cumprod(1 + infl_total_m)
tibble(
escenario = esc$escenario,
mes = meses,
inflacion_diesel_m = infl_diesel_m,
inflacion_base_m = pi_base_mensual,
inflacion_total_m = infl_total_m,
inflacion_acum = acum_factor - 1,
canasta_basica = BASE_CB * acum_factor,
canasta_vital = BASE_CV * acum_factor
)
}
proy <- purrr::map_dfr(1:nrow(escenarios), ~build_escenario(escenarios[.x, ]))
head(proy)
kpi_dic <- proy %>%
dplyr::filter(lubridate::month(mes) == 12) %>%
transmute(
escenario,
canasta_basica_dic = round(canasta_basica, 2),
canasta_vital_dic = round(canasta_vital, 2),
inflacion_acum_pp = round(inflacion_acum * 100, 2)
)
kpi_dic
proy_long <- proy %>% mutate(mes_label = format(mes, "%b-%Y"))
ggplot(proy_long, aes(mes, inflacion_acum * 100, color = escenario)) +
geom_line(size = 1) +
labs(title = "Inflación acumulada (base + diésel) — Ecuador 2026",
x = "Mes", y = "Porcentaje (%)") +
scale_x_date(date_breaks = "2 months", date_labels = "%b-%y") +
theme_minimal()
ggplot(proy_long, aes(mes, canasta_basica, color = escenario)) +
geom_line(size = 1) +
labs(title = "Canasta Básica 2026 — Valor proyectado",
x = "Mes", y = "USD") +
scale_x_date(date_breaks = "2 months", date_labels = "%b-%y") +
theme_minimal()
ggplot(proy_long, aes(mes, canasta_vital, color = escenario)) +
geom_line(size = 1) +
labs(title = "Canasta Vital 2026 — Valor proyectado",
x = "Mes", y = "USD") +
scale_x_date(date_breaks = "2 months", date_labels = "%b-%y") +
theme_minimal()
# Se guarda un CSV con todas las trayectorias en el directorio del proyecto
readr::write_csv(proy, "proyecciones_2026_por_escenario.csv")
glue("Archivo exportado: {getwd()}/proyecciones_2026_por_escenario.csv")
## Archivo exportado: /cloud/project/proyecciones_2026_por_escenario.csv
half_life_meses.inflacion_base_anual_no_diesel para
escenarios macro alternativos.