En el análisis econométrico es común encontrar bases de datos que están segmentadas temporalmente, aunque no todas se analizan de igual forma. Por ejemplo, cuando tenemos series de tiempo las diferentes variables (dependiente e independientes) se observan durante varios años, meses o días. Por ejemplo, si analizo el efecto del empleo sobre la inflación, tendré que \(y_t\) es la tasa de desempleo, y \(x_t\) el índice de precios al consumo. Como vemos, no diferenciamos por unidad \(i\), sino que el tiempo es nuestro único elemento de identificación. En este caso, procedemos con una regresión como las observadas en los apartados anteriores.
En los datos de corte transversal, se recopilan valores de una o más variables desde una perspectiva identitaria (país, región, persona identificada, marca,…), y de nuevo se puede realizar un ejercicio de inferencia como los analizados anteriormente. En este caso, se identifican las variables como \(y_i\) y \(x_i\).
Por último, nos encontramos con los datos de panel, que es una fusión entre los dos tipos de datos anteriores, mezclando la segmentación temporal con la identitaria. Siguiendo el primer ejemplo, podríamos obtener el efecto que ha producido el empleo sobre la inflación en todos los países de Europa (identidad) en la última década (tiempo). De esta forma, tendríamos formalmente nuestras variables como \(y_{it}\) y \(x_{it}\). Es cierto que con estos datos también podemos hacer regresiones como las vistas anteriormente (es lo que se conoce como pooled), pero estos datos nos permiten hacer análisis más completos, en los que tengamos en cuenta el efecto del tiempo, y podamos aislar posibles perturbaciones que nada tienen que ver con las variables elegidas, sino con factores ajenos como las crisis económicas, o un shock externo ocurrido en un momento puntual.
Los datos de panel también se conocen como datos agrupados, datos longitudinales, o de micropanel, entre otros. Es cierto que estos nombres no se refieren exactamente a lo mismo, pero todas vienen a reflejar una misma realidad: variables de corte transversal a lo largo del tiempo.
Regresar datos de panel, es decir, teniendo en cuenta la identidad y el tiempo, presenta distintas ventajas respecto a hacerlo de forma transversal. La primera ventaja es que la regresión con datos de panel tiene en cuenta la heterogeneidad de la varianza (heteroscedasticidad), mientras que de otra forma sería imposible controlarla.
En estadística se denomina heteroscedasticidad a la situación en la que la variación de la perturbación aleatoria (error) no es constante. Dicho de otra forma: es la ausencia de homocedasticidad, un elemento clave sin el cual podemos incluso invalidar la significatividad de nuestras pruebas estadísticas realizadas con MCO (aunque existen alternativas, como los Mínimos Cuadrados Generalizados). Para poner un ejemplo y visualizar por qué la regresión con datos de panel es cuanto menos interesante, imaginemos que queremos evaluar la productividad de nuestros trabajadores en base a la edad, y observamos que según van teniendo más edad, los márgenes de productividad aumentan, al ritmo que los errores de predicción decrecen:
x <- c(10, 16, 11, 18, 16, 19, 14, 12, 14, 23, 14, 18, 24, 27, 21, 27, 31, 31, 30, 32, 37, 34, 36, 37, 36, 38, 38, 39, 39, 40)
y <- c(20, 20, 21, 22, 23, 22, 20, 23, 22, 25, 27, 27, 31, 28, 28, 32, 29.5, 33, 33, 34, 36, 33, 35, 37, 37, 37, 36, 37, 38, 39)
df1 <- data.frame(x, y)
plot(x, y,
main = "Figura 1. Diagrama de dispersión",
xlab = "x", ylab = "y")
abline(lm(y~x), col = "red")
Como vemos, la elasticidad de nuestra variable dependiente (productividad) va decreciendo según se incrementa la edad de los trabajadores. ¿Por qué puede ocurrir esto? Imaginemos que en la empresa existe una política de formación: se contrata a trabajadores jóvenes y se les enseña a manejarse con las herramientas con las que se trabaja. Es normal que nada más aterrizar en el puesto de trabajo, haya una dispersión en la productividad: algunos ya vienen con habilidades aprendidas, otros son capaces de comprender antes que el resto cómo funcionan las herramientas…
Con el paso del tiempo, todos los trabajadores llegarán a comprender a usar los instrumentos, y a trabajar en equipo, y la productividad se equipara. Por tanto, corregir la heteroscedasticidad es tan sencillo como tener en cuenta el año de entrada en la empresa.
Pero esta no es la única ventaja. Por ejemplo, al trabajar con un mayor número de unidades (identidad multiplicada por tiempor), aumentamos los grados de libertad para trabajar con más variables explicativas, se reduce la colinealidad en el modelo, y, al elevar \(n\) se reduce el término de error y por tanto se incrementa la capacidad explicativa de las variables. La regresión con datos de panel permite, en definitiva, un análisis más complejo, más robusto y con más posibilidades que con un ejercicio de corte transversal.
Imaginemos que tenemos tres países, España, Francia y Portugal, para los que queremos saber el efecto del desempleo sobre el aumento del precio de la energía durante los años de la última crisis económica. Además, vamos a incluir la producción de petróleo como variable de control. Formalmente, escribimos esta ecuación como:
\[Precio\ de\ la\ energía_{it}\ = \beta_0+\beta_1Desempleo_{it}+\beta_2Prod.ener_{it}+e_{it}\\ i = 1,2,...,n\\ t=1,2,...m\]
Creamos una base de datos inventada:
df <- data.frame(Pais = c('ES','ES','ES','ES','ES','ES','FR','FR','FR','FR','FR','FR','PT','PT','PT','PT','PT','PT'),
Year = c(08,09,10,11,12,13,08,09,10,11,12,13,08,09,10,11,12,13),
energia = c(0.4,0.2,0.3,0.1,0.7,0.9,
2.7,2.6,2.3,2.1,2.8,3.1,
4.6,4.6,4.3,4.3,4.9,4.3),
desempleo = c(19,20,20,19,18,18,
8.9,9.0,9.4,9.1,8.9,8.4,
2,2.2,3,2.9,2.2,2),
prod = c(91,95,94,96,88,88,91,95,94,96,88,88,91,95,94,96,88,88))
plot(df$energia, df$desempleo)
plot(df$energia, df$prod)
Para visualizar esta base de datos y tener una mejor información estadística de cada país, recurrimos al siguiente comando:
coplot(energia ~ Year|Pais, type = "l", data = df)
Aquí podemos ver cómo se comporta la inflación de la energía en base a los años, y podríamos hacer lo mismo con el desempleo, nuestra variable independiente:
coplot(desempleo ~ Year|Pais, type = "l", data = df)
Vamos a realizar a continuación los diferentes contrasates posibles.
En los modelos de regresión agrupados metemos toda la información en un mismo saco, sin tener en consideración las categorías por individuos ni temporales. Al no haber distinción entre individuos, los consideramos a todos como iguales, siendo unos tan buenos como los otros, algo difícil de sostener en la vida real: unos estudiantes son más inteligentes que otros, unos países parten de una base de innovación más elevada que otros, unas personas han tenido mejores hábitos de salud que otros…
Uno de los problemas que plantean este tipo de pruebas es la posible existencia de autocorrelación o correlación espacial de los datos. O dicho de otra forma, las unidades vecinas muestran valores próximos entre sí. La existencia de autocorrelación puede ser tenida en cuenta en el análisis, y se identifica con el test Durbin-Watson, que veremos más adelante.
reg_po=(lm(energia~desempleo+prod, data = df))
summary(reg_po)
##
## Call:
## lm(formula = energia ~ desempleo + prod, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.50398 -0.13376 0.01231 0.18278 0.32319
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.447639 1.652266 5.113 0.000127 ***
## desempleo -0.241932 0.008429 -28.702 1.6e-14 ***
## prod -0.037938 0.017977 -2.110 0.052030 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2448 on 15 degrees of freedom
## Multiple R-squared: 0.9824, Adjusted R-squared: 0.9801
## F-statistic: 418.9 on 2 and 15 DF, p-value: 6.908e-14
Con el test Durbin Watson estudiaremos la autocorrelación o correlación espacial de los datos. Concretamente:
\[H_0: Inexistencia\ de\ correlación\ de\ los\ residuos\\ H_1: Existe\ correlación\ de\ los\ residuos\]
library(car)
## Warning: package 'car' was built under R version 4.1.2
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.1.2
durbinWatsonTest(reg_po)
## lag Autocorrelation D-W Statistic p-value
## 1 0.3506729 1.180985 0.024
## Alternative hypothesis: rho != 0
Como vemos, con iun p-valor inferior a 0.05 observamos que existe algún tipo de correlación (o que nuestro modelo no está bien especificado, aunque no es el caso). Esto nos lleva a plantear otras formas de abordar el ejercicio.
El modelo de regresión de efectos fijos tiene en cuenta la posible heterogeneidad que existe entre los sujetos, o lo que es lo mismo, que asumiendo que los efectos de los estimadores \(\beta\) son similares para el grupo de individuos, cada individuo tendrá un intercepto diferente. De esta forma:
\[Precio\ de\ la\ energía_{it}\ = \beta_{0i}+\beta_{1i}Desempleo_{it}+\beta_{2i}Prod.ener_{it}+e_{it}\]
Vemos ahora que los valores de los estimadores varían según el individuo (\(\beta_{ji}\)), pero no lo hacen con el tiempo. Es por eso que se llaman de “efectos fijos”, porque permanecen estables durante todos los años observados en la muestra.
Para resolver este ejercicio el modelo se construye incluyendo una variable dicotómica por cada individuo existente (dejando fuera una de las opciones). De esta forma, nuestro modelo se especifica como:
\[Precio\ de\ la\ energía_{it}\ = \alpha_{0}+\alpha_{1}FRA_{i}+\alpha_{2}POR_{i}+\beta_{1i}Desempleo_{it}+\beta_{2i}Prod.ener_{it}+e_{it}\] siendo las variables POR y FRA dos nuevos elementos que indican si el individuo “i” pertenece a la muestra de valores de Portugal, o a Francia, respectivamente. Son variables dicotómicas, por tanto tomarán valores 1 y 0 según se cumpla o no el criterio establecido. De esta forma, el valor \(\alpha_0\) sería el valor del intercepto de la variable que no se recoge (España), y los demás coeficientes representan el grado en que los valores de los interceptos de los demás países se diferencian del valor de España. Es decir, \(\alpha_1\) indica cuánto difere de \(\alpha_0\) el valor del intercepto de Francia. O dicho de otra forma, el valor del intercepto de Francia será la suma de \(\alpha_0 + \alpha_1\). Y el valor del intercepto de Portugal será la suma \(\alpha_0 + \alpha_2\).
Pero también podemos obtener directamente el valor del intercepto de España eliminando el intercepto común \(\alpha_0\). Procedemos con el ejercicio:
summary(lm(energia~desempleo + prod + factor(Pais) - 1, data = df))
##
## Call:
## lm(formula = energia ~ desempleo + prod + factor(Pais) - 1, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.45571 -0.08094 0.02032 0.12289 0.23039
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## desempleo -0.13039 0.11967 -1.090 0.295690
## prod -0.05143 0.02066 -2.489 0.027122 *
## factor(Pais)ES 7.64242 1.65311 4.623 0.000477 ***
## factor(Pais)FR 8.49867 1.38330 6.144 3.52e-05 ***
## factor(Pais)PT 9.54244 1.71491 5.564 9.16e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.201 on 13 degrees of freedom
## Multiple R-squared: 0.9968, Adjusted R-squared: 0.9956
## F-statistic: 812.1 on 5 and 13 DF, p-value: 9.635e-16
Como vemos, en este caso no tenemos el valor del intercepto, sino de cada variable dicotómica por separado. Otra forma de realizar este ejercicio es mediante el siguiente comando, en el que como veremos se omiten las variables dicotómicas:
#install.packages("plm")
library(plm)
## Warning: package 'plm' was built under R version 4.1.2
reg_fe=(plm(energia ~ desempleo+prod, index=c("Pais", "Year"), data = df, model = "within"))
summary(reg_fe)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = energia ~ desempleo + prod, data = df, model = "within",
## index = c("Pais", "Year"))
##
## Balanced Panel: n = 3, T = 6, N = 18
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -0.455708 -0.080936 0.020318 0.122893 0.230389
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## desempleo -0.130390 0.119672 -1.0896 0.29569
## prod -0.051431 0.020660 -2.4895 0.02712 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 1.4133
## Residual Sum of Squares: 0.52531
## R-Squared: 0.62832
## Adj. R-Squared: 0.51396
## F-statistic: 10.9881 on 2 and 13 DF, p-value: 0.0016073
Es importante advertir a la hora de trabajar con modelos de efectos fijos de que la existencia de variables incómodas pueden suponer problemas de especificación. Una variable incómoda es un factor que no cambia con el tiempo (sexo, nacionalidad, estado civil, ubicación,…) pero que afecta a la variable dependiente en un grado alto. Los modelos de datos de panel como el de efectos fijos no suelen identificar el impacto ocasionado por estas variables que se mantienen no cambiantes.
NOTA: Este mismo experimento puede hacerse tomando como dicotómicas los años, y no las identidades de la muestra. Sin embargo, esta forma no suele tener tanta relevancia como la anterior observada.
summary(lm(energia~desempleo + prod + factor(Year), data = df))
##
## Call:
## lm(formula = energia ~ desempleo + prod + factor(Year), data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.36528 -0.17650 0.04466 0.13886 0.33361
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.374332 6.430665 1.147 0.276
## desempleo -0.242116 0.009094 -26.623 2.44e-11 ***
## prod -0.026314 0.071855 -0.366 0.721
## factor(Year)9 0.110173 0.436985 0.252 0.806
## factor(Year)10 0.014039 0.373299 0.038 0.971
## factor(Year)11 -0.179654 0.502891 -0.357 0.728
## factor(Year)12 0.089827 0.215527 0.417 0.685
## factor(Year)13 NA NA NA NA
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.264 on 11 degrees of freedom
## Multiple R-squared: 0.985, Adjusted R-squared: 0.9768
## F-statistic: 120.4 on 6 and 11 DF, p-value: 2.209e-09
Uno de los problemas de los métodos de efectos aleatorios es que tenemos que incluir nuevas variables dicotómicas sobre nuestro modelo, lo que incide en los grados de libertad. Pero esta inclusión de dicotómicas es asumir nuestra ignorancia: como no podemos predecir un modelo para el conjunto de países, debemos de analizar cada uno por separado.
La propuesta de los modelos de efectos aleatorios es que, si las dicotómicas reflejan nuestra falta de conocimiento, agrupemos toda esta ignorancia en un único término de perturbación. Así pues, tenemos que:
\[Precio\ de\ la\ energía_{it}\ = \beta_{0i}+\beta_{1}Desempleo_{it}+\beta_{2}Prod.ener_{it}+u_{it}\\ \beta_{0}=\beta_{0i}+e_{it};\ w_{it}=e_{it}+u_{it}\\ Precio\ de\ la\ energía_{it}\ = \beta_{0}+\beta_{1}Desempleo_{it}+\beta_{2}Prod.ener_{it}+w_{it}\]
Para llevar a cabo la regresión de este modelo utilizamos el siguiente comando:
reg_re = (plm(energia ~ desempleo + prod, index=c("Pais", "Year"), data = df, model = "random"))
summary (reg_re)
## Oneway (individual) effect Random Effect Model
## (Swamy-Arora's transformation)
##
## Call:
## plm(formula = energia ~ desempleo + prod, data = df, model = "random",
## index = c("Pais", "Year"))
##
## Balanced Panel: n = 3, T = 6, N = 18
##
## Effects:
## var std.dev share
## idiosyncratic 0.04041 0.20102 0.449
## individual 0.04964 0.22280 0.551
## theta: 0.6544
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -0.396361 -0.095234 0.039944 0.134462 0.251489
##
## Coefficients:
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept) 8.450372 1.356281 6.2305 4.648e-10 ***
## desempleo -0.239247 0.019686 -12.1532 < 2.2e-16 ***
## prod -0.038263 0.014858 -2.5753 0.01002 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 7.349
## Residual Sum of Squares: 0.60009
## R-Squared: 0.91834
## Adj. R-Squared: 0.90746
## Chisq: 168.698 on 2 DF, p-value: < 2.22e-16
Para saber cuál de los modelos presentados es el más apropiado, existen diferentes pruebas que merece la pena conocer. En primer lugar, nos surge la pregunta: ¿es necesario realizar un modelo de efectos fijos frente al MCO? Recordemos que el modelo de efectos fijos puede resolverse con la inclusión de variables dummy que identifiquen las unidades. Para ello usamos el test F de Fisher, cuyas hipótesis son las siguientes:
\[H_0:\ Es\ preferible\ usar\ un\ modelo\ MCO\\ H_0:\ Es\ preferible\ usar\ un\ modelo\ EF\]
Esta prueba se resuelve a partir del cálculo de la heteroscedasticidad de las varianza (Explicar). Lo resolvemos de la siguiente forma:
pFtest(reg_fe, reg_po)
##
## F test for individual effects
##
## data: energia ~ desempleo + prod
## F = 4.621, df1 = 2, df2 = 13, p-value = 0.03048
## alternative hypothesis: significant effects
En nuestro caso, y con un p-valor menor a 0.05, es evidente que podemos rechazar la hipótesis nula, y por tanto, entre ambos modelos, nos quedamos con el de efectos aleatorios.
Ahora, comparamos si es más consistente el de efectos fijos o el de efectos aleatorios mediante el test de Haussman. En este test, tenemos que:
\[H_0:\ Es\ preferible\ usar\ un\ modelo\ EA\\ H_0:\ Es\ preferible\ usar\ un\ modelo\ EF\]
Se hace de la siguiente forma:
phtest(reg_re, reg_fe)
##
## Hausman Test
##
## data: energia ~ desempleo + prod
## chisq = 0.85045, df = 2, p-value = 0.6536
## alternative hypothesis: one model is inconsistent
de nuevo, con el p-valor encontrado, podemos confirmar que el modelo de efectos fijos es más consistente que el de efectos aleatorios.
Finalmente, y aunque aquí no aporta mucho valor, podemos llevar a cabo el test de Lagrange,con el que contrastamos si el modelo agrupado o pooled (hipótesis nula) es preferible al de efectos aleatorios (hipótesis alternativa).
\[H_0:\ Es\ preferible\ usar\ un\ modelo\ MCO\\ H_0:\ Es\ preferible\ usar\ un\ modelo\ EA\]
plmtest(reg_re, type=c("bp"))
##
## Lagrange Multiplier Test - (Breusch-Pagan)
##
## data: energia ~ desempleo + prod
## chisq = 2.8522, df = 1, p-value = 0.09125
## alternative hypothesis: significant effects
Con un p-valor superior a 0.05, no podemos rechazar la hipótesis nula, así que el modelo agrupado es preferible al de efectos aleatorios.