| Institución | Tecnológico de Monterrey, Campus Monterrey |
| Programa | Licenciatura en Inteligencia de Negocios |
| Materia | Generación de escenarios futuros con analítica (CD-3001B). Módulo 1 |
| Integrantes | Patricio Hermosillo Sepúlveda (A01567036) Lucero Salazar (A00834893) |
| Profesor | Raúl Alejandro Cantú |
Las tres partes de esta actividad comparten una misma pregunta: cuánta innovación o cuánto crecimiento compra de verdad la inversión, y hasta dónde se puede estirar un modelo antes de que deje de servir. Las tres se resuelven con datos de panel, que es el tema del Módulo 1.
Parte 1: Patentes. Modelamos las patentes solicitadas de 226 empresas entre 2012 y 2021 con una regresión de Poisson con efectos fijos de empresa y año, usando el stock de I+D rezagado un año. La elasticidad es de 0.487: subir 10 % la inversión acumulada se asocia con +4.8 % más patentes. El retorno es positivo, pero cada peso adicional rinde menos que el anterior. Las ventas dejan de explicar nada en cuanto controlamos por inversión.
Parte 2: Cuidado de la piel. Antes de modelar tuvimos que limpiar la taxonomía del reporte de Euromonitor, donde Men’s Grooming duplica conteo, y pasar todo a pesos constantes de 2025. Con eso estimamos la tendencia real de siete subcategorías. Recomendamos invertir en Skin Care: es el mercado más grande, el de tendencia más confiable y el único que no retrocedió en 2020. No es el que más crece, y por eso dedicamos una sección a explicar por qué lo preferimos sobre Fragrances, que es su rival de verdad.
Parte 3: Banco Mundial. Con 69 países entre 1996 y 2021, bajados de la API del Banco Mundial, la prueba de Hausman rechaza los efectos aleatorios y nos deja con un modelo de efectos fijos de país. Su elasticidad (0.54) cae en el mismo orden de magnitud que la de empresas, lo cual da confianza en las dos. Al agrupar por décadas aparece lo más interesante: el rendimiento de la inversión en investigación se ha deteriorado, y México recortó su gasto en I+D casi a la mitad desde 2010.
Una advertencia que atraviesa todo el trabajo. En las Partes 1 y 3 pusimos cada modelo a predecir años que no había visto, y lo comparamos contra un pronóstico ingenuo del tipo “el próximo año será igual al anterior”. El ingenuo ganó las dos veces. Lo reportamos tal cual: estos modelos sirven para entender y para simular escenarios de decisión, no para adivinar el siguiente dato.
La actividad pide tres cosas, una por base de datos: armar el mejor modelo, generar predicciones y sustentar las conclusiones en el modelo y no en la corazonada. Las juntamos en un solo informe porque comparten el método (datos de panel) y la pregunta de fondo (qué tanto rinde la inversión). Así podemos contrastar lo que sale a nivel de empresas con lo que sale a nivel de países.
Las tres bases tienen la misma forma: una unidad observada varias veces en el tiempo (empresa-año, categoría-año, país-año). Eso obliga a separar dos tipos de variación, la que hay entre unidades y la que hay dentro de cada una a lo largo del tiempo. Por ahí se entiende por qué las tres partes terminan en modelos de efectos fijos: sin ellos, las diferencias permanentes entre unidades se confunden con el efecto que queremos medir.
Algo que vale la pena dejar claro desde el principio: el
identificador de la unidad (cusip en la Parte 1,
iso3 en la Parte 3) no es una variable explicativa. Es la
etiqueta que define al individuo del panel, y entra al modelo como
efecto fijo, nunca como regresor.
## [1] 2260 13
La variable que hay que modelar es el número de patentes solicitadas
(patents), no las otorgadas (patentsg). La
solicitud refleja lo que la empresa decidió hacer. El otorgamiento
depende de la oficina de patentes y de cuánto se tarde, que es un
proceso ajeno a la inversión que queremos medir.
Figura 1. Comparación de patentes solicitadas y otorgadas por año. La caída aislada de las solicitudes en 2021 es un artefacto del registro, no un cambio de comportamiento.
Las solicitudes caen a 1,117 en 2021 cuando venían arriba de 5,000, y las otorgadas ni se inmutan. Si la caída fuera real, las otorgadas también bajarían uno o dos años después. No pasa. Descartamos 2021; en la sección 2.6 verificamos que 2020 tampoco distorsiona el resultado.
d0 <- pat[pat$year <= 2020, ]
c(ceros = mean(d0$patents == 0),
media = mean(d0$patents),
varianza = var(d0$patents),
razon_var_media = var(d0$patents) / mean(d0$patents))## ceros media varianza razon_var_media
## 0.2030482 24.8987217 5343.3994770 214.6053735
Figura 2. Distribución de las patentes solicitadas por empresa-año: valores enteros, no negativos y fuertemente sesgados, con una acumulación en cero.
El 20 % de las observaciones son cero y la distribución está muy sesgada a la derecha. Un modelo lineal aquí está mal de origen: supone un error continuo y de varianza constante, y admite predicciones negativas, que para un conteo no significan nada. Lo que corresponde es Poisson, que modela el conteo directo y nunca predice por debajo de cero.
Una empresa no patenta el mismo año en que invierte. Montar la capacidad de investigación y llegar a una solicitud toma años, así que la inversión tiene que entrar rezagada. Construimos los rezagos dentro de cada empresa, sin mezclar observaciones de empresas distintas.
pat <- pat[order(pat$cusip, pat$year), ]
rezagar <- function(x, grupo, k) {
ave(x, grupo, FUN = function(v) c(rep(NA, k), head(v, -k)))
}
pat$stk_l1 <- rezagar(pat$rndstck, pat$cusip, 1) # stock del año anterior
pat$stk_l2 <- rezagar(pat$rndstck, pat$cusip, 2) # stock de hace dos añosCada año de rezago cuesta unas 210 observaciones, una por empresa. Es un intercambio que preferimos dejar a la vista: sacrificamos muestra a cambio de una relación causal más defendible.
La comparación tiene que hacerse sobre la misma muestra, o sea sobre las observaciones donde existen las tres especificaciones. Comparar el AIC entre muestras de distinto tamaño no sirve, porque el criterio depende de cuántas observaciones haya.
ok <- complete.cases(b[, c("patents", "rndstck", "stk_l1", "stk_l2", "sales")]) &
b$rndstck > 0 & b$stk_l1 > 0 & b$stk_l2 > 0 & b$sales > 0
comun <- b[ok, ]
comun$lsales <- log(comun$sales)
comparar <- function(v) {
comun$lX <- log(comun[[v]])
m <- glm(patents ~ lX + lsales + merger + factor(cusip) + factor(year),
family = poisson, data = comun)
cl <- coeftest(m, vcov = vcovCL, cluster = ~cusip)
c(elasticidad = coef(m)["lX"], ee = cl["lX", "Std. Error"], AIC = AIC(m))
}
tab_rez <- t(sapply(c("rndstck", "stk_l1", "stk_l2"), comparar))Rezagar la inversión no mueve la elasticidad. La razón es económica, no estadística:
rndstckes un stock acumulado, y los stocks se mueven muy despacio de un año al siguiente. El rezago sí importa conceptualmente, porque evita que la inversión del mismo año explique patentes que ya venían en camino. Pero aquí no cambia la conclusión, y preferimos decirlo antes que atribuirle un efecto que no tiene.
Nos quedamos con el stock rezagado un año porque ya está fija de antemano: su valor no cambia cuando la empresa decide cuántas patentes solicitar. Ese es el argumento para tratarla como causa y no como consecuencia.
d <- pat[pat$year <= 2020, ]
d$X <- d$stk_l1
d <- d[complete.cases(d[, c("patents", "X", "sales")]) & d$X > 0 & d$sales > 0, ]
d$lX <- log(d$X)
d$lsales <- log(d$sales)
d$t <- d$year - min(d$year)
c(observaciones = nrow(d), empresas = length(unique(d$cusip)),
primer_anio = min(d$year), ultimo_anio = max(d$year))## observaciones empresas primer_anio ultimo_anio
## 1680 216 2013 2020
Trabajamos en logaritmos para leer los coeficientes como elasticidades. De paso, eso resuelve la diferencia de escala entre variables chicas (patentes) y grandes (ventas).
Dos empresas del mismo tamaño y con la misma inversión pueden patentar cantidades muy distintas por cosas que no observamos: la capacidad científica del equipo, dónde están, en qué industria compiten, cómo protegen su propiedad intelectual. Todo eso, si es propio de la empresa y no cambia con los años, lo absorben los efectos fijos de empresa. Los de año recogen lo que les pasa a todas por igual: el ciclo económico, un cambio de criterio en la oficina de patentes.
# 1) Especificación incorrecta: OLS sobre el logaritmo del conteo
m_ols <- lm(log(patents + 1) ~ lX + lsales + merger + factor(year), data = d)
# 2) Poisson agrupado, sin efectos fijos de empresa
m_pool <- glm(patents ~ lX + lsales + merger + factor(year),
family = poisson, data = d)
# 3) Poisson con efectos fijos de empresa y de año <-- modelo seleccionado
m_fe <- glm(patents ~ lX + lsales + merger + factor(cusip) + factor(year),
family = poisson, data = d)Sin efectos fijos el modelo mezcla dos cosas: las empresas grandes acumulan más I+D y más patentes al mismo tiempo, y eso infla la elasticidad. Con el efecto fijo de empresa la estimación se apoya solo en cómo cambia cada empresa a lo largo del tiempo, y la elasticidad baja a 0.487. Ese número es mucho más creíble como efecto causal, y el AIC confirma que el modelo ajusta mejor.
cc <- d[complete.cases(d[, c("employ", "return", "lsales")]), ]
c(cor_empleados_ventas = cor(log(cc$employ), cc$lsales),
cor_rendimiento_ventas = cor(cc$return, cc$lsales))## cor_empleados_ventas cor_rendimiento_ventas
## 0.96575094 0.08212959
employ tiene una correlación de 0.97 con las ventas: las
dos miden el tamaño de la empresa, y meterlas juntas solo introduce
multicolinealidad. return es el rendimiento de la acción,
que responde a expectativas del mercado y no es un insumo del proceso de
innovación. Ninguna de las dos entra al modelo.
dispersion <- sum(residuals(m_fe, "pearson")^2) / m_fe$df.residual
round(dispersion, 2) # un valor > 1 indica sobredispersión## [1] 2.15
Poisson supone que la varianza es igual a la media. Los efectos fijos de empresa ya bajaron esa razón de 215 a 2.2, pero el residual sigue arriba de 1, así que los errores estándar de Poisson saldrían demasiado chicos. Reportamos errores agrupados por empresa. Una precisión sobre su alcance: no cambian el coeficiente, solo su error estándar. Sirven para no declarar significativo algo que no lo es.
Solo el stock de I+D sale significativo. Las ventas no: controlando por inversión acumulada, el tamaño de la empresa por sí solo no agrega patentes. La fusión tampoco. En términos de negocio el mensaje es simple: lo que produce patentes es invertir en innovación de forma sostenida, no ser grande.
El modelo de conteo con panel que resuelve formalmente la sobredispersión es la binomial negativa de efectos fijos (Hausman, Hall y Griliches, 1984). Aquí no hizo falta: los efectos fijos absorbieron casi toda la dispersión y los errores agrupados corrigen lo que queda. La cito porque es la referencia del caso, no porque el resultado dependa de ella.
Conservamos 2020 argumentando que el efecto fijo de año absorbe el golpe de la pandemia. Ese tipo de argumento hay que verificarlo, no darlo por bueno.
m_sin20 <- glm(patents ~ lX + lsales + merger + factor(cusip) + factor(year),
family = poisson, data = d[d$year <= 2019, ])
c(con_2020 = coef(m_fe)["lX"], sin_2020 = coef(m_sin20)["lX"])## con_2020.lX sin_2020.lX
## 0.4870750 0.4365471
La elasticidad pasa de 0.487 a 0.437: se mueve poco y la conclusión aguanta. Nos quedamos con 2020 por las 216 observaciones que aporta.
Un ajuste alto dentro de la muestra no prueba nada cuando el modelo tiene un parámetro por empresa: en ese caso simplemente memoriza el nivel de cada una. La prueba de verdad es predecir años que el modelo no vio. Entrenamos con 2013-2018, predecimos 2019-2020 y lo comparamos contra el pronóstico ingenuo: “esta empresa va a solicitar las mismas patentes que el año pasado”.
tr <- d[d$year <= 2018, ]
te <- d[d$year >= 2019, ]
te <- te[te$cusip %in% unique(tr$cusip), ]
tr$empresa <- factor(tr$cusip)
te$empresa <- factor(te$cusip, levels = levels(tr$empresa))
# se usa una tendencia lineal en lugar de indicadores de año, para que el
# modelo pueda extrapolar a años que no aparecen en el entrenamiento
m_train <- glm(patents ~ lX + lsales + merger + t + empresa,
family = poisson, data = tr)
te$pred <- predict(m_train, newdata = te, type = "response")
# pronóstico ingenuo: las patentes del año anterior de la misma empresa
llave <- paste(d$cusip, d$year)
te$ingenuo <- d$patents[match(paste(te$cusip, te$year - 1), llave)]
te <- te[!is.na(te$ingenuo) & !is.na(te$pred), ]Figura 3. Predicción fuera de muestra frente a los valores observados (2019-2020, escala logarítmica). La línea diagonal representa la predicción perfecta.
Gana el ingenuo. El modelo da un MAE de 7.05 contra 6.29 del método simple. Este modelo sirve para explicar, no para pronosticar. Y tiene sentido: las patentes de una empresa son muy persistentes, así que “lo mismo que el año pasado” es una vara difícil de superar.
Como el coeficiente es una elasticidad, se traduce directo en una regla de decisión.
b_elas <- coef(m_fe)["lX"]
escenarios <- c(0.10, 0.25, 0.50)
round(100 * ((1 + escenarios)^b_elas - 1), 1) # cambio porcentual esperado## [1] 4.8 11.5 21.8
Afirmación. Invertir en I+D genera más patentes solicitadas, con rendimientos decrecientes: cada 10 % adicional de stock se asocia con cerca de +4.8 % de patentes. Pero el modelo no sirve para pronosticar cuántas patentes pedirá una empresa el año que viene.
Razonamiento. Las patentes son un conteo, responden con rezago a la inversión y varían muchísimo entre empresas. Eso pide un Poisson con efectos fijos de empresa y año, con la inversión rezagada y en logaritmos. Ese modelo aísla bien el efecto de la inversión, pero el fenómeno es tan persistente que no le gana a un pronóstico ingenuo.
Evidencia.
ms_todo <- read.csv("datos/market_sizes.csv")
names(ms_todo)[3] <- "nominal"
sort(unique(ms_todo$categoria))## [1] "Bath and Shower"
## [2] "Beauty and Personal Care"
## [3] "Deodorants"
## [4] "Depilatories"
## [5] "Dermocosmetics Beauty and Personal Care"
## [6] "Fragrances"
## [7] "Hair Care"
## [8] "Mass Beauty and Personal Care"
## [9] "Men's Grooming"
## [10] "Premium Beauty and Personal Care"
## [11] "Prestige Beauty and Personal Care"
## [12] "Skin Care"
## [13] "Sun Care"
El reporte mete tres criterios de clasificación distintos en una sola columna. Sumar las filas sin fijarse en cuál es cuál infla el tamaño del mercado.
Decir que Men’s Grooming es transversal no basta: hay que demostrarlo con los números. El reporte no trae todas las categorías de producto de Beauty and Personal Care; faltan al menos Oral Care, Color Cosmetics y Baby and Child. Entonces:
\[\text{Total} - \sum(\text{7 categorías de producto}) = \text{residual}\]
Ese residual tiene que alcanzar para las tres categorías que faltan. La prueba es ver qué le pasa si además sumamos Men’s Grooming como si fuera un componente aparte.
productos <- c("Bath and Shower", "Deodorants", "Depilatories", "Fragrances",
"Hair Care", "Skin Care", "Sun Care")
valor <- function(cat, anio) {
ms_todo$nominal[ms_todo$categoria == cat & ms_todo$anio == anio]
}
prueba <- do.call(rbind, lapply(c(2021, 2025), function(a) {
total <- valor("Beauty and Personal Care", a)
suma7 <- sum(sapply(productos, valor, anio = a))
mg <- valor("Men's Grooming", a)
data.frame(anio = a, total = total, suma7 = suma7,
residual_sin_mg = total - suma7,
mens_grooming = mg,
residual_con_mg = total - suma7 - mg)
}))En 2021 el residual sin Men’s Grooming es de 58,168 millones, cifra razonable para cubrir Oral Care, Color Cosmetics y Baby and Child. Si sumamos Men’s Grooming, ese residual se desploma a 25,229 millones, una caída de 57 %, y queda por debajo del propio Men’s Grooming (32,939). O sea: tres categorías completas, con Oral Care adentro, tendrían que valer menos que Men’s Grooming sola. No cuadra.
Men’s Grooming no es un componente más, sino una agrupación transversal de productos masculinos que ya vienen contados en Bath and Shower, Deodorants, Depilatories, Fragrances y Skin Care. La dejamos fuera del análisis, igual que el total y los cortes de posicionamiento.
Comparar categorías por crecimiento nominal mezcla la subida de precios con el crecimiento real del mercado. México tuvo una inflación cercana al 4.5 % anual en el periodo, así que un mercado que “crece” 5 % nominal casi no se mueve en términos reales. Deflactamos todo a pesos constantes de 2025 con el Índice de Precios al Consumidor.
# IPC de México, promedio anual, base 2010 = 100
# Fuente: Banco Mundial, indicador FP.CPI.TOTL
ipc <- c(`2011` = 103.407, `2012` = 107.659, `2013` = 111.757, `2014` = 116.248,
`2015` = 119.411, `2016` = 122.780, `2017` = 130.198, `2018` = 136.577,
`2019` = 141.543, `2020` = 146.350, `2021` = 154.677, `2022` = 166.890,
`2023` = 176.116, `2024` = 184.433, `2025` = 191.453)
ms$real <- ms$nominal * (ipc["2025"] / ipc[as.character(ms$anio)])Antes de estimar una sola tendencia hay que ver si tiene sentido. En la figura anterior varias categorías se empinan a partir de 2021, así que partimos el periodo en dos tramos.
per <- do.call(rbind, lapply(productos, function(k) {
s <- ms[ms$categoria == k, ]
data.frame(categoria = k,
antes = 100 * cagr(s$real, s$anio, 2011, 2019), # pre-pandemia
despues = 100 * cagr(s$real, s$anio, 2021, 2025), # post-pandemia
vs_2019 = 100 * (s$real[s$anio == 2025] / s$real[s$anio == 2019] - 1))
}))
per$aceleracion <- per$despues - per$antes
per <- per[order(-per$despues), ]La última columna es la que separa rebote de crecimiento. Si una categoría solo estuviera recuperando lo que perdió en 2020, su nivel de 2025 se parecería al de 2019. No es lo que pasa: Fragrances está 47 % arriba de su nivel previo a la pandemia y Skin Care 31 %. Eso es crecimiento de verdad.
ms$t <- ms$anio - 2011
ms$covid <- as.integer(ms$anio == 2020)
ms$lreal <- log(ms$real)
pd <- pdata.frame(ms, index = c("categoria", "anio"))
m_panel <- plm(lreal ~ t + covid, data = pd, model = "within")
coefs <- coef(m_panel)El modelo de panel con efectos fijos de categoría da el contexto agregado del sector: en promedio el mercado crece 2.4 % real anual y cayó -9.6 % en 2020. Sirve para enmarcar, no para decidir. Para elegir dónde invertir necesitamos distinguir entre categorías, y eso pide estimar cada tendencia por separado.
trend <- do.call(rbind, lapply(productos, function(k) {
s <- ms[ms$categoria == k, ]
m <- lm(lreal ~ t + covid, data = s)
ct <- summary(m)$coefficients
data.frame(categoria = k,
crec_real = 100 * (exp(ct["t", "Estimate"]) - 1),
p_valor = ct["t", "Pr(>|t|)"],
r2 = summary(m)$r.squared,
cambio_2020 = 100 * (s$real[s$anio == 2020] / s$real[s$anio == 2019] - 1),
escala = s$real[s$anio == 2025])
}))
trend <- trend[order(-trend$crec_real), ]Significancia: * p < 0.01, p < 0.05, * p < 0.10.
La proyección parte del último dato observado (2025) y le aplica la tasa real estimada. Reportamos dos escenarios, uno con la tendencia de quince años y otro con la reciente, para que se vea cuánto depende el resultado de ese supuesto.
pred <- do.call(rbind, lapply(productos, function(k) {
base <- ms$real[ms$categoria == k & ms$anio == 2025]
g_largo <- trend$crec_real[trend$categoria == k] / 100
g_reciente <- per$despues[per$categoria == k] / 100
data.frame(categoria = k, real_2025 = base,
pred_largo = base * (1 + g_largo)^3,
pred_reciente = base * (1 + g_reciente)^3)
}))
pred <- pred[order(-pred$pred_reciente), ]Figura 5. Mapa de decisión: crecimiento real (eje horizontal), comportamiento durante 2020 (eje vertical) y escala del mercado (área del círculo).
Sun Care es fácil de descartar. Crece 4.6 % real, sí, pero es el mercado más chico (4,326 millones, diecisiete veces menor que Skin Care) y el que más se cayó en 2020 (-19 %). Es un producto de temporada y de los que se pueden posponer.
Fragrances sí es un rival serio, y hay que decirlo. Crece 9.6 % real anual en el periodo reciente, más del doble que Skin Care; está 47 % arriba de su nivel previo a la pandemia; y tiene escala parecida (56,742 millones). No lo elegimos por dos razones concretas:
Afirmación. Si tuviéramos que invertir en una subcategoría, elegimos Skin Care, aunque no sea la que más crece.
Razonamiento. Es la que mejor junta las cuatro condiciones que hacen sostenible una inversión: escala, crecimiento real que además se está acelerando, la tendencia más confiable de las siete y el mejor comportamiento en la única crisis que observamos. Se compra por hábito y se repone, no es un gasto que la gente posponga. Y siguiendo lo que advirtió el socioformador (Nielsen), el crecimiento alto atrae competencia: no conviene sobrepagar por velocidad, y Skin Care crece lo suficiente sin ser la categoría de moda.
Evidencia.
Sobre la evidencia de 2020. Que Skin Care no cayera en 2020 es un solo episodio, y además raro: confinamiento, más higiene y cuidado personal en casa, menos consumo social. No prueba que aguante cualquier recesión. Es la única evidencia de comportamiento en crisis que tenemos, y como tal la usamos.
Supuesto de valor contra volumen. Los datos son valor de venta, no unidades. Si el crecimiento real de Skin Care viniera sobre todo de precios más altos y productos más caros y no de vender más, la tesis cambiaría: estaríamos invirtiendo en un mercado que sube de precio, no que gana consumidores. Con esta base no podemos distinguir los dos casos, así que la recomendación vale bajo el supuesto de que el crecimiento en valor refleja crecimiento en volumen.
Alternativas según el perfil de riesgo. Quien tolere volatilidad y apueste a que la aceleración siga, tiene en Fragrances el doble de crecimiento reciente con escala parecida. Quien busque defenderse de otra crisis, Bath and Shower fue la única subcategoría que creció en 2020 (+9 %).
En la Parte 1 estimamos, con datos de empresas, cuántas patentes compra la inversión en I+D. Aquí hacemos la misma pregunta a nivel de país con datos del Banco Mundial, donde tenemos veintiséis años de historia en vez de diez, y ubicamos a México en ese panorama.
Los datos salen de la API del Banco Mundial (World Development Indicators). La función guarda una copia local la primera vez que corre y después la reutiliza, así que el documento se puede volver a compilar sin conexión.
dir.create("datos", showWarnings = FALSE) # por si la carpeta aún no existe
descargar_wb <- function(codigo) {
archivo <- file.path("datos", paste0("wb_", gsub("\\.", "_", codigo), ".csv"))
if (file.exists(archivo)) return(read.csv(archivo)) # copia local
url <- paste0("https://api.worldbank.org/v2/country/all/indicator/",
codigo, "?format=json&per_page=20000")
json <- jsonlite::fromJSON(url)[[2]]
d <- data.frame(iso3 = json$countryiso3code, pais = json$country$value,
anio = as.integer(json$date), valor = as.numeric(json$value))
write.csv(d, archivo, row.names = FALSE, na = "")
d
}
# catálogo de países: permite separar países de agregados regionales
descargar_paises <- function() {
archivo <- "datos/wb_paises.csv"
if (file.exists(archivo)) return(read.csv(archivo))
meta <- jsonlite::fromJSON(
"https://api.worldbank.org/v2/country?format=json&per_page=400")[[2]]
d <- data.frame(iso3 = meta$id, pais = meta$name, region = meta$region$value)
write.csv(d, archivo, row.names = FALSE, na = "")
d
}
indicadores <- c(patentes = "IP.PAT.RESD",
id_pib = "GB.XPD.RSDV.GD.ZS",
pib_pc = "NY.GDP.PCAP.KD",
poblacion = "SP.POP.TOTL")
series <- list()
for (nombre in names(indicadores)) {
d <- descargar_wb(indicadores[nombre])
names(d)[names(d) == "valor"] <- nombre
series[[nombre]] <- d[, c("iso3", "pais", "anio", nombre)]
}
wb <- Reduce(function(a, b) merge(a, b, by = c("iso3", "pais", "anio"), all = TRUE),
series)# La consulta "country/all" devuelve también agregados regionales y grupos de
# ingreso. Deben excluirse: son los mismos países contabilizados otra vez.
paises <- descargar_paises()
paises <- paises[paises$region != "Aggregates", ]
wb <- wb[wb$iso3 %in% paises$iso3, ]
# 1996 es el primer año con datos de I+D; 2021 el último con patentes completas
p <- wb[wb$anio >= 1996 & wb$anio <= 2021, ]
p <- p[complete.cases(p[, c("patentes", "id_pib", "pib_pc", "poblacion")]), ]
# se exigen al menos 15 años por país: con menos, el efecto fijo se estimaría
# con muy poca información
obs <- table(p$iso3)
p <- p[p$iso3 %in% names(obs)[obs >= 15], ]
p$lpat <- log(p$patentes + 1)
p$lid <- log(p$id_pib)
p$lpib <- log(p$pib_pc)
p$lpob <- log(p$poblacion)
p$decada <- paste0(floor(p$anio / 10) * 10, "s")
p$pat_pm <- p$patentes / (p$poblacion / 1e6)
c(observaciones = nrow(p), paises = length(unique(p$iso3)),
primer_anio = min(p$anio), ultimo_anio = max(p$anio))## observaciones paises primer_anio ultimo_anio
## 1566 69 1996 2021
Quitar los agregados no es opcional. Si se quedan, cada país entra varias veces: una solo y otra dentro de “América Latina” o “Ingreso medio alto”. Es el mismo doble conteo de la Parte 2, con otra cara.
Los países se diferencian en cosas que no observamos y que cambian muy despacio: el sistema legal de patentes, la tradición científica, la estructura industrial. La pregunta típica de datos de panel es si esas diferencias se tratan como efectos fijos, correlacionados con las variables explicativas, o como efectos aleatorios, independientes de ellas. Estimamos los tres modelos y dejamos que la prueba decida.
pd3 <- pdata.frame(p, index = c("iso3", "anio"))
m_pool3 <- plm(lpat ~ lid + lpib + lpob, data = pd3, model = "pooling") # agrupado
m_fe3 <- plm(lpat ~ lid + lpib + lpob, data = pd3, model = "within") # efectos fijos
m_re3 <- plm(lpat ~ lid + lpib + lpob, data = pd3, model = "random") # aleatorios
hausman <- phtest(m_fe3, m_re3)data.frame(estadistico = round(unname(hausman$statistic), 2),
grados_libertad = unname(hausman$parameter),
p_valor = format.pval(hausman$p.value, eps = 0.0001))| estadistico | grados_libertad | p_valor |
|---|---|---|
| 55.99 | 3 | < 0.0001 |
La prueba de Hausman da un valor p de <0.0001, así que se rechazan los efectos aleatorios y nos quedamos con efectos fijos. Tiene sentido económico: cuánto patenta un país está correlacionado con cuánto invierte en I+D, que es justo lo que el modelo de efectos aleatorios supone que no pasa.
La elasticidad de la I+D es 0.544: dentro de un mismo país, subir 10 % el gasto en investigación como proporción del PIB se asocia con 5.3 % más solicitudes de patente. Cae en el mismo orden de magnitud que la estimación con empresas de la Parte 1 (0.49), y eso refuerza las dos: datos, unidades y periodos distintos apuntando al mismo fenómeno de rendimientos decrecientes.
El R² within es de 0.205: el modelo explica una parte de lo que pasa dentro de cada país, no todo. Era de esperarse, porque patentar depende de muchas cosas que el modelo no ve.
En clase se pidió mirar la base por décadas y no año con año, para captar cambios de fondo. Esa agrupación cambia por completo lo que se ve.
por_decada <- aggregate(cbind(pat_pm, id_pib) ~ decada, data = p, FUN = median)
elasticidad_decada <- function(dc) {
s <- p[p$decada == dc, ]
n <- table(s$iso3)
s <- s[s$iso3 %in% names(n)[n >= 3], ] # se requiere variación interna
m <- plm(lpat ~ lid + lpib + lpob,
data = pdata.frame(s, index = c("iso3", "anio")), model = "within")
summary(m)$coefficients["lid", c("Estimate", "Pr(>|t|)")]
}
# los 2020s solo cubren dos años: no constituyen una década
decadas <- c("1990s", "2000s", "2010s")
elas <- t(sapply(decadas, elasticidad_decada))| Década | Elasticidad | Valor p |
|---|---|---|
| 1990s (1996-1999) | 0.531 | <0.0001 |
| 2000s | 0.519 | <0.0001 |
| 2010s | 0.229 | <0.0001 |
Figura 6. Divergencia entre esfuerzo y resultado: el gasto en investigación aumenta mientras el patentamiento por habitante disminuye.
Cada peso invertido en investigación compra menos patentes que antes. La mediana mundial pasa de 62.4 patentes por millón de habitantes en los noventa a 36.9 en los veinte, mientras el gasto en I+D sube de 0.7 % a 1.1 % del PIB. La elasticidad estimada cae de 0.53 a 0.23.
Este patrón solo aparece al agrupar por décadas. En la variación año con año queda enterrado en el ruido, y ahí está la razón de la instrucción. Dejamos los 2020 fuera del cálculo de elasticidad porque cubren nada más 2020 y 2021.
Igual que en la Parte 1, la prueba que importa es predecir años no observados. Entrenamos con 1996-2017 y predecimos 2018-2021, otra vez contra el pronóstico ingenuo.
tr3 <- p[p$anio <= 2017, ]
te3 <- p[p$anio >= 2018, ]
te3 <- te3[te3$iso3 %in% unique(tr3$iso3), ]
m_train3 <- lm(lpat ~ lid + lpib + lpob + factor(iso3), data = tr3)
te3$pred <- exp(predict(m_train3, newdata = te3)) - 1
llave3 <- paste(p$iso3, p$anio)
te3$ingenuo <- p$patentes[match(paste(te3$iso3, te3$anio - 1), llave3)]
te3 <- te3[!is.na(te3$ingenuo), ]El ingenuo vuelve a ganar, y por mucho. Es el mismo resultado de la Parte 1 y deja la misma lección: cuánto patenta un país es tan persistente que superar la referencia del año anterior es dificilísimo. Un modelo como este sirve para entender el fenómeno y simular escenarios, no para adivinar el siguiente dato. Decirlo es parte del análisis; venderlo como si predijera bien sería engañoso.
b3 <- coef(m_fe3)["lid"]
mx <- p[p$iso3 == "MEX" & p$anio == 2021, ]
metas <- c(0.40, 0.55, 1.00) # % del PIB
escenario <- data.frame(
meta = metas,
multiplo = metas / mx$id_pib,
patentes = mx$patentes * (metas / mx$id_pib)^b3)
escenario$cambio <- 100 * (escenario$patentes / mx$patentes - 1)Llegar al 1 % del PIB, meta declarada en México desde hace años, significaría multiplicar por 3.7 el gasto actual, y duplicaría las solicitudes de patente hasta unas 2,263. Sigue siendo poco frente a los líderes. El escenario dice que invertir ayuda, pero que por sí solo no cierra una brecha de dos órdenes de magnitud.
mex <- p[p$iso3 == "MEX", ]
round(c(id_pib_2010 = mex$id_pib[mex$anio == 2010],
id_pib_2021 = mex$id_pib[mex$anio == 2021],
patentes_por_millon_2021 = mex$pat_pm[mex$anio == 2021]), 2)## id_pib_2010 id_pib_2021 patentes_por_millon_2021
## 0.47 0.27 8.75
Figura 7. Evolución del gasto en investigación y desarrollo de México. Tras alcanzar su máximo en 2010, el esfuerzo se redujo casi a la mitad, en sentido contrario a la tendencia mundial.
Figura 8. Relación entre gasto en investigación y patentamiento por habitante en 2021 (escala logarítmica). México se ubica en el extremo inferior de la distribución.
México destina hoy 0.27 % del PIB a investigación, contra 0.47 % en 2010: recortó su esfuerzo casi a la mitad justo cuando el resto del mundo lo subía. Con 8.8 patentes por millón de habitantes queda debajo de Brasil y Chile, y a dos órdenes de magnitud de Corea del Sur.
Afirmación. El gasto en I+D también genera patentes a nivel de país, con rendimientos decrecientes, pero ese rendimiento se ha deteriorado década tras década. México va a contracorriente: recortó su inversión mientras el mundo la aumentaba.
Razonamiento. En un panel de países hay que separar el efecto de la inversión de las diferencias permanentes entre naciones. La prueba de Hausman apunta a efectos fijos, que además es lo razonable porque cuánto patenta un país y cuánto invierte están correlacionados. Agrupar por décadas destapa un deterioro que la variación anual esconde. Y como el fenómeno es tan persistente, el modelo se usa para simular escenarios, no para pronosticar.
Evidencia.
Primera: los efectos fijos cambian la respuesta, no solo la precisión. En las Partes 1 y 3, ignorar que las unidades son distintas entre sí infla la elasticidad: de 0.49 a 0.65 entre empresas, y de 0.54 a 1.20 entre países. No es un matiz estadístico. Es la diferencia entre atribuirle a la inversión un efecto que en realidad viene del tamaño de la empresa o de la tradición científica del país.
Segunda: limpiar los datos decide el resultado. Tres decisiones de limpieza cambiaron conclusiones de fondo: descartar el año truncado en la Parte 1, sacar la categoría transversal en la Parte 2 y eliminar los agregados regionales en la Parte 3. Las tres salen de la misma idea, que es revisar qué representa cada fila antes de modelar. Y ninguna se ve en la salida de un modelo mal especificado.
Tercera: hay que declarar los límites del modelo. En las Partes 1 y 3 el pronóstico ingenuo le ganó al modelo estructural. Reportarlo no debilita el trabajo, lo acota: deja claro para qué sirve cada herramienta. Estos modelos contestan cuánto cambia el resultado si cambia la inversión, que es lo que necesitamos para decidir, no cuál será el dato del próximo año.
Los dos niveles de análisis llegan al mismo mensaje: el retorno de la innovación es positivo pero decreciente, y se ha ido deteriorando. Para México, que gasta 0.27 % del PIB en I+D, el margen de mejora es amplio y el modelo sugiere que duplicar el esfuerzo daría efectos medibles. En el mercado de consumo, esa misma lógica de rendimientos decrecientes respalda la elección de Skin Care: entre una categoría grande y de crecimiento sostenido y otra que crece rápido pero es volátil, conviene la primera, sobre todo cuando crecer rápido atrae competencia.
Banco Mundial. (2026). World Development Indicators.
Indicadores IP.PAT.RESD, GB.XPD.RSDV.GD.ZS,
NY.GDP.PCAP.KD, SP.POP.TOTL y
FP.CPI.TOTL. Consultados el 24 de agosto de 2026 mediante
la API pública. https://api.worldbank.org
Croissant, Y. y Millo, G. (2008). Panel Data Econometrics in R: The
plm Package. Journal of Statistical Software,
27(2), 1-43.
Euromonitor International. (2026). Market Sizes: Beauty and Personal Care, México, 2011-2025. Retail Value RSP, precios corrientes. Exportado el 8 de julio de 2026.
Hausman, J., Hall, B. H. y Griliches, Z. (1984). Econometric Models for Count Data with an Application to the Patents-R&D Relationship. Econometrica, 52(4), 909-938.
Zeileis, A. (2004). Econometric Computing with HC and HAC Covariance Matrix Estimators. Journal of Statistical Software, 11(10), 1-17.
Todo el documento se compila desde este archivo. Los datos de las Partes 1 y 2 vienen de los archivos originales convertidos a CSV; los de la Parte 3 se bajan de la API del Banco Mundial y se guardan localmente en la primera corrida.
| Componente | Versión |
|---|---|
| R | 4.6.1 |
| plm | 2.6.7 |
| sandwich | 3.1.3 |
| lmtest | 0.9.40 |
| knitr | 1.51 |
| kableExtra | 1.4.1 |
| jsonlite | 2.0.0 |