← Catálogo
· Capítulo 5
T05_CP01_mECO_Panel_Inversion.R
# =============================================================================
# TEMA 05 — CP1: Panel — Inversión Empresarial
# =============================================================================
# Manual de Microeconometría — Carlos de Anta Puig
# Profesor de Econometría y Microeconometría — UNIR
# https://github.com/carlanta/MicroEconometrics Versión 1.0 — 2026
#
# OBJETIVO: Modelar la inversión de 80 empresas × 10 años con datos de panel.
# EF correlacionados con tamaño → Hausman rechazará EA.
# INSTRUCCIONES: Session > Set Working Directory > To Source File Location
# =============================================================================
pausa <- function(msg="\n>>> Pulsa ENTER para continuar...") {
if (interactive()) readline(msg) else Sys.sleep(0.5)
}
pkgs <- c("plm","lmtest","sandwich")
for (p in pkgs) if (!requireNamespace(p, quietly=TRUE)) install.packages(p, quiet=TRUE)
suppressPackageStartupMessages({ library(plm); library(lmtest); library(sandwich) })
.get_script_dir <- function() {
args <- commandArgs(trailingOnly = FALSE)
for (a in args) {
if (startsWith(a, "--file=")) return(dirname(normalizePath(substring(a, 8))))
}
for (i in seq_len(sys.nframe())) {
ofile <- tryCatch(sys.frame(i)$ofile, error = function(e) NULL)
if (!is.null(ofile)) return(dirname(normalizePath(ofile)))
}
return(normalizePath("."))
}
.sdir <- .get_script_dir()
DATA_DIR <- normalizePath(file.path(.sdir, "..", "data"), mustWork=FALSE)
OUTPUT_DIR <- normalizePath(file.path(.sdir, "..", "output"), mustWork=FALSE)
if (!dir.exists(OUTPUT_DIR)) dir.create(OUTPUT_DIR, recursive=TRUE)
cat("\n================================================================\n")
cat(" CP01 — Inversión Empresarial: Panel 80 empresas × 10 años\n")
cat("================================================================\n\n")
# --- CARGA DE DATOS ---
load(file.path(DATA_DIR, "T05_CP01_inversion_empresas.RData"))
cat("Dataset:", nrow(panel_inv), "observaciones\n")
cat(" Empresas:", length(unique(panel_inv$id_empresa)), "\n")
cat(" Años:", min(panel_inv$anio), "-", max(panel_inv$anio), "\n\n")
# --- DESCRIPTIVOS ---
cat("--- ESTADÍSTICOS DESCRIPTIVOS ---\n\n")
vars <- c("inversion","ventas","stock_capital","deuda")
labs <- c("Inversión","Ventas","Stock capital","Deuda")
cat(sprintf(" %-14s %10s %10s %10s %10s\n", "Variable", "Media", "D.E.", "Mín.", "Máx."))
cat(sprintf(" %s\n", paste(rep("-", 58), collapse="")))
for (i in seq_along(vars)) {
x <- panel_inv[[vars[i]]]
cat(sprintf(" %-14s %10.1f %10.1f %10.1f %10.1f\n", labs[i], mean(x), sd(x), min(x), max(x)))
}
cat(sprintf("\n Sectores: %s\n", paste(unique(panel_inv$sector), collapse=", ")))
pausa()
# --- EDA GRÁFICO ---
cat("\n--- ANÁLISIS EXPLORATORIO GRÁFICO ---\n\n")
png(file.path(OUTPUT_DIR, "T05_CP01_eda.png"), width=1600, height=700, res=150)
par(mfrow=c(1,2), mar=c(4.5,4.5,2.5,0.5), cex.main=0.88)
# Histograma inversión
hist(panel_inv$inversion, breaks=30, col=gray(0.70), border="white",
main="Distribución inversión", xlab="Inversión", ylab="Frecuencia")
# Inversión vs ventas
plot(panel_inv$ventas, panel_inv$inversion, pch=1, col=gray(0.5), cex=0.5,
xlab="Ventas", ylab="Inversión", main="Inversión vs Ventas")
abline(lm(inversion ~ ventas, data=panel_inv), lwd=2, lty=1)
dev.off()
cat(" Gráfico guardado: output/T05_CP01_eda.png\n")
pausa()
# --- DESCOMPOSICIÓN WITHIN/BETWEEN ---
cat("\n--- DESCOMPOSICIÓN WITHIN/BETWEEN ---\n\n")
for (v in vars) {
total_v <- var(panel_inv[[v]])
medias_i <- tapply(panel_inv[[v]], panel_inv$id_empresa, mean)
between_v <- var(medias_i)
within_v <- var(panel_inv[[v]] - rep(medias_i, each=10))
cat(sprintf(" %-14s Total: %10.1f | Between: %10.1f | Within: %10.1f\n",
v, total_v, between_v, within_v))
}
cat("\n La inversión tiene más variación between que within:\n")
cat(" las diferencias entre empresas dominan sobre los cambios temporales.\n")
pausa()
# --- ESTIMACIÓN ---
cat("\n--- ESTIMACIÓN: POOLED, EF, EA ---\n\n")
pdata <- pdata.frame(panel_inv, index=c("id_empresa","anio"))
fml <- inversion ~ ventas + stock_capital + deuda
mod_p <- plm(fml, data=pdata, model="pooling")
mod_fe <- plm(fml, data=pdata, model="within")
mod_re <- plm(fml, data=pdata, model="random")
vv <- c("ventas","stock_capital","deuda")
ct_p <- coef(summary(mod_p)); ct_f <- coef(summary(mod_fe)); ct_r <- coef(summary(mod_re))
cat(sprintf(" %-14s | %9s %8s | %9s %8s | %9s %8s\n",
"Variable","Pooled","EE","EF","EE","EA","EE"))
cat(sprintf(" %s\n", paste(rep("-",72), collapse="")))
for (v in vv) {
cat(sprintf(" %-14s | %9.4f %8.4f | %9.4f %8.4f | %9.4f %8.4f\n",
v, ct_p[v,1], ct_p[v,2], ct_f[v,1], ct_f[v,2], ct_r[v,1], ct_r[v,2]))
}
pausa()
# --- TESTS ---
cat("\n--- TEST F: EFECTOS INDIVIDUALES ---\n\n")
ft <- pFtest(mod_fe, mod_p)
cat(sprintf(" F = %.2f | p-valor = %.6f\n", ft$statistic, ft$p.value))
if (ft$p.value < 0.05)
cat(" ✓ Efectos individuales significativos. Pooled OLS descartado.\n\n")
pausa()
cat("--- TEST DE HAUSMAN: EF vs EA ---\n\n")
ht <- phtest(mod_fe, mod_re)
cat(sprintf(" H = %.2f | g.l. = %d | p-valor = %.4f\n",
ht$statistic, ht$parameter, ht$p.value))
if (ht$p.value < 0.05) {
cat(" ✓ Se rechaza H0: EFECTOS FIJOS es el estimador correcto.\n")
cat(" Los efectos individuales correlacionan con los regresores.\n")
cat(" (esperado: alfa_i depende del tamaño, correlacionado con ventas)\n\n")
} else {
cat(" ✗ No se rechaza H0: EA es adecuado.\n\n")
}
pausa()
cat("--- TEST DE WOOLDRIDGE: AUTOCORRELACIÓN ---\n\n")
wt <- pwartest(mod_fe)
cat(sprintf(" F = %.3f | p-valor = %.4f\n", wt$statistic, wt$p.value))
if (wt$p.value < 0.05) cat(" ✓ Hay autocorrelación → usar errores clustered.\n\n") else cat(" ✗ No hay evidencia de autocorrelación serial.\n\n")
pausa()
# --- EF CON ERRORES CLUSTERED ---
cat("--- EFECTOS FIJOS CON ERRORES CLUSTERED ---\n\n")
rob <- coeftest(mod_fe, vcov=vcovHC(mod_fe, type="HC1", cluster="group"))
cat(sprintf(" %-14s | %9s %8s %8s %10s\n", "Variable","Coef.","EE rob.","t","p-valor"))
cat(sprintf(" %s\n", paste(rep("-",56), collapse="")))
for (v in vv) {
sig <- ifelse(rob[v,4]<0.001,"***",ifelse(rob[v,4]<0.01,"**",
ifelse(rob[v,4]<0.05,"*"," ")))
cat(sprintf(" %-14s | %9.4f %8.4f %8.3f %10.6f %s\n",
v, rob[v,1], rob[v,2], rob[v,3], rob[v,4], sig))
}
pausa()
# --- EFECTOS FIJOS INDIVIDUALES ---
cat("\n--- EFECTOS FIJOS INDIVIDUALES (primeros 15) ---\n\n")
ef <- fixef(mod_fe)
cat(sprintf(" %-10s %10s\n", "Empresa", "alpha_i"))
cat(sprintf(" %s\n", paste(rep("-",24), collapse="")))
for (i in 1:min(15, length(ef)))
cat(sprintf(" %-10s %10.2f\n", names(ef)[i], ef[i]))
png(file.path(OUTPUT_DIR, "T05_CP01_efectos_fijos.png"), width=1400, height=600, res=150)
par(mar=c(5,5,2.5,1))
barplot(sort(ef), col=gray(seq(0.25,0.85,length.out=length(ef))),
border="white", las=2, ylab="Efecto fijo estimado",
main="Efectos individuales — 80 empresas", cex.names=0.45)
abline(h=0, lty=2, col=gray(0.4), lwd=1.5)
dev.off()
cat("\n Gráfico: output/T05_CP01_efectos_fijos.png\n")
pausa()
# --- RESUMEN ---
cat("\n================================================================\n")
cat(" RESUMEN CP01 — Inversión Empresarial\n")
cat("================================================================\n\n")
cat(" 1. Panel de 80 empresas × 10 años (800 obs).\n")
cat(" 2. Efectos individuales altamente significativos.\n")
cat(" 3. Hausman rechaza EA → EFECTOS FIJOS es el estimador correcto.\n")
cat(" 4. Las ventas y el stock de capital aumentan la inversión.\n")
cat(" 5. La deuda tiene efecto negativo sobre la inversión.\n\n")
cat("================================================================\n")