Institución: Universidad de las Fuerzas Armadas ESPE
Programa: Licenciatura en Economía
Base de datos: PANELDATA.CSV — 90 observaciones · 6 aerolíneas · período 1970–1984
Soporte metodológico: Econometrics — Empresa especializada en análisis econométrico


Resumen

El presente trabajo analiza los costos operativos de seis aerolíneas en el período 1970–1984, utilizando técnicas de econometría de datos de panel. La base de datos PANELDATA.CSV contiene 90 observaciones correspondientes a seis individuos (aerolíneas) y quince períodos de tiempo, permitiendo aplicar modelos de efectos fijos y aleatorios para estudiar la dinámica de los costos en función de variables como la ganancia, el precio del combustible y la capacidad operativa.

Esta investigación fue desarrollada con el apoyo de Econometrics, empresa dedicada al análisis de datos y modelado econométrico aplicado.


Agradecimientos

Esta investigación no habría sido posible sin el apoyo, la confianza y las palabras de aliento de las personas que, de una u otra manera, estuvieron presentes a lo largo de este proceso.

A mi madre, Azucena Manosalvas, por su amor incondicional, sacrificio, fortaleza y apoyo constante. Por ser uno de los pilares fundamentales de mi vida y por enseñarme, con su ejemplo, el valor de la perseverancia y del esfuerzo. Cada logro alcanzado lleva también una parte de todo lo que ha hecho por mí.

A mi familia, por acompañarme durante las distintas etapas de mi formación, por su comprensión y por estar presentes tanto en los momentos de satisfacción como en aquellos en los que el camino se hizo más difícil. Su apoyo ha sido fundamental para continuar avanzando y alcanzar cada nueva meta.

A Jhennyfer Eivar, amiga y compañera de proyectos, por su apoyo constante, comprensión, motivación y confianza durante este proceso. Gracias por estar presente en los momentos de mayor exigencia y por compartir no solo las dificultades, sino también la ilusión de construir nuevos proyectos. Como cofundadora de Econometrics, su aporte ha sido especialmente importante en la construcción de esta iniciativa que, aunque todavía se encuentra en sus primeras etapas, representa un espacio para aprender, investigar, crear y poner la econometría y la ciencia de datos al servicio de problemas reales.

Finalmente, agradezco a todas las personas que, directa o indirectamente, contribuyeron a mi formación y a la realización de esta investigación.

Dilan Alexander Manosalvas Andrade
Universidad de las Fuerzas Armadas ESPE
Agosto 2022


1 Principios de Econometría

1.1 Análisis Descriptivo

library(patchwork)
library(knitr)
library(kableExtra)
library(ggplot2)
library(GGally)
library(lubridate)
library(magrittr)
library(plm)
library(pder)
library(dplyr)
library(lmtest)
library(car)
library(geepack)
library(stargazer)
library(texreg)
library(sandwich)

base <- read.csv("PanelData.csv", header = TRUE, sep = ",")
colnames(base) <- c("I", "T", "C", "Q", "PF", "LF")
base$T <- as.Date("1969-01-01") + years(base$T)

En esta sección se aborda el estudio de la estadística descriptiva aplicada al análisis econométrico. Es importante la presentación y descripción de los datos para lo cual se presentan los elementos básicos para la elaboración de cuadros estadísticos, incluyendo cuadros de frecuencia para variables cualitativas y cuantitativas.

