Introducción

Las bases de datos en panel son bases en las que podemos observar el comportamiento de un grupo de entidades en el tiempo. Estas entidades pueden ser empresas, estados, países o individuos. Una base de datos en panel luce así:

data.frame(Pais = c(1,1,1,2,2,2), Anio = c(2001,2002,2003,2001,2002,2003), Y = rnorm(6), X1 = runif(6), X2 = floor(runif(6,0,100)))
##   Pais Anio          Y        X1 X2
## 1    1 2001 -0.2366455 0.6200135 79
## 2    1 2002 -2.9091591 0.2168213 28
## 3    1 2003  0.4711550 0.3318029 93
## 4    2 2001  0.2660643 0.4526049 29
## 5    2 2002 -1.8652359 0.5086563 64
## 6    2 2003 -1.3209354 0.2399477 56

Para el trabajo con bases de datos en panel, tanto con efectos fijos como con efectos aleatorios, haremos uso del paquete plm(Croissant y Milo, 2008), que contiene funciones y métodos de ajuste relevantes al análisis de este tipo de información. Para instalar el paquete, y cargarlo en el sistema, ejecute las siguientes líneas de código:

if(!require('plm')){
    install.packages("plm")
    library(somepackage)
}

Para ilustrar los métodos de efectos fijos y efectos aleatorios, se usa la información del repositorio del Data and Statistical Services de Princeton y se pueden descargar en el siguiente enlace. Estos datos estan en formato *.dta (stata), por lo que, para cargarlo en R, debemos usar la biblioteca foreign.

if(!require('foreign')){
    install.packages("foreign")
}
library("foreign")
Panel <- read.dta("\Direccion\del\archivo.dta") 

Visualizar este tipo de información es relativamente sencillo. En las siguientes líneas de código, cargaremos la base de datos y haremos una visualización con el uso de la función coplot().

coplot(y ~ year|country, type = "l", data = Panel)

También es posible realizar un gráfico conjunto de todas las líneas de tiempo. Esto nos permite comparar de una manera mas cómoda la evolución de las diferentes entidades:

library(car) # Companion to Applied Regression: Contiene una version ampliada del diagrama de dispersion
scatterplot(y ~ year|country, boxplots = FALSE, reg.line = FALSE,data = Panel)

Modelo de panel lineal

El modelo básico lineal que se usa en econometría se describe con el siguiente modelo general bajo las restricciones apropiadas: \[ y_{it} = \alpha_{it}+\beta_{it}^\intercal x_{it}+\varepsilon_{it}, \] donde \(i=1,2,\dots,n\) es el indicador del individuo, \(t = 1,2,\dots,T\) es el indicador del tiempo y \(\varepsilon_{it}\sim\mathcal{N}(0,\sigma^2)\)

Modelo de Efectos Fijos

El siguiente código nos ayuda a graficar un intervado de 95% de confianza alrededor de las medias para observar la heterogeneidad entre los países. Es decir, que tan distintos son entre sí.

library(gplots)
plotmeans(y ~ country, main = "Heterogeneidad entre paises", data = Panel)

O bien, podemos observar también la heterogeneidad del conjunto de países a través de los años.

plotmeans(y ~year, main = "Heterogeneidad a traves del tiempo", data = Panel)

Veamos que sucede si intentamos realizar una regresión por MCO. Siempre es buena idea intentar usar las herramientas básicas antes de las más complicadas, tanto para practicar un poco más como para poder aprender a realizar un buen comparativo. En este caso, la heterogeneidad entre países y en el tiempo debe tomarse en consideración por el modelo.

mco <- lm(y ~ x1, data = Panel)
summary(mco)
## 
## Call:
## lm(formula = y ~ x1, data = Panel)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -9.546e+09 -1.578e+09  1.554e+08  1.422e+09  7.183e+09 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 1.524e+09  6.211e+08   2.454   0.0167 *
## x1          4.950e+08  7.789e+08   0.636   0.5272  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.028e+09 on 68 degrees of freedom
## Multiple R-squared:  0.005905,   Adjusted R-squared:  -0.008714 
## F-statistic: 0.4039 on 1 and 68 DF,  p-value: 0.5272

Note que el valor p es extremadamente alto. Esto se puede deber a que el modelo por mínimos cuadrados interpreta la heterogeneidad entre los países y en el tiempo como ruido en el modelo. En otras palabras, si los países fueran todos iguales y/o, las variables no evolucionaran en el tiempo, entonces el modelo de mínimos cuadrados ordinarios podría ser suficiente para lograr explicar el modelo. Guardemos los valores ajustados y observemos la regresión por MCO.

yhat <- mco$fitted.values
plot(Panel$x1, Panel$y, pch = 16, xlab = "x1", ylab = "y")
abline(mco, col = "red", lwd = 3)

#### Modelo de Efectos Fijos con variable Dummy El siguiente modelo controla la regresión tomando en consideración la heterogeneidad entre países. El siguiente trabaja el modelo como si, en efecto, se creara una columna con una variable dummy (dicotómica, o de ceros y unos) para cada uno de los países. Esta variable tiene un valor de 1 para cada dato que coincide con el país de la variable Dummy y un cero para el resto. Note que, controlando a los países, la variable x1 se vuelve significativa.

fixed.dum <- lm(y ~ x1 + factor(country) - 1 , data = Panel)
summary(fixed.dum)
## 
## Call:
## lm(formula = y ~ x1 + factor(country) - 1, data = Panel)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -8.634e+09 -9.697e+08  5.405e+08  1.386e+09  5.612e+09 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## x1                2.476e+09  1.107e+09   2.237  0.02889 *  
## factor(country)A  8.805e+08  9.618e+08   0.916  0.36347    
## factor(country)B -1.058e+09  1.051e+09  -1.006  0.31811    
## factor(country)C -1.723e+09  1.632e+09  -1.056  0.29508    
## factor(country)D  3.163e+09  9.095e+08   3.478  0.00093 ***
## factor(country)E -6.026e+08  1.064e+09  -0.566  0.57329    
## factor(country)F  2.011e+09  1.123e+09   1.791  0.07821 .  
## factor(country)G -9.847e+08  1.493e+09  -0.660  0.51190    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.796e+09 on 62 degrees of freedom
## Multiple R-squared:  0.4402, Adjusted R-squared:  0.368 
## F-statistic: 6.095 on 8 and 62 DF,  p-value: 8.892e-06
yhat <- fixed.dum$fitted
scatterplot(yhat~Panel$x1|Panel$country, boxplots=FALSE, xlab="x1", ylab="yhat",smooth=FALSE)
abline(lm(Panel$y~Panel$x1),lwd=3, col="red")

Referencias