El objetivo del presente documento es el de crear un breve informe con RStudio mediante el análisis numérico de un conjunto de datos de panel usando RStudio.

Tras abrir RStudio vamos a crear una carpeta y establecerla como el directorio de trabajo (Session -> Set Working Directory -> Choose Directoy), abrimos un nuevo proyecto de R Markdown (muy interesante consultar su ayuda: Help -> Markdown Quick Reference). Seleccionaremos que genere un word y en las opciones, dentro de Advanced, especificamos que no se elimine el fichero .tex.

Importación de datos

El primer paso será incorporar la información a tratar. En prácticas anteriores hemos visto como importar datos desde un archivo externo. En este caso usaremos un conjunto de datos existente en el paque ECdat que tiene información sobre consumo de cigarros:

  # install.packages("Ecdat") # instalamos el paquete (sólo una vez)
  library(Ecdat) # cargamos el paquete
## Loading required package: Ecfun
## 
## Attaching package: 'Ecfun'
## The following object is masked from 'package:base':
## 
##     sign
## 
## Attaching package: 'Ecdat'
## The following object is masked from 'package:datasets':
## 
##     Orange
  head(Cigar) # un vistazo a los datos
##   state year price  pop  pop16  cpi      ndi sales pimin
## 1     1   63  28.6 3383 2236.5 30.6 1558.305  93.9  26.1
## 2     1   64  29.8 3431 2276.7 31.0 1684.073  95.4  27.5
## 3     1   65  29.8 3486 2327.5 31.5 1809.842  98.5  28.9
## 4     1   66  31.5 3524 2369.7 32.4 1915.160  96.4  29.5
## 5     1   67  31.6 3533 2393.7 33.4 2023.546  95.5  29.6
## 6     1   68  35.6 3522 2405.2 34.8 2202.486  88.4  32.0
  attach(Cigar) # incorporamos los datos a R para referenciar cada variable por el nombre anterior
  # state = identificador del estado
  # year = año
  # price = precio del paquete de cigarros
  # pop = población
  # pop16 = población con más de 16 años
  # cpi = índice de precios del consumo (1983=100)
  # ndi = ingreso disponible per cápita
  # sales = venta de cigarrillos en paquetes per capita
  # pimin = precio mínimo en estados adyacentes por paquete de cigarrillos

Para más detalles consultar help(Cigar).

A continuación vamos a analizar el modelo que estudia las ventas del paquete de cigarrillos (sales) en función de su precio (price), de la población con más de 16 años (pop16) y el ingreso disponible per cápita (ndi). Puesto que se disponen de datos de panel con 46 individuos (estados) y 30 periodos (años):

  dim(table(state,year))
## [1] 46 30

En primer lugar, se ignorará la estructura de datos de panel, para a continuación considerar una estructura de efectos fijos y aleatorios. Finalmente, se seleccionará (e interpretará) el modelo más adecuado.

Regresión lineal múltiple

Como se ha comentado, el primer enfoque consiste en ignorar la naturaleza de los datos (modelo agrupado o pooled) y estimarlos por Mínimos Cuadrados Ordinarios. En este caso, se considera que el término independiente es el mismo para todos los periodos y/o tiempos:

  reg.mco = lm(sales~price+pop16+ndi)
  summary(reg.mco)
## 
## Call:
## lm(formula = sales ~ price + pop16 + ndi)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -65.226 -15.217  -1.777   9.099 161.314 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  1.415e+02  1.500e+00  94.295  < 2e-16 ***
## price       -9.830e-01  5.368e-02 -18.311  < 2e-16 ***
## pop16       -1.212e-03  2.076e-04  -5.839 6.55e-09 ***
## ndi          7.188e-03  4.793e-04  14.998  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 27.26 on 1376 degrees of freedom
## Multiple R-squared:  0.2279, Adjusted R-squared:  0.2263 
## F-statistic: 135.4 on 3 and 1376 DF,  p-value: < 2.2e-16

