may 062013
 
tree_map_export_esp_all_show_2010

Mientras las Administraciones Públicas españolas continúan sin ser capaces de proporcionar unas interfaces homogéneas y modernas para que cualquier analista pueda acceder a los datos disponibles, el mundo se mueve en otra dirección.

Últimamente he sido consciente de la aparición de unas cuantas webs de datos que añaden una capa de depuración y visualización a fuentes ya disponibles. Este enriquecimiento hace más fiable la información de partida, pero especialemente, más accesible y cómoda de utilizar. A continuación las presento y animo a los lectores a explorarlas (todas son gratuítas).

Quandl

La web de Quandl (http://www.quandl.com) proporciona acceso a una amplia selección de datos que proceden de diferentes fuentes en distintos ámbitos: mercados, economía, demografía, cotizaciones, y un largo etcétera. Los datos se pueden descargar y visualizar on-line y dispone de un paquete de funciones de R que facilitan la descarga de datos en dicho entorno de análisis.

Knoema

Knoema (http://knoema.com) tiene una filosofía y cobertura de variables similar a Quandl, pero pone el énfasis en la elaboración de visualizaciones sofisticadas que se pueden incrustar en páginas web. El mecanismo de extracción de datos es menos refinado que en Quandl, envían un email automático con los datos solicitados en formato .xls.

The observatory of economic complexity

Partiendo de los datos brutos de comercio internacional, R. Hausmann y sus discípulos han hecho accesible una riquísima fuente de información estadística, homogeneizando y alargando muchas de las series disponibles (http://atlas.media.mit.edu/). Las impactantes visualizaciones de exportaciones e importaciones proporcionan un resumen compacto del intercambio de bienes entre países y los datos se pueden descargar. Si bien el nivel de desagregación es suficiente para muchos usos, se hace necesario recurrir a COMTRADE para obtener información por país, año y producto.

Paquete WDI para R

El Banco Mundial, bajo la denominación World Development Indicators (http://data.worldbank.org) elabora una base de datos con más de 8000 series temporales comparables entre países que abarcan todo el espectro económico y demográfico. Tanto Quandl como Knoema utilizan ampliamente dicha base de datos y se pueden descargar de la web, pero el paquete WDI de V. Arel-Bundock facilita el acceso directo, selección y carga de datos en R.

mar 012013
 
Captura de pantalla 2013-03-01 a la(s) 13.50.50

He tenido el blog un poco abandonado últimamente, pero no he dejado de enredar. Lo último que he estado desarrollando con R es una aplicación web para la identificación y estimación de modelos ARIMA. La idea surgió cuando, en el primer cuatrimestre, volví a enseñar este tipo de modelos a la primera promoción del Grado de Economía de la Especialidad de Análisis Económico (aunque no llegaron a ver la aplicación).

El paquete shiny de R apareció a finales de 2012 y hace sencillo crear pequeñas aplicaciones a las que el usuario accede desde el navegador. Pueden estar alojadas en un servidor externo o en el propio equipo del usuario. Con dicha herramienta, una vez se adquiere cierta soltura, se puede crear aplicaciones vistosas en relativamente poco tiempo.

Ayer presenté la versión actual (28 de febrero de 2013) de la aplicación en el Grupo de Usuarios de R de Madrid. El video de la presentación se puede ver pulsando aquí. La aplicación en vivo aparece a continuación (es trabajo en curso, así que habrá muchos cambios y puede no funcionar). También se puede acceder a ella en http://glimmer.rstudio.com/grserrano/idts.

Funciona mejor en Chrome que en otros navegadores, pero estaré encantado de recibir comentarios con las combinaciones de navegador y sistema operativo donde se aprecie algún problema. En el iPhone se ve estupendamente, así que ya tengo un ARIMAphone:

idts1idts2

 

 

 

 

 

 

 

may 302012
 
Rlogo-beta

Otro sencillo ejemplo, pero relacionado con el anterior, nos permitirá estudiar la potencia del contraste de Jarque-Bera para distintos tamaños muestrales. La potencia es la probabilidad de rechazar la hipótesis nula cuando es falsa, así que vamos a generar 1000 muestras tamaño 100 de una variable aleatoria U(0,1) y calcularemos si la nula de normalidad se rechaza para cada una de ellas; es decir, vamos a contar el número de veces que el estadístico JB es mayor que 5.99 (el valor crítico de una χ22 para un nivel de significación del α = 0.05).

> set.seed(301)  ## Para hacer el ejemplo reproducible
> nrep  <- 1000
> n     <- 100
> Z     <- matrix(runif(n*nrep, 0, 1), nrow=n)
> jbrechaza <- function(x) {
+     return(jarque.bera.test(x)$statistic > qchisq(0.95, 2))
+ }
> rechaza  <- apply(Z, 2, jbrechaza)
> (potencia <- sum(rechaza)/length(rechaza))
 


[1] 0.549

Incluso con muestras relativamente grandes para lo que se maneja a menudo en econometría, el estadístico de Jarque-Bera sólo es capaz de rechazar la nula de normalidad en una de cada dos ocasiones en que la muestra es uniforme. Como cabe esperar, con muestras menores la potencia se reduce apreciablemente, acercándose a cero con n=20. Puede ir cambiando la variable n para trazar la curva de potencia del contraste para una alternativa U(0,1).

may 292012
 
Rlogo-beta

En R resulta especialmente cómodo programar simulaciones para estudiar propiedades estadísticas de contrastes y estimadores. En este post y los dos siguientes se presentan algunos ejemplos.

Vamos a ilustrar el teorema central del límite, que en una versión sencilla podemos formular del siguiente modo. Sean Xi variables aleatorias independientes y no muy diferentes:


W_n = \sum _{i=1}^n X_i \qquad \Rightarrow \qquad \frac{W_n -    \mathrm{E}(W_n)}{\sqrt{\mathrm{V}(W_n)}} \underset{n \to \infty}{\longrightarrow} N(0,1).

Para una aplicación empírica, se generan 1000 muestras, tamaño 2000, de una población log-normal (supuesto muy frecuente en econometría, donde se toman logaritmos para inducir normalidad), que son las Xi, y las almacenamos en una matriz 2000×1000. Si sumamos los primeros 10 elementos de cada columna, obtenemos una muestra tamaño 1000 de W10, que representamos en un histograma, no se parece a una normal (Gráfico 1(a)).

(a) Histograma de W10

Histograma de W500

(b) Histograma de W500

(c) Histograma de W2000


Gráfico 1: Convergencia de la suma de log-normales a la normal.

Después tomamos los primeros 500 elementos de cada muestra de log normales y los sumamos, tendríamos una muestra de W500. El histograma de W500 empieza a mostrar un comportamiento más simétrico (Gráfico 1(b)). Finalmente, cogemos los 2000 elementos de cada muestra y los sumamos. Ahora disponemos de una muestra tamaño 1000 de la variable aleatoria W2000 (Gráfico 1(c)). El script de R para hacer esta simulación es:

> set.seed(301) ## Para hacer el ejemplo reproducible
> n    <- 2000
> nrep <- 1000
> X    <- matrix(exp(rnorm(n*nrep)), nrow=n)
> W10   <- apply(X[1:10, ], 2, sum)
> W500  <- apply(X[1:500, ], 2, sum)
> W2000 <- apply(X[1:2000, ], 2, sum)
> sapply(data.frame(W10, W500, W2000), jarque.bera.test)[c(1,3),]


          W10      W500         W2000
statistic 7842.408 32.48236     1.754108
p.value   0        8.841903e-08 0.4160067

La función sapply() aplica la función que aparece como segundo argumento a las columnas del data.frame en su primer argumento. De todos los resultados que devuelve la función jarque.bera.test(), en este punto sólo nos interesan dos de ellos: el valor del estadístico y el p-valor, que aparecen en la primera y tercera posición.

Utilizando el contraste de Jarque y Bera, se rechaza la nula para W10 y W500, pero no se puede rechazar normalidad para W2000. Para comparar la tasa de convergencia, puede cambiar la generación de una log-normal (exp(rnorm(n*nrep))) por una uniforme: X <- matrix(runif(n*nrep), nrow=n), para comprobar que a partir de 5 ó 10 uniformes, la suma es aproximadamente normal.

may 172012
 
Rlogo-beta

5.5  Cointegración y modelo de correción de error

Se habla de cointegración entre dos series temporales cuando ambas son no estacionarias (requieren una diferencia para serlo) pero una combinación lineal de ellas sí lo es. En este caso, la combinación lineal estacionaria se puede interpretar como una relación a largo plazo e incluirla retardada en el modelo en diferencias como factor de ajuste o término de corrección de error.

Aunque sin justificación teórica, nos podemos preguntar si el consumo de cigarrillos y la publicidad están cointegradas. Para ello estimamos un modelo en logaritmos de las variables y calculamos los residuos, que deberían ser estacionarios. Para contrastar formalmente la estacionariedad se utiliza el contraste de Dickey-Fuller aumentado (adf.test() del paquete tseries), aplicado a los residuos de la regresión en logaritmos de consumo de tabaco sobre publicidad:

> library(tseries)
> mcoint <- dynlm(log(consumo)~log(publicidad),
+                 data=window(tabdz, start=1940))
> summary(mcoint)


Time series regression with "zooreg" data:
Start = 1940, End = 1978

Call:
dynlm(formula = log(consumo) ~ log(publicidad), data = window(tabdz,
    start = 1940))

Residuals:
     Min       1Q   Median       3Q      Max
-0.56682 -0.01087  0.03205  0.07480  0.16525

Coefficients:
                Estimate Std. Error t value Pr(>|t|)
(Intercept)      7.96733    0.04374 182.138  < 2e-16 ***
log(publicidad)  0.17307    0.04195   4.126 0.000201 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1445 on 37 degrees of freedom
Multiple R-squared: 0.3151,	Adjusted R-squared: 0.2966
F-statistic: 17.02 on 1 and 37 DF,  p-value: 0.0002011
 


> adf.test(as.ts(residuals(mcoint)))  ## Requiere ts, no sirve zoo


	Augmented Dickey-Fuller Test

data:  as.ts(residuals(mcoint))
Dickey-Fuller = -3.3081, Lag order = 3, p-value = 0.08536
alternative hypothesis: stationary

No se puede rechazar la presencia de raíz unitaria en los residuos al 5% de significación (al no poder rechazar la nula), aunque sí al 10%. Si se asume la estacionariedad de los residuos de la regresión anterior, se podrían incluir retardados en la estimación del modelo como un término de corrección de error o relación a largo plazo entre las variables. A continuación, añadimos el término de corrección de error (residuos de la estimación en logaritmos) al data.frame tabz con merge() para, después, estimar los modelos tabm1 y tabm2 incluyendo dicha variable retardada:

> tabdz <- merge(tabdz, err.c=residuals(mcoint))
> tab.ecm1 <- dynlm(d(log(consumo))~d(log(publicidad))+L(err.c),
+                  data=window(tabdz, start=1940))
> tab.ecm2 <- dynlm(d(log(consumo))~L(d(log(consumo)))+L(err.c),
+                  data=window(tabdz, start=1940))
> mtable(tab.ecm1, tab.ecm2)


Calls:
tab.ecm1: dynlm(formula = d(log(consumo)) ~ d(log(publicidad)) + L(err.c),
    data = window(tabdz, start = 1940))
tab.ecm2: dynlm(formula = d(log(consumo)) ~ L(d(log(consumo))) + L(err.c),
    data = window(tabdz, start = 1940))

=======================================
                    tab.ecm1  tab.ecm2
---------------------------------------
(Intercept)          0.021***  0.014*
                    (0.006)   (0.006)
d(log(publicidad))  -0.083
                    (0.075)
L(err.c)            -0.217*** -0.219***
                    (0.042)   (0.054)
L(d(log(consumo)))             0.272*
                              (0.125)
---------------------------------------
R-squared              0.545     0.537
adj. R-squared         0.519     0.509
sigma                  0.033     0.031
F                     20.983    19.688
p                      0.000     0.000
Log-likelihood        77.507    77.476
Deviance               0.038     0.033
AIC                 -147.014  -146.951
BIC                 -140.464  -140.508
N                     38        37
=======================================

may 162012
 
Rlogo-beta

5.4  Autocorrelación y matriz de covarianzas consistente

Aunque la varianza de las estimaciones de los coeficientes del modelo se suele presentar como \mathrm{V}(\hat{\boldsymbol{\beta}})=\sigma^2(X'X)^{-1}, se trata de un caso particular. En general, la varianza de los estimadores por MCO es:

\mathrm{V}(\hat{\boldsymbol{\beta}})=(X'X)^{-1} X'\Omega X (X'X)^{-1},

de donde se obtiene el caso particular si \mathrm{V}(\boldsymbol{\varepsilon})=\Omega=\sigma^2 I_n. Sin embargo, existen situaciones en las que el supuesto ideal de perturbaciones esféricas no se cumple.

El primer caso, llamado heterocedasticidad, ocurre cuando las perturbaciones no tienen idéntica varianza, es decir Vi)=σ2i ≠ σ2. En esta situación Ω es una matriz diagonal, pero los elementos no nulos son diferentes. El segundo caso, que denominamos autocorrelación, consiste en que las perturbaciones no son independientes (Covts) ≠ 0) y por lo tanto, los elementos de fuera de la diagonal de la matriz Ω son distintos de cero. En cualquiera de los casos mencionados, la estimación de \mathrm{V}(\hat{\boldsymbol{\beta}}) por mínimos cuadrados produce un estimador inconsistente, que invalida los contrastes realizados sobre los coeficientes estimados.

Se ha propuesto una familia general de estimadores consistentes de la matriz de covarianzas, de manera que distintas elecciones para estimar X’ΩX producen estimaciones consistentes ante la presencia de heterocedasticidad y/o autocorrelación, siendo pioneros el de White para heterocedasticidad y el de Newey-West para el caso de heterocedasticidad y autocorrelación.

La presencia de autocorrelación, además, si se incluyen retardos de la variable explicada como explicativa, puede dar lugar a estimaciones inconsistentes del vector de parámetros. Para detectar la presencia de autocorrelación en el modelo lineal general, además de las funciones de autocorrelación simple y parcial de los residuos del modelo, se puede utilizar el contraste de Breusch-Godfrey, donde hay que especificar el orden de la autocorrelación de las perturbaciones que se desea contrastar o el más genérico contraste de Ljung-Box, cuya hipótesis nula es que la serie (de residuos en este caso) sigue un proceso de ruido blanco. Volviendo a los modelos de consumo de tabaco:

> bgtest(tabm1, 1)


	Breusch-Godfrey test for serial correlation of order up to 1

data:  tabm1
LM test = 8.8763, df = 1, p-value = 0.002889


> Box.test(residuals(tabm1), 6,  type="Ljung-Box")


	Box-Ljung test

data:  residuals(tabm1)
X-squared = 14.3463, df = 6, p-value = 0.026


> bgtest(tabm2, 1)


	Breusch-Godfrey test for serial correlation of order up to 1

data:  tabm2
LM test = 2.4486, df = 1, p-value = 0.1176


> Box.test(residuals(tabm2), 6, type="Ljung-Box")


	Box-Ljung test

data:  residuals(tabm2)
X-squared = 4.9471, df = 6, p-value = 0.5506

En el modelo tabm1 existe evidencia de autocorrelación de primer orden de acuerdo con el contraste de Breusch-Godfrey y se rechaza que los residuos sean ruido blanco según el contraste de Ljung-Box, por lo que los estadísticos t de significación individual (o cualquier otro contraste) no son válidos. Sin embargo, no aparecen problemas de autocorrelación en el modelo tabm2.

Para estimar la matriz de varianzas covarianzas consistente se puede usar la función vcovHAC() (sería vcovHC() si el problema fuese sólo de heterocedasticidad). Como existen distintos estimadores consistentes, la función vcovHAC admite un argumento type para seleccionar un estimador concreto o alternativamente, utilizar la función NeweyWest() que devuelve el estimador de Newey-West de \mathrm{V}(\hat{\boldsymbol{\beta}}). Por su parte, la función coeftest() realiza los contrastes t habituales admitiendo diferentes estimaciones de la matriz de covarianzas de los coeficientes estimados:

> library(sandwich)
> coeftest(tabm1) ## Estimador de la varianza MCO


t test of coefficients:

                     Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.0267053  0.0074777  3.5713 0.001031 **
d(log(publicidad)) -0.2627841  0.0872122 -3.0132 0.004712 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


> coeftest(tabm1, vcov.=vcovHAC(tabm1))


t test of coefficients:

                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.026705   0.012354  2.1617  0.03737 *
d(log(publicidad)) -0.262784   0.126461 -2.0780  0.04490 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1


> coeftest(tabm1, vcov.=NeweyWest(tabm1, lag=2))


t test of coefficients:

                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.026705   0.011400  2.3426  0.02479 *
d(log(publicidad)) -0.262784   0.107444 -2.4458  0.01947 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La inconsistencia de la matriz de covarianzas no sólo invalida los contrastes t, también cualquier contraste de hipótesis lineales presentados en la Sección 4.2 utilizando la forma de Wald, no así la forma basada en sumas residuales, que no se ven alteradas. En su momento vimos la función linearHypothesis(), que también admite un argumento vcov.= para especificar una función que calcule la matriz de covarianzas consistente o bien la propia matriz de covarianzas.

may 082012
 
Rlogo-beta

5.3  Modelo lineal con series temporales

En las secciones anteriores se ha visto como cargar y crear un objeto de clase zooreg para tratar datos de series temporales. A continuación, se presentan algunas funciones específicas para la estimación del modelo lineal general en  incluyendo elementos habituales para esta clase de datos como retardos y diferencias. Tomando el conjunto de datos sobre consumo de tabaco y publicidad, cuya descripción se puede encontrar al final, se cargan los datos y se crea un objeto zooreg excluyendo la primera columna cargada (que contiene el año):

> library(zoo)
> tabd  <- read.csv("http://grserrano.es/datos/datos_tabaco.csv")
> tabdz <- zooreg(tabd[, -1], start=1930, frequency=1)

La falta de estacionariedad (media no constante) de las variables del ejemplo es evidente a la vista del gráfico en logaritmos que se presentó en la entrada sobre gráficos de series temporales, por lo que especificaremos los modelos en tasas de variación logarítmica. Para justificar formalmente tomar diferencias, se pueden utilizar los contrastes de Dickey-Fuller (adf.test(), que se ilustra un poco más adelante) o el de Phillips-Perron (pp.test()) aplicados a las series en logaritmos.

Para la estimación, el paquete dynlm estima modelos lineales por mínimos cuadrados, pero facilita la especificación de regresiones con retardos y diferencias en las variables. No insistiré aquí en la importancia de no estimar regresiones con variables que comparten tendencias, puesto que casi siempre serán regresiones espurias.

En el siguiente fragmento se estima un modelo en tasas de variación (diferencias de logartimos, usando la función d()) explicando el consumo de tabaco en función del gasto en publicidad utilizando datos desde 1940 (argumento data con la función window()) que se muestran en el Gráfico 1.



Gráico 1: Evolución del consumo de tabaco y el gasto en publicidad en tasas logarítmicas de variación interanual.

> library(dynlm)
> tabdz1 <- diff(log(window(tabdz[, c("consumo", "publicidad")], start=1940)))
> tmp  <- data.frame(date=as.Date(paste(1941:1978, "-6-30", sep="")),
+                    consumo=tabdz1[, "consumo"],
+                    publicidad=tabdz1[, "publicidad"])
> tmpl <- melt(tmp, id.vars="date")
> qplot(date, value*100, data=tmpl, geom=c("point", "line"),
+       ylab="T.V. Interanual (%)", xlab="Año", colour=variable)
> tabm1 <- dynlm(d(log(consumo))~d(log(publicidad)),
+                data=window(tabdz, start=1940))
> summary(tabm1)


Time series regression with "zooreg" data:
Start = 1941, End = 1978

Call:
dynlm(formula = d(log(consumo)) ~ d(log(publicidad)), data = window(tabdz,
    start = 1940))

Residuals:
      Min        1Q    Median        3Q       Max
-0.077950 -0.032970 -0.004458  0.012886  0.098907

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.026705   0.007478   3.571  0.00103 **
d(log(publicidad)) -0.262784   0.087212  -3.013  0.00471 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.04285 on 36 degrees of freedom
Multiple R-squared: 0.2014,	Adjusted R-squared: 0.1792
F-statistic: 9.079 on 1 and 36 DF,  p-value: 0.004712

Como se aprecia en la estimación, el consumo está inversamente relacionado con el gasto publicitario, resultado anómalo sólo explicable por la progresiva concienciación de los perjuicios del tabaco para la
salud.

Para introducir un retardo de la tasa de variación del consumo de tabaco como variable explicativa se usa la función L() (dentro de la fórmula de dynlm()):

> tabm2 <- dynlm(d(log(consumo))~L(d(log(consumo))) + d(log(publicidad)),
+                data=window(tabdz, start=1940))
> summary(tabm2)
 


Time series regression with "zooreg" data:
Start = 1942, End = 1978

Call:
dynlm(formula = d(log(consumo)) ~ L(d(log(consumo))) + d(log(publicidad)),
    data = window(tabdz, start = 1940))

Residuals:
     Min       1Q   Median       3Q      Max
-0.07860 -0.02460 -0.00015  0.02212  0.08261

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)
(Intercept)         0.011739   0.007496   1.566  0.12659
L(d(log(consumo)))  0.430304   0.138768   3.101  0.00386 **
d(log(publicidad)) -0.136513   0.081429  -1.676  0.10282
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.03638 on 34 degrees of freedom
Multiple R-squared: 0.3658,	Adjusted R-squared: 0.3285
F-statistic: 9.806 on 2 and 34 DF,  p-value: 0.0004341

Ahora es la tasa de variación del consumo en el año anterior lo que mejor explica la variación en el presente y el gasto publicitario ha perdido significación. No obstante, estos resultados deben tomarse con precaución hasta realizar los diagnósticos del modelo, ya que es frecuente la presencia de autocorrelación, lo que puede hacer que la estimación de las varianzas de los coeficientes resulte inconsistente (Sección 5.4).

El gráfico de residuos (Gráfico 2(a)), como siempre, es una primera herramienta para el diagnóstico de un modelo estimado. Primero hay que preparar un data.frame con las fechas y los residuos tipificados para usar ggplot2:

> tmp <- data.frame(date=as.Date(paste(1942:1978, "-6-30", sep="")),
+                   resid=scale(residuals(tabm2)),
+                   precio=subset(tabd, subset=(year>=1942), select="precio"))
> g6 <- qplot(date, resid, data=tmp, color=precio, geom=c("point", "line"),
+             ylab="Residuos tipificados", xlab="Año")

A la vista de las funciones de autocorrelación simple y parcial del Gráfico 2(b) (calculadas con acf() y pacf()) no se sospecha la presencia de autocorrelación en las perturbaciones del modelo, aunque sí se observa cierta variabilidad en la dispersión en el gráfico de residuos. Veremos contrastes formales en la Sección 5.4. Sobre el código del ejemplo, en la práctica no hay que programar el gráfico de las funciones de autocorrelación cada vez, sino que habría que empaquetarlo en una función que estaría siempre disponible (véase el Apéndice C).


Gráfico de residuos de tabm2

Funciones de autocorrelación simple y parcial


Gráfico 2: Residuos del modelo tabm2.

Para especificar más retardos de una variable se puede usar el segundo argumento de la función de retardo L() dentro de dynlm(). A continuación se estima un modelo autorregresivo de orden 2 para el consumo de tabaco:

> tabm2.ar <- dynlm(d(log(consumo))~L(d(log(consumo)), 1:2),
+                data=window(tabdz, start=1940))
> summary(tabm2.ar)


Time series regression with "zooreg" data:
Start = 1943, End = 1978

Call:
dynlm(formula = d(log(consumo)) ~ L(d(log(consumo)), 1:2), data = window(tabdz,
    start = 1940))

Residuals:
      Min        1Q    Median        3Q       Max
-0.067064 -0.018912  0.002138  0.019484  0.089672

Coefficients:
                         Estimate Std. Error t value Pr(>|t|)
(Intercept)              0.003018   0.006310   0.478   0.6356
L(d(log(consumo)), 1:2)1 0.275740   0.156556   1.761   0.0875 .
L(d(log(consumo)), 1:2)2 0.213038   0.145727   1.462   0.1532
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.03445 on 33 degrees of freedom
Multiple R-squared: 0.2615,	Adjusted R-squared: 0.2167
F-statistic: 5.843 on 2 and 33 DF,  p-value: 0.006726


Datos de consumo de tabaco y publicidad

El archivo datos_tabaco.csv contiene datos anuales desde 1930 a 1978 para EE.UU. de las siguientes variables:

  • consumo de cigarrillos per cápita,
  • renta per cápita,
  • precio medio de la cajetilla de tabaco en términos reales (es decir, deflactado por un índice de precios) en centavos,
  • un indicador del gasto en publicidad del sector tabaquero (una variable stock que se construye a partir del gasto corriente en publicidad de años anteriores, aplicando una cierta tasa de depreciación).

Además, se conoce la siguiente información:

  • En 1953, la American Cancer Society y el British Medical Research Council emitieron sendos informes que mostraban cómo las tasas de mortalidad eran más elevadas entre fumadores.
  • En 1964, el US General Surgeon Report concluía que fumar cigarrillos estaba ligado al cáncer de laringe.
  • En 1970 se aprobó la legislación que obligaba a las compañías a mostrar en las cajetillas mensajes de advertencia sobre los peligros del tabaco.
may 082012
 
Rlogo-beta

Uno de los supuestos más difíciles de verificar en la práctica es que el modelo lineal está correctamente especificado y que tanto la forma funcional es correcta como que no falta ninguna variable relevante. Se ha visto que si disponemos de datos, es posible contrastar la relevancia de cada variable explicativa en el modelo, sin embargo, el problema real se produce cuando no disponemos de información (no observamos) una variable posiblebemente relevante o cuando la especificación del modelo debería incluir transformaciones no lineales de las variables.

El contraste RESET (Regression Equation Specification Error Test, contraste de especificación del error del modelo de regresión) trata de arrojar alguna luz sobre los tipos de error de especificación mencionados. El supuesto es que si faltan términos no lineales o variables no observadas, eso quedaría reflejado en que ciertas no linealidades de los valores ajustados del modelo resultan significativas en la explicación de la variable dependiente.

La versión de valores ajustados del contraste RESET requiere estimar por MCO el modelo auxiliar:

y_i = \beta_1 + \beta_2 x_{i2} + \ldots + \beta_k x_{ik} +        \delta_2 \hat{y}_i^2 + \ldots + \delta_p \hat{y}_i^p  + \nu_i,

donde \hat{y}_i son los valores ajustados del modelo en  y el orden p es decisión del analista, y suele ser un valor pequeño como 3. La hipótesis nula del contraste RESET es H02=… = δp=0 y para contrastarla se puede utilizar un estadístico F y puede que sea necesario utilizar la estimación de la matriz de covarianzas consistente a la heterocedasticidad. Existe también la versión de regresores del contraste RESET, donde en la regresión auxiliar se incluyen potencias y productos cruzados de las variables explicativas en lugar de los valores ajustados del modelo de partida.

El contraste RESET ha sido criticado por su escasa potencia, es decir, aún cuando la nula es falsa y son necesarios términos no lineales u otras variables en el modelo, el contraste tiende a no recharzala.

Utilizando datos de 88 viviendas unifamiliares, se intenta explicar el precio (price) en función del tamaño de la parcela (lotsize), los pies cuadrados de superficie (sqrft) y el número de dormitorios (bdrms). A continuación se estima el modelo por MCO, se realiza el contraste RESET con p=3 (argumento power=2:3 donde deben especificarse todas las potencias hasta p) y versión de valores ajustados (type="fitted"):

> library(lmtest)
> hprice   <- read.csv("hprice1.csv")
> hprice.1 <- lm(price ~ lotsize + sqrft + bdrms, data=hprice)
> summary(hprice.1)
 


Call:
lm(formula = price ~ lotsize + sqrft + bdrms, data = hprice)

Residuals:
     Min       1Q   Median       3Q      Max
-120.026  -38.530   -6.555   32.323  209.376

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.177e+01  2.948e+01  -0.739  0.46221
lotsize      2.068e-03  6.421e-04   3.220  0.00182 **
sqrft        1.228e-01  1.324e-02   9.275 1.66e-14 ***
bdrms        1.385e+01  9.010e+00   1.537  0.12795
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 59.83 on 84 degrees of freedom
Multiple R-squared: 0.6724,	Adjusted R-squared: 0.6607
F-statistic: 57.46 on 3 and 84 DF,  p-value: < 2.2e-16


> resettest(hprice.1, power=2:3, type="fitted")


	RESET test

data:  hprice.1
RESET = 4.6682, df1 = 2, df2 = 82, p-value = 0.01202

Los gráficos de diagnósitico de residuos, cuya creación con plot.lm() se presentó en la sección sobre atípicos e influyentes, se muestran a continuación:

Gráfico de residuos

Matriz sombrero, residuos y distancia de Cook


Gráfico 1: Gráficos de diagnósitico del modelo hprice.1.

Como se puede apreciar, aparece una observación influyente, la vivienda 77 que podría estar alterando los resultados. Así, primero se elimina la observación problemática, se reestima el modelo y se realiza de nuevo el contraste:

> hprice   <- hprice[-77,]
> hprice.1 <- lm(price~lotsize+sqrft+bdrms, data=hprice)
> summary(hprice.1)


Call:
lm(formula = price ~ lotsize + sqrft + bdrms, data = hprice)

Residuals:
     Min       1Q   Median       3Q      Max
-115.072  -30.340   -0.739   31.913  211.138

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -28.301170  25.149383  -1.125  0.26370
lotsize       0.009195   0.001363   6.748 1.88e-09 ***
sqrft         0.086495   0.012949   6.680 2.55e-09 ***
bdrms        20.481920   7.767117   2.637  0.00998 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 51 on 83 degrees of freedom
Multiple R-squared: 0.7646,	Adjusted R-squared: 0.7561
F-statistic: 89.89 on 3 and 83 DF,  p-value: < 2.2e-16


> resettest(hprice.1, power=2:3, type="fitted")


	RESET test

data:  hprice.1
RESET = 4.2617, df1 = 2, df2 = 81, p-value = 0.01739

La estimación sin la vivienda 77 es claramente distinta de la obtenida con todas las observaciones. Sin embargo, el contraste RESET sigue rechazando la hipótesis nula de especificación correcta con un 5% de significación. Como alternativa, se propone una especificación en logaritmos (excepto el número de dormitorios), se estima y se realiza el contraste RESET sobre los residuos del nuevo modelo:

> hprice.2 <- lm(log(price) ~ log(lotsize) + log(sqrft) + bdrms, data = hprice)
> summary(hprice.2)


Call:
lm(formula = log(price) ~ log(lotsize) + log(sqrft) + bdrms,
    data = hprice)

Residuals:
     Min       1Q   Median       3Q      Max
-0.67967 -0.08873 -0.00435  0.10679  0.66830

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)  -1.33721    0.64787  -2.064   0.0421 *
log(lotsize)  0.20376    0.04553   4.475 2.41e-05 ***
log(sqrft)    0.66183    0.09611   6.886 1.02e-09 ***
bdrms         0.04140    0.02754   1.503   0.1365
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1835 on 83 degrees of freedom
Multiple R-squared: 0.6508,	Adjusted R-squared: 0.6382
F-statistic: 51.57 on 3 and 83 DF,  p-value: < 2.2e-16


> resettest(hprice.2, power=2:3, type="fitted")


	RESET test

data:  hprice.2
RESET = 2.3629, df1 = 2, df2 = 81, p-value = 0.1006

Con la transformación logaritmica, el número de dormitorios deja de ser significativo. Según el contraste RESET, no se puede rechazar la hipótesis nula de especificación correcta con un 5% de significación.

may 072012
 
Rlogo-beta

Un problema que se presenta en los modelos de regresión, pero no ligado al incumplimiento de un supuesto concreto, es la presencia de observaciones extremas e influyentes. Se dice que una observación es atípica si el residuo asociado es grande. Por su parte, una observación es extrema (o potencialmente influyente o apalancada) si se encuentra apreciablemente alejada del resto de observacines de la muestra. Por su parte, se habla de observación influyente si la presencia de dicha observación en la muestra altera significativamente algún aspecto de la estimación del modelo.

Debe quedar claro que tanto la presencia de observaciones atípicas como extremas no implica, necesariamente, que influyan en la estimación, aunque deberían ser analizadas las causas de la presencia de dichas observaciones en la muestra. De no pertenecer a la población objeto de estudio, podrían eliminarse sin más. Más problemáticas resultan las observaciones influyentes, puesto que su peso en la estimación es considerable, pero si no son extremas, no se podría justificar su exclusión.

Si bien el gráfico de residuos es una primera aproximación y suficiente para la detección de atípicos, los residuos no son la herramienta adecuada para la detección de observaciones extremas e influyentes, ya que por la naturaleza de estas, podrían alterar la estimación de forma que el residuo asociado resultase pequeño.

Para detectar la presencia de observaciones potencialmente influyentes (también se les llama extremas o apalancadas) se utilizan los elementos de la diagonal principal de la matriz sombrero. Partiendo de la notación del modelo lineal general, se define H=X(X′X)−1X′. El curioso nombre de la matriz H se debe a que cumple \hat{\mathbf{y}}=H\mathbf{y}, es decir, le “pone el sombrero” al vector de valores de la variable dependiente y. Los elementos de la diagonal de matriz H, que se denotan hii, son una distancia de cada observación a la nube de puntos y por lo tanto, valores elevados (superiores a 2k/n) señalan observaciones relativamente alejadas del conjunto y podrían influir sustancialmente en la estimación.

Para detectar observaciones influyentes se han definido estadísticos que miden el efecto de cada observación en diferentes elementos de la estimación. El más utilizado es la distancia de Cook (o estadístico de Cook), que mide el cambio en el vector de coeficientes estimados \hat{\boldsymbol{\beta}} al eliminar sucesivamente cada observación de la muestra. Si se denota por \hat{\boldsymbol{\beta}}_{(i)} la estimación por mínimos cuadrados sin la i-ésima observación, la distancia de Cook para la observación i es:

D_{i} = \frac{1}{k}(\hat{\boldsymbol{\beta}} - \hat{\boldsymbol{\beta}}_{(i)})' \left [ \mathrm{V}(\hat{\boldsymbol{\beta}}) \right ]^{-1} (\hat{\boldsymbol{\beta}} - \hat{\boldsymbol{\beta}}_{(i)}),

donde k es la dimensión del vector \hat{\boldsymbol{\beta}}. Aunque el estadístico de Cook no sigue una distribución concreta, para determinar aquellos valores grandes se suele utilizar 1 como indicador de problemas y de forma más refinada el valor crítico de una Fk,n−k.

En el contexto de las medidas de influencia, también se suelen considerar los residuos estudentizados, que se obtienen dividiendo el residuo MCO entre la desviación típica residual obtenida al eliminar la i-ésima observación de la estimación, de manera que dicha observación no tenga impacto en la estimación de σ2. Los residuos estudentizados se definen:

r_i = \frac{\hat{\varepsilon}_i}{\hat{\sigma}\sqrt{1-h_{ii}}},

donde \hat{\varepsilon}_i y \hat{\sigma}^2 se obtienen de la estimación del modelo por MCO y hii es el i-ésimo elemento de la diagonal de la matriz sombrero.

Las medidas presentadas están relacionadas con la distancia de Cook a través de las siguientes expresiones:

D_i = \frac{r_i^2}{k} \frac{h_{ii}}{1-h_{ii}} = \frac{1}{k} \left (    \frac{\hat{\varepsilon}_i}{\hat{\sigma}\sqrt{1-h_{ii}}} \right )^2    \left ( \frac{h_{ii}}{1-h_{ii}} \right ).

Para ilustrar el uso los estadísticos vamos a usar un conjunto de datos de un estudio de 1976 sobre la concentración media de nitrógeno en mg/litro (nitrogen) en 20 ríos del estado de Nueva York en EE.UU. Las variables explicativas son el porcentaje de tierra de la cuenca de cada río destinados a agricultura (agriculture), bosque (forests), residencial (residential) y comercial o industrial (comm.indust).

> nyrivers <- read.csv("http://grserrano.es/datos/nyrivers.csv",
+                      row.names="river" )
> m.nit <- lm(nitrogen~agriculture+forest+residential+com.indust, data=nyrivers)
> summary(m.nit)


Call:
lm(formula = nitrogen ~ agriculture + forest + residential +
    com.indust, data = nyrivers)

Residuals:
     Min       1Q   Median       3Q      Max
-0.49404 -0.13180  0.01951  0.08287  0.70480

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)  1.722214   1.234082   1.396   0.1832
agriculture  0.005809   0.015034   0.386   0.7046
forest      -0.012968   0.013931  -0.931   0.3667
residential -0.007227   0.033830  -0.214   0.8337
com.indust   0.305028   0.163817   1.862   0.0823 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2649 on 15 degrees of freedom
Multiple R-squared: 0.7094,	Adjusted R-squared: 0.6319
F-statistic: 9.154 on 4 and 15 DF,  p-value: 0.0005963

Como se puede apreciar, ninguna de las variables es significativa al 5%, si bien el porcentaje de la tierra destinado a usos comerciales o industriales lo es al 10%. La función plot.lm(), a la se se le pasa un modelo estimado y una selección de gráfico mediante el argumento which= nos ofrece la información necesaria.

> pdf(file="infl%02d.pdf", onefile=FALSE)
> plot.lm(m.nit, which=1)
> plot.lm(m.nit, which=4)
> plot.lm(m.nit, which=5)
> dev.off()

Valores ajustados y residuos.

Distancia de Cook.

Matriz sombrero, residuos y distancia de Cook.


Gráfico 1: Gráficos de diagnósitico de atípicos e influyentes.

Como se puede apreciar en los gráficos, los ríos Fishkill y Oswegatchie presentar residuos elvados, sin embargo, no son influyentes. A la vista de las distancias de Cook y del gráfico combinado, son el Hackensack y el Neversink los influyentes, es decir, su presencia en la estimación puede estar introduciendo alteraciones importantes en los resultados. El origen de la influencia es la gran distancia que los separa del resto de observaciones, con valores de hii próximos a la unidad.

Los valores numéricos de las medidas de influencia presentadas más arriba (junto con otras) se pueden obtener mediante la función influence.measures(). A continuación se utiliza dicha función, que devuelve una estructura algo compleja, y se crea una variable que indica si la observación es influyente o potencialmente influyente usando la distancia de Cook y la matriz sombrero. Después se listan las filas del data.frame original que podrían resultar problemáticas. Puede mostrar las medidas relevantes para todas las observaciones listando infl.m.nit.

> infl.m.nit <- influence.measures(m.nit)
> esinf      <- apply(infl.m.nit$is.inf[, c("cook.d", "hat")], 1, any)
> cbind(nyrivers[esinf,], infl.m.nit$infmat[esinf, c("cook.d", "hat")])


           agriculture forest residential com.indust nitrogen   cook.d
Neversink            2     84         1.9       1.98     1.00 13.21955
Hackensack           3     27        29.4       3.11     1.99 65.42632
                 hat
Neversink  0.8967834
Hackensack 0.9720820

A la vista de los resultados, en ambos casos la matriz sombrero indica posibles problememas, puesto que los valores de hii superan con mucho la frontera de 2k/n que en este caso es 0.5. También la distancia de Cook es enorme comparada con el valor de referencia, el valor que deja a la izquierda un 95% de probabilidad en una F5, 20, que es 2.71.

> nyrivers.noinf <- nyrivers[!esinf, ]
> m.nit.2 <- lm(nitrogen~agriculture+forest+residential+com.indust,
+               data=nyrivers.noinf)
> summary(m.nit.2)
 


Call:
lm(formula = nitrogen ~ agriculture + forest + residential +
    com.indust, data = nyrivers.noinf)

Residuals:
     Min       1Q   Median       3Q      Max
-0.36990 -0.05218 -0.00979  0.09231  0.24847

Coefficients:
             Estimate Std. Error t value Pr(>|t|)
(Intercept)  1.379765   0.774262   1.782   0.0981 .
agriculture  0.005197   0.009431   0.551   0.5909
forest      -0.010462   0.008668  -1.207   0.2489
residential  0.078339   0.084329   0.929   0.3698
com.indust   0.674612   0.437107   1.543   0.1467
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1619 on 13 degrees of freedom
Multiple R-squared: 0.8816,	Adjusted R-squared: 0.8452
F-statistic: 24.21 on 4 and 13 DF,  p-value: 6.365e-06

A pesar de haber eliminado las observaciones influyentes, el modelo todavía presenta algún problema, puesto que las variables no resultan individualmente significativas pero sí en conjunto, se puede sospechar la presencia de multicolinealidad, que se comprueba mediante los factores de inflación de varianza (usando la función vif()). Dicha sospecha está bien justificada en la naturaleza de las variables, que son el porcentaje de la cuenca de cada río destinado a cierto uso, por lo que cabe suponer que sumaran aproximadamente 100. Si eliminamos las variables residential y forest, vemos que las restantes variables sí resultan claramente significativas y con los signos esperados:

> vif(m.nit.2)


agriculture      forest residential  com.indust
  11.832121   12.335352    7.533501    7.638111


> m.nit.3 <- lm(nitrogen~agriculture+com.indust, data=nyrivers.noinf)
> summary(m.nit.3)


Call:
lm(formula = nitrogen ~ agriculture + com.indust, data = nyrivers.noinf)

Residuals:
      Min        1Q    Median        3Q       Max
-0.270138 -0.101492 -0.002511  0.075934  0.275115

Coefficients:
            Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.428827   0.083290   5.149 0.000119 ***
agriculture 0.016706   0.002782   6.005 2.41e-05 ***
com.indust  1.157635   0.160485   7.213 3.01e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1641 on 15 degrees of freedom
Multiple R-squared: 0.8596,	Adjusted R-squared: 0.8409
F-statistic: 45.93 on 2 and 15 DF,  p-value: 4.022e-07

may 042012
 
Rlogo-beta

La multicolinealidad se produce cuando algunas variables explicativas de un modelo lineal son combinación lineal de otras. La consecuencia es que el determinante de X′X se encuentra próximo a cero y su inversa, por lo tanto, puede ser inestable (pequeños cambios en X producen grandes cambios en la inversa). En un modelo lineal, a menudo, la primera señal de multicolinealidad es que las varianzas estimadas de los coeficientes resultan grandes, llevando a aceptar la nula de no significatividad, aunque la regresión en su conjunto resulte significativa.
Continue reading »