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

 

 

 

 

 

 

 

sep 042012
 
tabla-isp

Los organismos públicos españoles no ponen sencillo a los analistas el trabajo con los datos que publican (que son menos de los que sería deseable en un país con verdadera transparencia). Cada entidad que publica datos lo hace con su propio formato, que en ocasiones es el de algún programa estadístico comercial (¿para cuándo formatos abiertos?). En algunos casos, como el de este ejemplo, la información se publica como una tabla en una página web, de la que hay que extraer los datos de interés.

Continue reading »

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.