Se observa que todos los coeficientes son significativamente distintos de cero (p-valores menores que 0.05, 2·10^(-16), 0.00000000655 y 2·10^(-16), respectivamente). Puesto que las estimaciones de los coeficientes del precio del paquete de tabaco y población mayor a los 16 años son negativas, cuando estas variables aumentan disminuye la venta de los paquetes de cigarrillos (quizás esta segunda interpretación no tenga mucho sentido). Por otro lado, puesto que la estimación de los ingresos per cápita es positiva, cuando ésta variable aumenta también lo hacen las ventas de los paquetes de cigarrillos. Finalmente, puesto que el p-valor asociado al contraste de significación conjunta es menor que 0.05, 2.2·10^(-16), se tiene que el modelo es válido conjuntamente.

Regresión con efectos fijos

Si se considera que el término indpendiente puede ser distinto para cada individuo y/o periodo debe considerarse un enfoque de efectos fijos. Así, la estimación intra grupos (o within) puede realizarse mediante el uso de variables binarias que recojan el efecto temporal o transversal:

  reg.fijos.ind = lm(sales~price+pop16+ndi+factor(state))
  summary(reg.fijos.ind)
## 
## Call:
## lm(formula = sales ~ price + pop16 + ndi + factor(state))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -73.219  -6.578   0.669   6.925 125.097 
## 
## Coefficients:
##                   Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      1.211e+02  3.195e+00  37.911  < 2e-16 ***
## price           -4.059e-01  3.761e-02 -10.792  < 2e-16 ***
## pop16            1.448e-03  6.431e-04   2.251 0.024518 *  
## ndi              1.703e-03  3.494e-04   4.875 1.22e-06 ***
## factor(state)3   4.616e+00  3.951e+00   1.168 0.242979    
## factor(state)4   9.850e+00  3.936e+00   2.503 0.012450 *  
## factor(state)5  -1.775e+01  9.969e+00  -1.780 0.075253 .  
## factor(state)7   7.940e+00  4.055e+00   1.958 0.050439 .  
## factor(state)8   4.378e+01  4.231e+00  10.347  < 2e-16 ***
## factor(state)9   5.317e+01  4.444e+00  11.963  < 2e-16 ***
## factor(state)10  1.208e+01  4.760e+00   2.537 0.011284 *  
## factor(state)11  7.650e+00  3.937e+00   1.943 0.052214 .  
## factor(state)13 -1.739e+00  4.132e+00  -0.421 0.673880    
## factor(state)14  6.576e+00  5.197e+00   1.265 0.206021    
## factor(state)15  2.794e+01  3.974e+00   7.031 3.26e-12 ***
## factor(state)16  3.695e+00  3.917e+00   0.943 0.345729    
## factor(state)17  3.167e+00  3.996e+00   0.792 0.428235    
## factor(state)18  6.646e+01  3.922e+00  16.945  < 2e-16 ***
## factor(state)19  1.600e+01  3.870e+00   4.135 3.77e-05 ***
## factor(state)20  2.826e+01  4.092e+00   6.907 7.63e-12 ***
## factor(state)21  9.873e+00  4.013e+00   2.460 0.014006 *  
## factor(state)22  7.416e+00  4.025e+00   1.842 0.065636 .  
## factor(state)23  1.400e+01  4.525e+00   3.095 0.002008 ** 
## factor(state)24  5.173e-01  3.880e+00   0.133 0.893955    
## factor(state)25  2.864e+00  3.920e+00   0.731 0.465125    
## factor(state)26  1.911e+01  3.950e+00   4.839 1.45e-06 ***
## factor(state)27  4.732e+00  4.154e+00   1.139 0.254811    
## factor(state)28  8.738e-02  4.058e+00   0.022 0.982824    
## factor(state)29  6.655e+01  4.254e+00  15.646  < 2e-16 ***
## factor(state)30  1.255e+02  4.318e+00  29.076  < 2e-16 ***
## factor(state)31  4.864e+00  4.299e+00   1.131 0.258080    
## factor(state)32 -1.334e+01  4.057e+00  -3.287 0.001039 ** 
## factor(state)33 -5.864e+00  7.781e+00  -0.754 0.451155    
## factor(state)35 -1.423e+00  4.169e+00  -0.341 0.732837    
## factor(state)36  7.595e+00  5.025e+00   1.512 0.130872    
## factor(state)37  1.292e+01  3.895e+00   3.317 0.000936 ***
## factor(state)39 -4.095e+00  5.492e+00  -0.746 0.456091    
## factor(state)40  2.873e+01  4.155e+00   6.915 7.24e-12 ***
## factor(state)41  9.014e+00  3.906e+00   2.308 0.021159 *  
## factor(state)42 -2.570e+00  4.153e+00  -0.619 0.536016    
## factor(state)43  8.764e+00  3.888e+00   2.254 0.024347 *  
## factor(state)44 -6.763e+00  5.920e+00  -1.142 0.253500    
## factor(state)45 -3.747e+01  4.055e+00  -9.240  < 2e-16 ***
## factor(state)46  3.423e+01  4.222e+00   8.107 1.16e-15 ***
## factor(state)47  1.750e+01  4.041e+00   4.331 1.59e-05 ***
## factor(state)48 -1.191e+01  3.890e+00  -3.061 0.002253 ** 
## factor(state)49  9.481e+00  3.964e+00   2.392 0.016899 *  
## factor(state)50 -7.961e-01  3.895e+00  -0.204 0.838059    
## factor(state)51  2.732e+01  4.290e+00   6.369 2.62e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 14.98 on 1331 degrees of freedom
## Multiple R-squared:  0.7744, Adjusted R-squared:  0.7663 
## F-statistic:  95.2 on 48 and 1331 DF,  p-value: < 2.2e-16
  reg.fijos.peri = lm(sales~price+pop16+ndi+factor(year))
  summary(reg.fijos.peri)