knitr::kable(
  head(base),
  caption = "Costos de aerolíneas de seis empresas en el período 1970–1984",
  align = "c"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
  footnote(
    general        = "Fuente: Base de datos PANELDATA.CSV",
    number         = c("Individuo (I): Tipo de aerolínea (1 al 6)", "Tiempo (T): Período 1970–1984"),
    alphabet       = c("C: Costo total en miles de dólares", "Q: Ganancias en millas por pasajero"),
    symbol         = c("PF: Precio del combustible", "LF: Capacidad promedio de operación"),
    number_title   = "Índice:",
    alphabet_title = "Variables:"
  )
Costos de aerolíneas de seis empresas en el período 1970–1984
I T C Q PF LF
1 1970-01-01 1140640 0.952757 106650 0.534487
1 1971-01-01 1215690 0.986757 110307 0.532328
1 1972-01-01 1309570 1.091980 110574 0.547736
1 1973-01-01 1511530 1.175780 121974 0.540846
1 1974-01-01 1676730 1.160170 196606 0.591167
1 1975-01-01 1823740 1.173760 265609 0.575417
Note:
Fuente: Base de datos PANELDATA.CSV
Índice:
1 Individuo (I): Tipo de aerolínea (1 al 6)
2 Tiempo (T): Período 1970–1984
Variables:
a C: Costo total en miles de dólares
b Q: Ganancias en millas por pasajero
* PF: Precio del combustible
LF: Capacidad promedio de operación

La base de datos PANELDATA.CSV presenta dimensiones de 90 observaciones y 6 variables. El tipo de individuo y el período darán validez a distintos modelos en relación a cambios estructurales del tiempo, que pueden ser aleatorios o fijos.

data.frame(
  Variable = names(base),
  Clase    = sapply(base, typeof),
  Valores  = sapply(base, function(x) paste0(head(x), collapse = ", ")),
  row.names = NULL
) %>%
  kable(caption = "Descripción de las variables de la base PANELDATA.CSV") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
  add_footnote(
    "Base de datos PANELDATA.CSV: 90 observaciones, 6 aerolíneas, período 1970–1984",
    notation = "alphabet"
  )
Descripción de las variables de la base PANELDATA.CSV
Variable Clase Valores
I integer 1, 1, 1, 1, 1, 1
T double 1970-01-01, 1971-01-01, 1972-01-01, 1973-01-01, 1974-01-01, 1975-01-01
C integer 1140640, 1215690, 1309570, 1511530, 1676730, 1823740
Q double 0.952757, 0.986757, 1.09198, 1.17578, 1.16017, 1.17376
PF integer 106650, 110307, 110574, 121974, 196606, 265609
LF double 0.534487, 0.532328, 0.547736, 0.540846, 0.591167, 0.575417
a Base de datos PANELDATA.CSV: 90 observaciones, 6 aerolíneas, período 1970–1984
theme_set(theme_classic())
ggplot(data = base, aes(x = T, y = C, col = I)) +
  geom_point(aes(shape = as.factor(I))) +
  geom_smooth(method = "loess", formula = y ~ x, alpha = 0.1,
              se = TRUE, level = 0.95,
              aes(linetype = as.factor(I), fill = as.factor(I))) +
  geom_hline(yintercept = 0, col = "red", linewidth = 0.5, alpha = 0.5) +
  labs(
    title    = "Costos de aerolíneas de 6 empresas en el período 1970–1984",
    subtitle = "Fuente: Econometrics — https://econometricis.vercel.app/",
    caption  = "Base de datos: PANELDATA.CSV",
    y = "Costo total (miles de dólares)", x = "Períodos",
    color = "Aerolínea", shape = "Tipo", linetype = "Tamaño", fill = "Empresas"
  ) +
  theme(
    plot.title    = element_text(hjust = 0.5, size = 12, color = "steelblue", face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray", face = "italic"),
    axis.text.x   = element_text(angle = 90, vjust = 0.5, size = 8),
    legend.position = "bottom"
  ) +
  guides(color = "none", fill = "none", shape = "none")
Series de tiempo — costos de 6 aerolíneas en el período 1970–1984

Series de tiempo — costos de 6 aerolíneas en el período 1970–1984

El costo para mantener las operaciones se incrementa conforme transcurre el tiempo. La principal causa se atribuye al Índice de Precios al Consumidor y la inflación, generando variaciones en los costos operacionales que, al omitir estos efectos macroeconómicos, tienden a aplanarse.

ggplot(data = base, aes(x = as.factor(I), y = C)) +
  geom_boxplot(alpha = 0.2) +
  geom_jitter(alpha = 0.3, aes(color = as.factor(I))) +
  labs(
    title    = "Diagrama de caja para los costos de 6 aerolíneas (1970–1984)",
    subtitle = "Fuente: Econometrics — https://econometricis.vercel.app/",
    caption  = "Base de datos: PANELDATA.CSV",
    y = "Costo total (miles de dólares)", x = "Tipo de aerolínea", color = "Aerolínea"
  ) +
  theme(
    plot.title    = element_text(hjust = 0.5, size = 12, color = "steelblue", face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray", face = "italic"),
    legend.position = "bottom"
  )
Diagrama de caja — costos de 6 aerolíneas (1970–1984)

Diagrama de caja — costos de 6 aerolíneas (1970–1984)

En los diagramas de caja se observa que las aerolíneas 1 y 2 tienen costos notablemente mayores que el resto, lo que sugiere también márgenes de beneficio más amplios.

ggplot(data = base, aes(x = C, fill = as.factor(I))) +
  scale_fill_brewer(palette = "Spectral") +
  geom_histogram(alpha = 0.5, linewidth = 0.5) +
  geom_density() +
  labs(
    title    = "Histograma de densidad — costos de 6 aerolíneas (1970–1984)",
    subtitle = "Fuente: Econometrics — https://econometricis.vercel.app/",
    caption  = "Base de datos: PANELDATA.CSV",
    y = "Cantidad", x = "Costo (miles de dólares)", fill = "Aerolínea"
  ) +
  theme(
    plot.title    = element_text(hjust = 0.5, size = 12, color = "steelblue", face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray", face = "italic"),
    axis.text.x   = element_text(angle = 90, vjust = 0.5, size = 8),
    legend.position = "bottom"
  )
Histograma de densidad de costos — 6 aerolíneas

Histograma de densidad de costos — 6 aerolíneas

La distribución se asemeja a una \(\chi^2\), sin forma de campana de Gauss, lo que sugiere presencia de heterocedasticidad y posible multicolinealidad. Se confirma con el análisis Q-Q:

A <- ggplot(data = base, aes(sample = C)) +
  stat_qq(color = "gray", size = 1, alpha = 0.5, shape = 10) +
  stat_qq_line(color = "black", linewidth = 1, alpha = 0.3) +
  labs(y = "Muestra: Costo", x = "Teórica")
B_p <- ggplot(data = base, aes(sample = Q)) +
  stat_qq(color = "gray", size = 1, alpha = 0.5, shape = 10) +
  stat_qq_line(color = "black", linewidth = 1, alpha = 0.3) +
  labs(y = "Muestra: Ganancia", x = "Teórica")
C_p <- ggplot(data = base, aes(sample = PF)) +
  stat_qq(color = "gray", size = 1, alpha = 0.5, shape = 10) +
  stat_qq_line(color = "black", linewidth = 1, alpha = 0.3) +
  labs(y = "Muestra: Precio combustible", x = "Teórica")
D_p <- ggplot(data = base, aes(sample = LF)) +
  stat_qq(color = "gray", size = 1, alpha = 0.5, shape = 10) +
  stat_qq_line(color = "black", linewidth = 1, alpha = 0.3) +
  labs(y = "Muestra: Capacidad promedio", x = "Teórica")
A + B_p + C_p + D_p + plot_layout(ncol = 2)
Distribuciones Q-Q para cada variable del modelo

Distribuciones Q-Q para cada variable del modelo

1.2 Datos de Panel

Econometría con Enfoques Modernos — Econometrics

Los paneles desbalanceados son más comunes en los campos económicos. La principal preocupación es ¿por qué los datos están desequilibrados? Se contemplan tres casos: MCAR (datos faltantes completamente aleatorios), MAR (datos faltantes no aleatoriamente pero explicables por covariables) y NMAR (no respuesta no ignorable).

pbase <- pdata.frame(base, index = c("I", "T"))
knitr::kable(
  head(row.names(pbase)),
  caption = "Nombres de las filas de la base de datos indexada — 6 aerolíneas",
  col.names = "Índice"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE) %>%
  footnote(general = "Fuente: Base de datos PANELDATA.CSV — Índice: análisis para datos balanceados")
Nombres de las filas de la base de datos indexada — 6 aerolíneas
Índice
1-1970-01-01
1-1971-01-01
1-1972-01-01
1-1973-01-01
1-1974-01-01
1-1975-01-01
Note:
Fuente: Base de datos PANELDATA.CSV — Índice: análisis para datos balanceados

El panel está balanceado. Un desajuste en el balance provocaría pérdida significativa de los estimadores, sesgándolos e invalidando la interpretación.


2 Técnicas de Visualización

2.1 Análisis Estructural

Se realiza la gráfica de la relación entre costos para cada individuo a través del tiempo. La tendencia se incrementa confirmando de manera gráfica que los efectos crecientes alteran la homogeneidad, atribuibles a la inflación y la paridad del tipo de cambio.

pbase_ind <- pdata.frame(x = base, index = c("I"))
base2 <- read.csv("PanelData.csv", header = TRUE, sep = ",")
colnames(base2) <- c("I", "T", "C", "Q", "PF", "LF")

ggplot(data = base2, aes(x = I, y = C, col = I)) +
  geom_point(aes(shape = as.factor(I))) +
  facet_grid(cols = vars(T)) +
  scale_fill_brewer(palette = "Spectral") +
  labs(
    title    = "Relación de los costos de diferentes aerolíneas por período",
    subtitle = "Fuente: Econometrics — https://econometricis.vercel.app/",
    caption  = "Base de datos: PANELDATA.CSV",
    y = "Costo total (miles de dólares)", x = "Aerolínea",
    color = "Aerolínea", shape = "Tipo"
  ) +
  theme(
    plot.title    = element_text(hjust = 0.5, size = 12, color = "steelblue", face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray", face = "italic"),
    axis.text.x   = element_text(angle = 90, vjust = 0.5, size = 8),
    legend.position = "bottom"
  )
Relación de costos de aerolíneas por período (1970–1984)

Relación de costos de aerolíneas por período (1970–1984)

base %>%
  group_by(I) %>%
  summarise(costo_promedio = mean(C)) %>%
  left_join(base, by = "I") %>%
  ggplot(data = ., aes(x = reorder(as.character(I), I), y = C, col = as.factor(I))) +
  geom_point(alpha = 0.5, aes(size = T, shape = as.factor(I))) +
  geom_line(aes(x = I, y = costo_promedio), linetype = "dotted",
            color = "red", alpha = 0.5, linewidth = 1.1) +
  scale_colour_brewer(palette = "Set1") +
  labs(
    title    = "Tendencia promedio de costos por aerolínea",
    subtitle = "Fuente: Econometrics — https://econometricis.vercel.app/",
    caption  = "Base de datos: PANELDATA.CSV",
    tag      = "Nota: Se evidencia heterocedasticidad entre individuos",
    y = "Costo total (miles de dólares)", x = "Aerolínea", color = "Aerolínea"
  ) +
  theme(
    plot.title    = element_text(hjust = 0.5, size = 12, color = "steelblue", face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray", face = "italic"),
    plot.tag      = element_text(color = "black", face = "italic", size = 9),
    plot.tag.position = "bottom", legend.position = "top"
  ) +
  guides(size = "none", shape = "none")
Tendencia promedio de costos por tipo de aerolínea

Tendencia promedio de costos por tipo de aerolínea

ggpairs(
  data = base, columns = 2:6,
  aes(color = as.factor(I), alpha = 0.5),
  upper = list(continuous = wrap("cor", size = 2.5))
) +
  scale_colour_brewer(palette = "Set1") +
  labs(
    title    = "Gráfico de correlación de variables — 6 aerolíneas",
    subtitle = "Fuente: Econometrics — https://econometricis.vercel.app/"
  ) +
  theme(
    plot.title    = element_text(hjust = 0.5, size = 12, color = "steelblue", face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 10, color = "gray", face = "italic"),
    legend.position = "bottom"
  )
Gráfico de correlación entre variables — 6 aerolíneas

Gráfico de correlación entre variables — 6 aerolíneas

2.2 Modelos con Datos de Panel

Un conjunto de datos de panel es una muestra compuesta por individuos (aerolíneas) recogida en un período de tiempo determinado. Los problemas más comunes en la econometría de datos de panel incluyen: heterocedasticidad, multicolinealidad, correlación serial y endogeneidad.

pbase_tab <- pdata.frame(base, index = c("I", "T"))
knitr::kable(
  head(pbase_tab),
  caption = "Datos de panel indexados por individuo y tiempo — 6 aerolíneas (1970–1984)"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE) %>%
  footnote(
    general        = "Fuente: Base de datos PANELDATA.CSV",
    alphabet       = c("C: Costo total en miles", "Q: Ganancia en millas por pasajero"),
    symbol         = c("PF: Precio del combustible", "LF: Capacidad promedio"),
    alphabet_title = "Variables:"
  )
Datos de panel indexados por individuo y tiempo — 6 aerolíneas (1970–1984)
I T C Q PF LF
1 1970-01-01 1140640 0.952757 106650 0.534487
1 1971-01-01 1215690 0.986757 110307 0.532328
1 1972-01-01 1309570 1.091980 110574 0.547736
1 1973-01-01 1511530 1.175780 121974 0.540846
1 1974-01-01 1676730 1.160170 196606 0.591167
1 1975-01-01 1823740 1.173760 265609 0.575417
Note:
Fuente: Base de datos PANELDATA.CSV
Variables:
a C: Costo total en miles
b Q: Ganancia en millas por pasajero
* PF: Precio del combustible
LF: Capacidad promedio

2.2.1 Modelo Pooling

c.pooling.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
                   effect = "individual", model = "pooling")

stargazer(
  c.pooling.1,
  dep.var.caption  = "Variable dependiente",
  dep.var.labels   = "Costo",
  column.labels    = "Modelo Pooling",
  covariate.labels = c("Intercepto", "Ganancia", "Precio del combustible", "Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  omit.stat = c("f", "ser"),
  title = "Modelo Pooling: Costo vs Ganancia, Precio del combustible y Carga",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Estimación MCO con errores estándar robustos"),
  notes.append = TRUE
)
Modelo Pooling: Costo vs Ganancia, Precio del combustible y Carga
Variable dependiente
Costo
Modelo Pooling
Intercepto 1,158,559.00
(360,592.70)**
Ganancia 2,026,114.00
(61,806.95)***
Precio del combustible 1.23
(0.10)***
Carga -3,065,753.00
(696,327.30)***
Observations 90
R2 0.95
Adjusted R2 0.94
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Estimación MCO con errores estándar robustos

El modelo Pooling indica que alrededor del 94% de la variación de los costos es explicada por las variables del modelo. Por cada unidad de ganancia el costo incrementa en promedio; los efectos del precio del combustible y la capacidad de carga también resultan estadísticamente significativos.

2.2.2 Modelo Within (Efectos Fijos)

c.within.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
                  effect = "individual", model = "within", random.method = "swar")
c.pooling.ef <- plm(formula = C ~ Q + PF + LF + factor(I) - 1, data = base,
                    index = c("I", "T"), effect = "individual", model = "pooling")

stargazer(
  c.within.1, c.pooling.ef,
  dep.var.caption  = "Variable dependiente",
  dep.var.labels   = "Costo",
  column.labels    = c("Modelo Within", "Within con efectos individuales"),
  covariate.labels = c("Ganancia", "Precio del combustible", "Carga",
                       "Aerolínea 1","Aerolínea 2","Aerolínea 3",
                       "Aerolínea 4","Aerolínea 5","Aerolínea 6"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  column.separate = c(1, 1), omit.stat = c("f", "ser"),
  title = "Modelo Within: Costo vs Ganancia, Precio del combustible y Carga",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Estimación within con errores estándar robustos"),
  notes.append = TRUE
)
Modelo Within: Costo vs Ganancia, Precio del combustible y Carga
Variable dependiente
Costo
Modelo Within Within con efectos individuales
(1) (2)
Ganancia 3,319,023.00 3,319,023.00
(171,354.10)*** (171,354.10)***
Precio del combustible 0.77 0.77
(0.10)*** (0.10)***
Carga -3,797,368.00 -3,797,368.00
(613,773.10)*** (613,773.10)***
Aerolínea 1 -131,236.00
(350,777.10)
Aerolínea 2 470,497.20
(309,078.30)
Aerolínea 3 1,205,944.00
(332,355.00)***
Aerolínea 4 1,646,356.00
(318,348.50)***
Aerolínea 5 1,697,016.00
(334,775.60)***
Aerolínea 6 1,575,238.00
(307,316.10)***
Observations 90 90
R2 0.93 0.97
Adjusted R2 0.92 0.97
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Estimación within con errores estándar robustos

El modelo Within presenta \(R^2_{adj} = 0.92\), explicando el 92% de la variación de los costos. Los efectos individuales representan la desviación promedio de cada aerolínea respecto a la media global.

2.2.3 Modelo Between (Entre Grupos)

c.between.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
                   effect = "individual", model = "between", random.method = "swar")

stargazer(
  c.between.1,
  dep.var.caption  = "Variable dependiente",
  dep.var.labels   = "Costo",
  column.labels    = "Modelo Between",
  covariate.labels = c("Intercepto", "Ganancia", "Precio del combustible", "Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  omit.stat = c("f", "ser"),
  title = "Modelo Between: Costo vs Ganancia, Precio del combustible y Carga",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Estimación entre grupos con errores estándar robustos"),
  notes.append = TRUE
)
Modelo Between: Costo vs Ganancia, Precio del combustible y Carga
Variable dependiente
Costo
Modelo Between
Intercepto 6,201,391.00
(18,381,492.00)
Ganancia 1,818,281.00
(544,929.00)
Precio del combustible -9.42
(42.11)
Carga -2,898,660.00
(3,961,245.00)
Observations 6
R2 0.99
Adjusted R2 0.99
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Estimación entre grupos con errores estándar robustos

El modelo Between con \(R^2_{adj} = 0.99\) presenta el mejor ajuste, aunque opera sobre las medias individuales (solo 6 observaciones efectivas), lo que exige precaución en su interpretación.

2.2.4 Modelo en Primeras Diferencias

c.fd.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
              effect = "individual", model = "fd", random.method = "swar")

stargazer(
  c.fd.1,
  dep.var.caption  = "Variable dependiente",
  dep.var.labels   = "Costo",
  column.labels    = "Modelo Primeras Diferencias",
  covariate.labels = c("Intercepto", "Ganancia", "Precio del combustible", "Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  omit.stat = c("f", "ser"),
  title = "Modelo en Primeras Diferencias: Costo vs Ganancia, Precio del combustible y Carga",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Estimación en primeras diferencias con errores estándar robustos"),
  notes.append = TRUE
)
Modelo en Primeras Diferencias: Costo vs Ganancia, Precio del combustible y Carga
Variable dependiente
Costo
Modelo Primeras Diferencias
Intercepto 73,267.57
(16,544.25)***
Ganancia 1,149,305.00
(213,458.60)***
Precio del combustible 0.58
(0.13)***
Carga -1,702,376.00
(473,661.10)***
Observations 84
R2 0.36
Adjusted R2 0.34
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Estimación en primeras diferencias con errores estándar robustos

2.3 Comparación de Modelos de Efectos Fijos

stargazer(
  c.pooling.1, c.within.1, c.between.1, c.fd.1,
  dep.var.caption  = "Variable dependiente",
  dep.var.labels   = c("Costo","Costo","Costo","Costo"),
  column.labels    = c("Pooling","Within","Between","Primeras Dif."),
  covariate.labels = c("Intercepto","Ganancia","Precio del combustible","Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  column.separate = c(1,1,1,1), omit.stat = c("f","ser"),
  title = "Comparación entre modelos de efectos fijos — Base PANELDATA.CSV",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Comparación de modelos econométricos"),
  notes.append = TRUE
)
Comparación entre modelos de efectos fijos — Base PANELDATA.CSV
Variable dependiente
Costo
Pooling Within Between Primeras Dif.
(1) (2) (3) (4)
Intercepto 1,158,559.00 6,201,391.00 73,267.57
(360,592.70)** (18,381,492.00) (16,544.25)***
Ganancia 2,026,114.00 3,319,023.00 1,818,281.00 1,149,305.00
(61,806.95)*** (171,354.10)*** (544,929.00) (213,458.60)***
Precio del combustible 1.23 0.77 -9.42 0.58
(0.10)*** (0.10)*** (42.11) (0.13)***
Carga -3,065,753.00 -3,797,368.00 -2,898,660.00 -1,702,376.00
(696,327.30)*** (613,773.10)*** (3,961,245.00) (473,661.10)***
Observations 90 90 6 84
R2 0.95 0.93 0.99 0.36
Adjusted R2 0.94 0.92 0.99 0.34
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Comparación de modelos econométricos

2.4 Efectos Aleatorios

A diferencia del modelo de efectos fijos, en el modelo de efectos aleatorios los coeficientes individuales \(\alpha_i\) varían de manera aleatoria en el tiempo y a través de los individuos. Se recomienda este enfoque cuando los paneles están balanceados y los individuos son inferiores a los períodos de tiempo.

2.4.1 Método de Swamy-Arora

c.swar.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
                effect = "individual", model = "random", random.method = "swar")

stargazer(
  c.swar.1,
  dep.var.caption  = "Variable dependiente", dep.var.labels = "Costo",
  column.labels    = "Modelo aleatorio: Swamy-Arora",
  covariate.labels = c("Intercepto","Ganancia","Precio del combustible","Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  omit.stat = c("f","ser"),
  title = "Modelo aleatorio: método de Swamy-Arora",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Modelo aleatorio: método de Swamy-Arora"),
  notes.append = TRUE
)
Modelo aleatorio: método de Swamy-Arora
Variable dependiente
Costo
Modelo aleatorio: Swamy-Arora
Intercepto 1,074,293.00
(377,468.00)**
Ganancia 2,288,588.00
(109,493.70)***
Precio del combustible 1.12
(0.10)***
Carga -3,084,994.00
(725,679.80)***
Observations 90
R2 0.91
Adjusted R2 0.91
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Modelo aleatorio: método de Swamy-Arora

2.4.2 Método de Amemiya

c.amemiya.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
                   effect = "individual", model = "random", random.method = "amemiya")

stargazer(
  c.amemiya.1,
  dep.var.caption  = "Variable dependiente", dep.var.labels = "Costo",
  column.labels    = "Modelo aleatorio: Amemiya",
  covariate.labels = c("Intercepto","Ganancia","Precio del combustible","Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  omit.stat = c("f","ser"),
  title = "Modelo aleatorio: método de Amemiya",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Modelo aleatorio: método de Amemiya"),
  notes.append = TRUE
)
Modelo aleatorio: método de Amemiya
Variable dependiente
Costo
Modelo aleatorio: Amemiya
Intercepto 1,074,599.00
(421,049.70)*
Ganancia 3,209,017.00
(164,822.60)***
Precio del combustible 0.81
(0.10)***
Carga -3,716,771.00
(613,301.90)***
Observations 90
R2 0.93
Adjusted R2 0.92
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Modelo aleatorio: método de Amemiya

2.4.3 Método de Nerlove

c.nerlove.1 <- plm(formula = C ~ Q + PF + LF, data = base, index = c("I"),
                   effect = "individual", model = "random", random.method = "nerlove")

stargazer(
  c.nerlove.1,
  dep.var.caption  = "Variable dependiente", dep.var.labels = "Costo",
  column.labels    = "Modelo aleatorio: Nerlove",
  covariate.labels = c("Intercepto","Ganancia","Precio del combustible","Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  omit.stat = c("f","ser"),
  title = "Modelo aleatorio: método de Nerlove",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Modelo aleatorio: método de Nerlove"),
  notes.append = TRUE
)
Modelo aleatorio: método de Nerlove
Variable dependiente
Costo
Modelo aleatorio: Nerlove
Intercepto 1,075,158.00
(445,346.50)*
Ganancia 3,232,317.00
(165,207.50)***
Precio del combustible 0.80
(0.10)***
Carga -3,733,815.00
(609,630.60)***
Observations 90
R2 0.93
Adjusted R2 0.92
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Modelo aleatorio: método de Nerlove

2.5 Comparación de Modelos Aleatorios

stargazer(
  c.swar.1, c.amemiya.1, c.nerlove.1,
  dep.var.caption  = "Variable dependiente",
  dep.var.labels   = c("Costo","Costo","Costo"),
  column.labels    = c("Swamy-Arora","Amemiya","Nerlove"),
  covariate.labels = c("Intercepto","Ganancia","Precio del combustible","Carga"),
  dep.var.labels.include = TRUE, model.names = FALSE, model.numbers = TRUE,
  column.separate = c(1,1,1), omit.stat = c("f","ser"),
  title = "Comparación de modelos de efectos aleatorios",
  type = "html", float = TRUE, report = "vcs*", no.space = TRUE, header = FALSE,
  single.row = FALSE, font.size = "small", star.cutoffs = c(0.05, 0.01, 0.001),
  intercept.bottom = FALSE, digits = 2, t.auto = FALSE, p.auto = FALSE,
  notes.align = "r",
  notes = c("Fuente: Base de datos PANELDATA.CSV", "Comparación de modelos aleatorios"),
  notes.append = TRUE
)
Comparación de modelos de efectos aleatorios
Variable dependiente
Costo
Swamy-Arora Amemiya Nerlove
(1) (2) (3)
Intercepto 1,074,293.00 1,074,599.00 1,075,158.00
(377,468.00)** (421,049.70)* (445,346.50)*
Ganancia 2,288,588.00 3,209,017.00 3,232,317.00
(109,493.70)*** (164,822.60)*** (165,207.50)***
Precio del combustible 1.12 0.81 0.80
(0.10)*** (0.10)*** (0.10)***
Carga -3,084,994.00 -3,716,771.00 -3,733,815.00
(725,679.80)*** (613,301.90)*** (609,630.60)***
Observations 90 90 90
R2 0.91 0.93 0.93
Adjusted R2 0.91 0.92 0.92
Note: p<0.05; p<0.01; p<0.001
Fuente: Base de datos PANELDATA.CSV
Comparación de modelos aleatorios

Tanto el método de Amemiya como el de Nerlove presentan estándares de determinación semejantes, siendo los mejores modelos entre los aleatorios evaluados.


3 Pruebas de Efectos Individuales y de Tiempo

pbase.1 <- pdata.frame(x = base, index = c("I", "T"))

3.1 Prueba F — Ausencia de Efectos de Tiempo

c.within.t  <- plm(C ~ Q + PF + LF, data = base, index = c("I","T"),
                   effect = "individual", model = "within", random.method = "swar")
c.twoways.t <- plm(C ~ Q + PF + LF, data = base, index = c("I","T"),
                   effect = "twoways", model = "within", random.method = "swar")
pFtest(c.twoways.t, c.within.t)
## 
##  F test for twoways effects
## 
## data:  C ~ Q + PF + LF
## F = 0.39571, df1 = 14, df2 = 67, p-value = 0.9716
## alternative hypothesis: significant effects

La probabilidad está por encima del nivel de significancia: no existen efectos del tiempo sobre la variación de los costos operativos.

3.2 Prueba F — Ausencia de Efectos Individuales

c.pooling.2 <- plm(C ~ Q + PF + LF, data = base, index = c("I","T"),
                   effect = "individual", model = "pooling")
c.within.2  <- plm(C ~ Q + PF + LF, data = base, index = c("I","T"),
                   effect = "individual", model = "within", random.method = "swar")
pFtest(c.within.2, c.pooling.2)
## 
##  F test for individual effects
## 
## data:  C ~ Q + PF + LF
## F = 14.595, df1 = 5, df2 = 81, p-value = 3.467e-10
## alternative hypothesis: significant effects

Se confirma que los individuos (aerolíneas) varían de manera significativa y sus efectos no son iguales.

3.3 Prueba de Breusch-Pagan

plmtest(c.pooling.2)
## 
##  Lagrange Multiplier Test - (Honda)
## 
## data:  C ~ Q + PF + LF
## normal = 0.783, p-value = 0.2168
## alternative hypothesis: significant effects
plmtest(c.pooling.2, effect = "time")
## 
##  Lagrange Multiplier Test - time effects (Honda)
## 
## data:  C ~ Q + PF + LF
## normal = -1.5438, p-value = 0.9387
## alternative hypothesis: significant effects
plmtest(c.pooling.2, effect = "twoways")
## 
##  Lagrange Multiplier Test - two-ways effects (Honda)
## 
## data:  C ~ Q + PF + LF
## normal = -0.53794, p-value = 0.7047
## alternative hypothesis: significant effects

Se acepta la hipótesis nula de ausencia de efectos individuales, de tiempo, o de ambos.

3.4 Test de Hausman

c.within.h <- plm(C ~ Q + PF + LF, data = base, index = c("I","T"),
                  effect = "individual", model = "within", random.method = "swar")
c.random.h <- plm(C ~ Q + PF + LF, data = base, index = c("I","T"),
                  effect = "individual", model = "random", random.method = "swar")
phtest(c.within.h, c.random.h)
## 
##  Hausman Test
## 
## data:  C ~ Q + PF + LF
## chisq = 60.87, df = 3, p-value = 3.832e-13
## alternative hypothesis: one model is inconsistent

Existe correlación entre regresores y efectos individuales: el modelo aleatorio es inconsistente. Se favorece el uso del modelo Within.

3.5 Test de Chamberlain

pdim(base, index = "I")
## Balanced Panel: n = 6, T = 15, N = 90
aneweytest(formula = C ~ Q + PF + LF - 1, data = base, index = "I")
## 
##  Angrist and Newey's test of within model
## 
## data:  C ~ Q + PF + LF - 1
## chisq = -331.88, df = 418, p-value = 1
## alternative hypothesis: within specification does not apply
aneweytest(formula = log(C) ~ log(Q) + log(PF) + log(LF), data = base, index = "I")
## 
##  Angrist and Newey's test of within model
## 
## data:  log(C) ~ log(Q) + log(PF) + log(LF)
## chisq = -388.13, df = 627, p-value = 1
## alternative hypothesis: within specification does not apply

El test confirma que los regresores están correlacionados, lo que sugiere que un modelo GLS podría ofrecer mejores estimaciones.

3.6 Pruebas de Correlación Serial

pwtest(x = C ~ Q + PF + LF - 1, pbase)
## 
##  Wooldridge's test for unobserved individual effects
## 
## data:  formula
## z = 1.1139, p-value = 0.2653
## alternative hypothesis: unobserved effect
pwtest(x = C ~ Q + PF + LF, pbase)
## 
##  Wooldridge's test for unobserved individual effects
## 
## data:  formula
## z = 0.6142, p-value = 0.5391
## alternative hypothesis: unobserved effect
bsy.LM <- matrix(ncol = 3, nrow = 2)
tests  <- c("J","RE","AR")
dimnames(bsy.LM) <- list(c("LM Breusch-Godfrey","p-value"), tests)
for (i in tests) {
  mt <- pbsytest(x = C ~ Q + PF + LF, data = pbase, test = i)
  bsy.LM[1:2, i] <- c(mt$statistic, mt$p.value)
}
round(bsy.LM, 6)
##                           J        RE       AR
## LM Breusch-Godfrey 69.18072 -2.294700 68.56763
## p-value             0.00000  0.989125  0.00000
pbltest(x = C ~ Q + PF + LF, data = pbase, alternative = "onesided")
## 
##  Baltagi and Li one-sided LM test
## 
## data:  C ~ Q + PF + LF
## z = 6.9485, p-value = 1.846e-12
## alternative hypothesis: AR(1)/MA(1) errors in RE panel model

Se concluye que existen errores autorregresivos en el modelo, lo que refuerza la necesidad de usar matrices de covarianza robustas.

pwartest(x = C ~ Q + PF + LF, data = pbase)
## 
##  Wooldridge's test for serial correlation in FE panels
## 
## data:  plm.model
## F = 65.044, df1 = 1, df2 = 82, p-value = 5.194e-12
## alternative hypothesis: serial correlation
pcdtest(x = C ~ Q + PF + LF, data = pbase)
## 
##  Pesaran CD test for cross-sectional dependence in panels
## 
## data:  C ~ Q + PF + LF
## z = 3.8933, p-value = 9.889e-05
## alternative hypothesis: cross-sectional dependence

Se ratifica la presencia de correlación serial y dependencia transversal en el modelo.

3.7 Test de Hausman Robusto

phtest(x = C ~ Q + PF + LF, data = pbase.1, method = "aux")
## 
##  Regression-based Hausman test
## 
## data:  C ~ Q + PF + LF
## chisq = 49.62, df = 3, p-value = 9.627e-11
## alternative hypothesis: one model is inconsistent

Se rechaza la hipótesis nula: existen efectos aleatorios significativos.


4 Conclusión

El presente análisis econométrico de datos de panel, basado en la base PANELDATA.CSV con 90 observaciones correspondientes a seis aerolíneas en el período 1970–1984, ha permitido explorar de manera sistemática los costos operativos del sector mediante la aplicación de modelos de efectos fijos y aleatorios.

Los resultados evidencian que los efectos individuales —asociados al tipo de aerolínea— ejercen una influencia determinante sobre la variación de los costos operativos, mientras que los efectos temporales no resultan estadísticamente significativos. Esta conclusión se sustenta en las pruebas de hipótesis aplicadas (prueba F, Breusch-Pagan, Hausman).

El modelo Between con \(R^2_{adj} = 0.99\) presenta el mejor ajuste, aunque debe interpretarse con precaución por su limitado número de observaciones efectivas. Los modelos de efectos aleatorios (Swamy-Arora, Amemiya, Nerlove) ofrecen estimaciones robustas y comparables.

Recomendación: Aplicar criterios de selección rigurosos (AIC, BIC, validación cruzada) y corregir heterocedasticidad y autocorrelación mediante matrices de covarianza robustas (White, Newey-West, Driscoll-Kraay).


Esta investigación fue desarrollada y publicada con el apoyo de Econometrics, empresa dedicada al análisis de datos, modelado econométrico y difusión del conocimiento cuantitativo en el ámbito hispanohablante.

Dilan Alexander Manosalvas Andrade — Universidad de las Fuerzas Armadas ESPE — Agosto 2022