## 
## Call:
## lm(formula = sales ~ price + pop16 + ndi + factor(year))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -67.925 -14.579  -2.866   9.215 160.510 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     1.637e+02  4.870e+00  33.621  < 2e-16 ***
## price          -1.765e+00  1.138e-01 -15.511  < 2e-16 ***
## pop16          -8.771e-04  2.093e-04  -4.190 2.97e-05 ***
## ndi             6.523e-03  5.830e-04  11.188  < 2e-16 ***
## factor(year)64 -2.963e+00  5.574e+00  -0.532 0.595096    
## factor(year)65 -1.745e+00  5.575e+00  -0.313 0.754272    
## factor(year)66  6.161e-01  5.582e+00   0.110 0.912126    
## factor(year)67  1.112e+00  5.588e+00   0.199 0.842240    
## factor(year)68  1.623e+00  5.607e+00   0.290 0.772235    
## factor(year)69  1.089e+00  5.624e+00   0.194 0.846510    
## factor(year)70  2.175e+00  5.674e+00   0.383 0.701598    
## factor(year)71  7.244e+00  5.720e+00   1.266 0.205565    
## factor(year)72  1.232e+01  5.764e+00   2.137 0.032776 *  
## factor(year)73  1.146e+01  5.807e+00   1.973 0.048711 *  
## factor(year)74  1.442e+01  5.860e+00   2.460 0.014000 *  
## factor(year)75  1.860e+01  5.970e+00   3.116 0.001874 ** 
## factor(year)76  2.497e+01  6.110e+00   4.086 4.65e-05 ***
## factor(year)77  2.357e+01  6.210e+00   3.796 0.000154 ***
## factor(year)78  2.847e+01  6.496e+00   4.382 1.27e-05 ***
## factor(year)79  2.605e+01  6.699e+00   3.888 0.000106 ***
## factor(year)80  2.795e+01  6.938e+00   4.028 5.94e-05 ***
## factor(year)81  2.832e+01  7.239e+00   3.912 9.61e-05 ***
## factor(year)82  3.536e+01  7.670e+00   4.610 4.41e-06 ***
## factor(year)83  4.700e+01  8.428e+00   5.577 2.96e-08 ***
## factor(year)84  5.550e+01  9.323e+00   5.954 3.34e-09 ***
## factor(year)85  5.988e+01  9.802e+00   6.109 1.31e-09 ***
## factor(year)86  6.533e+01  1.037e+01   6.297 4.09e-10 ***
## factor(year)87  7.000e+01  1.099e+01   6.371 2.57e-10 ***
## factor(year)88  7.621e+01  1.183e+01   6.443 1.63e-10 ***
## factor(year)89  8.526e+01  1.282e+01   6.648 4.30e-11 ***
## factor(year)90  9.798e+01  1.410e+01   6.950 5.66e-12 ***
## factor(year)91  1.078e+02  1.492e+01   7.226 8.32e-13 ***
## factor(year)92  1.352e+02  1.691e+01   7.995 2.77e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26.73 on 1347 degrees of freedom
## Multiple R-squared:  0.2736, Adjusted R-squared:  0.2563 
## F-statistic: 15.85 on 32 and 1347 DF,  p-value: < 2.2e-16

Para el primer caso se observa que:

En el segundo:

  reg.fijos.periodo = lm(sales~price+pop16+ndi+factor(year)-1) 
  summary(reg.fijos.periodo)
## 
## Call:
## lm(formula = sales ~ price + pop16 + ndi + factor(year) - 1)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -67.925 -14.579  -2.866   9.215 160.510 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## price          -1.765e+00  1.138e-01  -15.51  < 2e-16 ***
## pop16          -8.771e-04  2.093e-04   -4.19 2.97e-05 ***
## ndi             6.523e-03  5.830e-04   11.19  < 2e-16 ***
## factor(year)63  1.637e+02  4.870e+00   33.62  < 2e-16 ***
## factor(year)64  1.608e+02  4.922e+00   32.67  < 2e-16 ***
## factor(year)65  1.620e+02  4.939e+00   32.80  < 2e-16 ***
## factor(year)66  1.644e+02  5.038e+00   32.63  < 2e-16 ***
## factor(year)67  1.649e+02  5.089e+00   32.40  < 2e-16 ***
## factor(year)68  1.654e+02  5.231e+00   31.61  < 2e-16 ***
## factor(year)69  1.648e+02  5.314e+00   31.02  < 2e-16 ***
## factor(year)70  1.659e+02  5.538e+00   29.96  < 2e-16 ***
## factor(year)71  1.710e+02  5.692e+00   30.04  < 2e-16 ***
## factor(year)72  1.761e+02  5.815e+00   30.28  < 2e-16 ***
## factor(year)73  1.752e+02  5.885e+00   29.77  < 2e-16 ***
## factor(year)74  1.782e+02  5.999e+00   29.70  < 2e-16 ***
## factor(year)75  1.823e+02  6.251e+00   29.17  < 2e-16 ***
## factor(year)76  1.887e+02  6.544e+00   28.84  < 2e-16 ***
## factor(year)77  1.873e+02  6.697e+00   27.97  < 2e-16 ***
## factor(year)78  1.922e+02  7.195e+00   26.71  < 2e-16 ***
## factor(year)79  1.898e+02  7.480e+00   25.37  < 2e-16 ***
## factor(year)80  1.917e+02  7.820e+00   24.51  < 2e-16 ***
## factor(year)81  1.921e+02  8.211e+00   23.39  < 2e-16 ***
## factor(year)82  1.991e+02  8.832e+00   22.54  < 2e-16 ***
## factor(year)83  2.107e+02  9.852e+00   21.39  < 2e-16 ***
## factor(year)84  2.192e+02  1.094e+01   20.04  < 2e-16 ***
## factor(year)85  2.236e+02  1.150e+01   19.45  < 2e-16 ***
## factor(year)86  2.291e+02  1.215e+01   18.85  < 2e-16 ***
## factor(year)87  2.337e+02  1.284e+01   18.21  < 2e-16 ***
## factor(year)88  2.400e+02  1.376e+01   17.44  < 2e-16 ***
## factor(year)89  2.490e+02  1.485e+01   16.77  < 2e-16 ***
## factor(year)90  2.617e+02  1.621e+01   16.15  < 2e-16 ***
## factor(year)91  2.715e+02  1.708e+01   15.90  < 2e-16 ***
## factor(year)92  2.989e+02  1.917e+01   15.60  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 26.73 on 1347 degrees of freedom
## Multiple R-squared:  0.9573, Adjusted R-squared:  0.9562 
## F-statistic: 914.9 on 33 and 1347 DF,  p-value: < 2.2e-16

Otra opción disponible es usar el paquete plm:

  # install.packages("plm") # instalamos el paquete (sólo una vez)
  library(plm) # instalarlo previamente
## Loading required package: Formula
  reg.fijos.within = plm(sales~price+pop16+ndi, index=c("state", "year"), model="within", data=Cigar)
  summary(reg.fijos.within)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = sales ~ price + pop16 + ndi, data = Cigar, model = "within", 
##     index = c("state", "year"))
## 
## Balanced Panel: n=46, T=30, N=1380
## 
## Residuals :
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -73.200  -6.580   0.669   6.930 125.000 
## 
## Coefficients :
##          Estimate  Std. Error  t-value  Pr(>|t|)    
## price -0.40585663  0.03760645 -10.7922 < 2.2e-16 ***
## pop16  0.00144787  0.00064307   2.2515   0.02452 *  
## ndi    0.00170341  0.00034943   4.8748  1.22e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    412530
## Residual Sum of Squares: 298760
## R-Squared:      0.27578
## Adj. R-Squared: 0.24967
## F-statistic: 168.949 on 3 and 1331 DF, p-value: < 2.22e-16
  fixef(reg.fijos.within) # efectos individuales de cada individuo
##         1         3         4         5         7         8         9 
## 121.12760 125.74317 130.97717 103.38015 129.06806 164.90679 174.29691 
##        10        11        13        14        15        16        17 
## 133.20423 128.77764 119.38842 127.70347 149.06797 124.82269 124.29412 
##        18        19        20        21        22        23        24 
## 187.58917 137.12896 149.38997 131.00061 128.54364 135.13195 121.64487 
##        25        26        27        28        29        30        31 
## 123.99148 140.24105 125.85997 121.21498 187.68039 246.66154 125.99134 
##        32        33        35        36        37        39        40 
## 107.79105 115.26325 119.70414 128.72280 134.04658 117.03298 149.86126 
##        41        42        43        44        45        46        47 
## 130.14140 118.55716 129.89168 114.36413  83.66022 155.36030 138.63147 
##        48        49        50        51 
## 109.22128 130.60813 120.33147 148.45008

En este caso:

También se puede considerar el modelo between. Los modelos entre grupos o between analizan la variabilidad entre unidades de sección cruzada, por tanto, usan las medias de los datos temporales de cada individuo:

  reg.fijos.between = plm(sales~price+pop16+ndi, index=c("state", "year"), model="between", data=Cigar)
  summary(reg.fijos.between)
## Oneway (individual) effect Between Model
## 
## Call:
## plm(formula = sales ~ price + pop16 + ndi, data = Cigar, model = "between", 
##     index = c("state", "year"))
## 
## Balanced Panel: n=46, T=30, N=1380
## Observations used in estimation: 46
## 
## Residuals :
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
##  -42.80  -13.10   -2.73   10.50   78.50 
## 
## Coefficients :
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  2.1095e+02  4.4543e+01  4.7358 2.498e-05 ***
## price       -2.7525e+00  7.0002e-01 -3.9320 0.0003094 ***
## pop16       -1.3950e-03  9.3714e-04 -1.4886 0.1440754    
## ndi          1.4192e-02  3.2069e-03  4.4255 6.708e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    30398
## Residual Sum of Squares: 18621
## R-Squared:      0.38741
## Adj. R-Squared: 0.34366
## F-statistic: 8.85397 on 3 and 42 DF, p-value: 0.00011498

En la práctica, se utilizan poco porque los modelos con efectos aleatorios son superiores y el estimador between ignora la información temporal existente dentro de los individuos.

Regresión con efectos aleatorios

Si se considera que el término independiente es una variable aleatoria, debe considerarse un enfoque de efectos aleatorios:

  reg.aleatorios = plm(sales~price+pop16+ndi, index=c("state", "year"), model="random", data=Cigar)
  summary(reg.aleatorios)
## Oneway (individual) effect Random Effect Model 
##    (Swamy-Arora's transformation)
## 
## Call:
## plm(formula = sales ~ price + pop16 + ndi, data = Cigar, model = "random", 
##     index = c("state", "year"))
## 
## Balanced Panel: n=46, T=30, N=1380
## 
## Effects:
##                  var std.dev share
## idiosyncratic 224.46   14.98 0.345
## individual    425.74   20.63 0.655
## theta:  0.8686  
## 
## Residuals :
##    Min. 1st Qu.  Median 3rd Qu.    Max. 
## -65.400  -7.400   0.328   6.130 131.000 
## 
## Coefficients :
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept)  1.3644e+02  3.4612e+00  39.421 < 2.2e-16 ***
## price       -4.2465e-01  3.7680e-02 -11.270 < 2.2e-16 ***
## pop16        5.9131e-04  5.2188e-04   1.133    0.2574    
## ndi          1.9522e-03  3.4737e-04   5.620 2.309e-08 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    428280
## Residual Sum of Squares: 313800
## R-Squared:      0.26728
## Adj. R-Squared: 0.26569
## F-statistic: 167.315 on 3 and 1376 DF, p-value: < 2.22e-16

De la información ofrecida cabe destacar:

Selección de modelos

Para elegir cuál de los tres enfoques anteriores es el más idóneo se disponen de los siguientes contrastes:

  # H0: modelo agrupado (MCO) vs H1: efectos fijos
  pFtest(reg.fijos.within, reg.mco) 
## 
##  F test for individual effects
## 
## data:  sales ~ price + pop16 + ndi
## F = 71.659, df1 = 45, df2 = 1331, p-value < 2.2e-16
## alternative hypothesis: significant effects
  # H0: modelo agrupado (MCO) vs H1: efectos aleatorios
  reg.mco.plm = plm(sales~price+pop16+ndi, index=c("state", "year"), model="pooling", data=Cigar)
  plmtest(reg.mco.plm, type=c("bp")) 
## 
##  Lagrange Multiplier Test - (Breusch-Pagan) for balanced panels
## 
## data:  sales ~ price + pop16 + ndi
## chisq = 8226.4, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
  # H0: efectos aleatorios vs H1: efectos fijos
  phtest(reg.fijos.within, reg.aleatorios) 
## 
##  Hausman Test
## 
## data:  sales ~ price + pop16 + ndi
## chisq = 41.357, df = 3, p-value = 5.492e-09
## alternative hypothesis: one model is inconsistent

Teniendo en cuenta que:

Se tiene que el enfoque idóneo es el de efectos fijos. En tal caso:

Nota final

Un enlace interesante sobre datos de panel puede ser el siguiente https://acbstats.wordpress.com/2017/02/08/regresion-residuos-y-baloncesto-tris/.