Você está na página 1de 123

CAPÍTULO 16 MODELOS CUALITATIVOS

rm(list=ls()) #Removes all items in Environment!


library(nlWaldTest) # for the `nlWaldtest()` function
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for `kable()`
library(forecast)
library(AER)
library(xtable)

16.1 El modelo de probabilidad lineal

Supongamos que la variable de respuesta es binaria, como se define en la Ecuación 1.

…if a individual chooses to buy a house(Si un individuo decide comprar una casa)

… if a individual chooses not to buy (Si un individuo decide no comprar)

El modelo de probabilidad lineal tiene la forma general que se muestra en la Ecuación 2.


es la probabilidad de que la variable de respuesta tome el valor de 1; por lo tanto, un

valor predicho de y es una predicción de la probabilidad de que

16.2 El modelo Probit

El modelo Probit asume una relación no lineal entre la variable de respuesta y los regresores,
esta relación es la función de distribución acumulativa de la distribución normal (consulte la
Ecuación 3 y la Figura 16.1, izquierda).

La pendiente de la curva de regresión no es constante, pero está dada por la función de densidad
normal estándar (Figura 16.1, derecha); la pendiente se puede calcular utilizando la ecuación 4.

Las predicciones de la probabilidad de que están dadas por la Ecuación 5.


x <- seq(-3,3, .2)
plot(x, pnorm(x), type="l", xlab="b1+b2x", ylab="P[y=1]")
plot(x, dnorm(x), type="l")

Figura 16.1: La forma de la función Probit es la distribución normal estándar


16.3 El ejemplo del transporte

El transport del conjunto de datos contiene N = 21 observaciones de chioces de transporte (auto


= 1 si la persona i elige auto y 0 si la persona i elige bus). La elección depende de la diferencia de
tiempo entre los dos medios de transporte, dtime = (bustime − autotime) ÷ 10.

La función R para estimar un modelo probit es glm, con el argumento de la family igual a
binomial (link = "probit"). La función glm tiene la siguiente estructura general:

glm(formula, family, data, …)

data("transport", package="PoEdata")
auto.probit <- glm(auto~dtime, family=binomial(link="probit"),
data=transport)
kable(tidy(auto.probit), digits=4, align='c', caption=
"Transport example, estimated by probit")

Tabla 16.1: Ejemplo de transporte, estimado por Probit

La ecuación 4 se puede usar para calcular los efectos parciales de un aumento de dtime en una
unidad (10 minutos). Las siguientes líneas de código calculan este efecto en dtime = 2 (diferencia
de tiempo de 20 minutos).

xdtime <- data.frame(dtime=2)


predLinear <- predict(auto.probit, xdtime,
data=transport, type="link")
DpDdtime <- coef(auto.probit)[[2]]*dnorm(predLinear)
DpDdtime

## 1
## 0.10369

Las predicciones se pueden calcular utilizando la función predicción, que tiene la siguiente forma
general:

predict(object, newdata = NULL, type = c(“link”, “response”, “terms”), se.fit = FALSE, dispersion
= NULL, terms = NULL, na.action = na.pass, …)

El argumento opcional newdata debe ser un marco de datos que contenga los nuevos valores
de los regresores para los que se desea la predicción; si falta, la predicción se calcula para todas
las observaciones en la muestra.

Aquí es cómo calcular la probabilidad pronosticada de elegir auto cuando la diferencia de tiempo
es de 30 minutos (dtime = 3):
xdtime <- data.frame(dtime=3)
predProbit <- predict(auto.probit, xdtime,
data=transport, type="response")
predProbit

## 1
## 0.798292

El efecto marginal en el valor predicho promedio se puede determinar de la siguiente manera:

avgPredLinear <- predict(auto.probit, type="link")


avgPred <- mean(dnorm(avgPredLinear))
AME <- avgPred*coef(auto.probit)
AME

## (Intercept) dtime
## -0.0103973 0.0484069

16.4 El modelo Logit para la elección binaria


Esto es muy similar al modelo Probit, con la diferencia de que logit usa la función

logística para vincular la expresión lineal a la probabilidad de que la


variable de respuesta sea igual a 1. Las ecuaciones 6 y 7 dan las expresiones definitorias
del modelo logit (las dos expresiones son equivalentes).

La ecuación 8 da el efecto marginal de un cambio en el regresor sobre la

probabilidad de que

data("coke", package="PoEdata")
coke.logit <- glm(coke~pratio+disp_coke+disp_pepsi,
data=coke, family=binomial(link="logit"))
kable(tidy(coke.logit), digits=5, align="c",
caption="Logit estimates for the 'coke' dataset")
Tabla 16.2: Estimaciones logit para el conjunto de datos 'coque'

coke.LPM <- lm(coke~pratio+disp_coke+disp_pepsi,


data=coke)
coke.probit <- glm(coke~pratio+disp_coke+disp_pepsi,
data=coke, family=binomial(link="probit"))
stargazer(coke.LPM, coke.probit, coke.logit,
header=FALSE,
title="Three binary choice models for the 'coke' dataset",
type=.stargazertype,
keep.stat="n",digits=4, single.row=FALSE,
intercept.bottom=FALSE,
model.names=FALSE,
column.labels=c("LPM","probit","logit"))

Tres modelos de elección binaria para el conjunto de datos "coque"


La predicción y los efectos marginales para el modelo Logit se pueden determinar
utilizando la misma función de predicción que para el modelo Probit, y la Ecuación 8
para los efectos marginales.
tble <- data.frame(table(true=coke$coke,
predicted=round(fitted(coke.logit))))
kable(tble, align='c', caption="Logit prediction results")

Tabla 16.3: Resultados de predicción logit

Una medida útil de la capacidad predictiva de un modelo binario es el número de casos


predichos correctamente. La siguiente tabla (creada por las líneas de código anteriores)
proporciona estos números separados por los valores de elección binarios; los números
se han determinado redondeando las probabilidades predichas del modelo Logit.
Las funciones habituales para la prueba de hipótesis, como anova, coeftest, waldtest y
linear.hypesis están disponibles para estos modelos.
Hnull <- "disp_coke+disp_pepsi=0"
linearHypothesis(coke.logit, Hnull)

El código anterior prueba la hipótesis de que los efectos de mostrar coque y mostrar
pepsi tienen efectos iguales pero opuestos, una hipótesis nula que la prueba está
rechazando. Aquí hay otro ejemplo, probando la hipótesis nula de que mostrar coque y
pepsi no tienen (conjuntamente) ningún efecto en la elección de un individuo. Esta
hipótesis también es rechazada.
Hnull <- c("disp_coke=0", "disp_pepsi=0")
linearHypothesis(coke.logit, Hnull)

16.5 Logit Multinomial


Una función R relativamente común que se adapta a modelos Logit multinomiales es
multinom del paquete nnet. Usemos el conjunto de datos nels_small para ver un
ejemplo de cómo funciona multinom. La variable grade en este conjunto de datos son
un índice, con las mejores calificaciones representadas por valores más bajos de grade.
Tratamos de explicar la elección de una institución secundaria (psecoice) solo por el
grado de la escuela secundaria. La variable pschoice puede tomar uno de tres valores:
psechoice = 1 no universidad,
psecoice = 2 dos años de universidad
psechoice = 3 cuatro años de universidad
library(nnet)
data("nels_small", package="PoEdata")
nels.multinom <- multinom(psechoice~grades, data=nels_small)

## # weights: 9 (4 variable)
## initial value 1098.612289
## iter 10 value 875.313116
## final value 875.313099
## converged
summary(nels.multinom)

## Call:
## multinom(formula = psechoice ~ grades, data = nels_small)
##
## Coefficients:
## (Intercept) grades
## 2 2.50527 -0.308640
## 3 5.77017 -0.706247
##
## Std. Errors:
## (Intercept) grades
## 2 0.418394 0.0522853
## 3 0.404329 0.0529264
##
## Residual Deviance: 1750.63
## AIC: 1758.63

La salida de la función multinom proporciona estimaciones de coeficientes para cada


nivel de la variable de respuesta psecoice, excepto el primer nivel, que es el punto de
referencia.
medGrades <- median(nels_small$grades)
fifthPercentileGrades <- quantile(nels_small$grades, .05)
newdat <- data.frame(grades=c(medGrades,
fifthPercentileGrades))
pred <- predict(nels.multinom, newdat, "probs")
pred

Las líneas de código anteriores muestran cómo la función habitual de predit puede
calcular las probabilidades pronosticadas de elegir cualquiera de los tres niveles de
educación secundaria para dos grados arbitrarios: uno en el grado medio en la muestra
y el otro en el quinto por ciento superior.
16.6 El modelo logit condicional
En el modelo logit multinomial, todos los individuos enfrentaron las mismas condiciones
externas y la elección de cada individuo solo está determinada por las circunstancias o
preferencias de un individuo. El modelo logit condicional permite que las personas se
enfrenten a condiciones externas específicas del individuo, como el precio de un
producto.
Supongamos que queremos estudiar el efecto del precio en la decisión de un individuo
sobre elegir una de las tres marcas de refrescos:

1.pepsi
2.sevenup
3.coca
En el modelo logit condicional, la probabilidad de que el individuo i elija la marca j viene
dada por la Ecuación 9.

En la ecuación 9 no todos los parámetros β11, β12 y β13 pueden estimarse, y por lo
tanto, uno se establecerá igual a cero. A diferencia del modelo logit multinomial, el
coeficiente sobre el price variable independiente es el mismo para todas las opciones,
pero el valor de la variable independiente es diferente para cada individuo.
R ofrece varias alternativas que permiten ajustar modelos logit condicionales, uno de
los cuales es la función MCMCmnl () del paquete MCMCpack (otros son, por ejemplo,
clogit () en el paquete de supervival y mclogit () en el paquete de mclogit). El siguiente
código está adaptado de (Adkins 2014).
library(MCMCpack)
data("cola", package="PoEdata")
N <- nrow(cola)
N3 <- N/3
price1 <- cola$price[seq(1,N,by=3)]
price2 <- cola$price[seq(2,N,by=3)]
price3 <- cola$price[seq(3,N,by=3)]

bchoice <- rep("1", N3)


for (j in 1:N3){
if(cola$choice[3*j-1]==1) bchoice[j] <- "2"
if(cola$choice[3*j]==1) bchoice[j] <- "3"
}
cola.clogit <- MCMCmnl(bchoice ~
choicevar(price1, "b2", "1")+
choicevar(price2, "b2", "2")+
choicevar(price3, "b2", "3"),
baseline="3", mcmc.method="IndMH")

## Calculating MLEs and large sample var-cov matrix.


## This may take a moment...
## Inverting Hessian to get large sample var-cov matrix.
sclogit <- summary(cola.clogit)
tabMCMC <- as.data.frame(sclogit$statistics)[,1:2]
row.names(tabMCMC)<- c("b2","b11","b12")
kable(tabMCMC, digits=4, align="c",
caption="Conditional logit estimates for the 'cola' problem")

Tabla 16.4: Estimaciones logit condicionales para el problema "cola"

La Tabla 16.4 muestra los parámetros estimados βij en la Ecuación 9, con la opción 3
(coke) como la línea de base, lo que hace que β13 sea igual a cero. Usando los β s en la
Tabla 16.4, calculemos la probabilidad de que el individuo i elija pepsi y sevenup para
algunos valores dados de los precios que enfrenta el individuo i. Los cálculos siguen la
fórmula en la Ecuación 9, con β13 = 0. Por supuesto, la probabilidad de elegir la marca
de referencia, en este caso Coke, debe ser tal que la suma de las tres probabilidades sea
igual a 1.
pPepsi <- 1
pSevenup <- 1.25
pCoke <- 1.10
b13 <- 0
b2 <- tabMCMC$Mean[1]
b11 <- tabMCMC$Mean[2]
b12 <- tabMCMC$Mean[3]

# The probability that individual i chooses Pepsi:


PiPepsi <- exp(b11+b2*pPepsi)/
(exp(b11+b2*pPepsi)+exp(b12+b2*pSevenup)+
exp(b13+b2*pCoke))
# The probability that individual i chooses Sevenup:
PiSevenup <- exp(b12+b2*pSevenup)/
(exp(b11+b2*pPepsi)+exp(b12+b2*pSevenup)+
exp(b13+b2*pCoke))
# The probability that individual i chooses Coke:
PiCoke <- 1-PiPepsi-PiSevenup

Las probabilidades calculadas son:


Las tres probabilidades son diferentes para individuos diferentes porque individuos
diferentes enfrentan precios diferentes; en un modelo más complejo pueden incluirse
otros regresores, algunos de los cuales pueden reflejar características individuales.
16.7 Modelos de elección ordenada
El orden de elección en estos modelos es significativo, a diferencia del modelo logit
multinomial y condicional que hemos estudiado hasta ahora. El siguiente ejemplo
explica la elección de educación superior, cuando la variable de elección es psecoice y el
único regresor son las grades(calificaciones); El conjunto de datos, nels_small, ya lo
conocemos.
El paquete R MCMCpack se usa nuevamente aquí, con su función MCMCoprobit ().
library(MCMCpack)
nels.oprobit <- MCMCoprobit(psechoice ~ grades,
data=nels_small, mcmc=10000)
sOprobit <- summary(nels.oprobit)
tabOprobit <- sOprobit$statistics[, 1:2]
kable(tabOprobit, digits=4, align="c",
caption="Ordered probit estimates for the 'nels' problem")

Tabla 16.5: Estimaciones Probit ordenadas para el problema 'nels'

La tabla 16.5 da las estimaciones Probit ordenadas. Los resultados de MCMCoprobit se


pueden traducir a las anotaciones de los libros de texto de la siguiente manera:

Las probabilidades para cada elección se pueden calcular como en el siguiente


fragmento de código:
mu1 <- -tabOprobit[1]
b <- tabOprobit[2]
mu2 <- tabOprobit[3]-tabOprobit[1]
xGrade <- c(mean(nels_small$grades),
quantile(nels_small$grades, 0.05))

# Probabilities:
prob1 <- pnorm(mu1-b*xGrade)
prob2 <- pnorm(mu2-b*xGrade)-pnorm(mu1-b*xGrade)
prob3 <- 1-pnorm(mu2-b*xGrade)

# Marginal effects:
Dp1DGrades <- -pnorm(mu1-b*xGrade)*b
Dp2DGrades <- (pnorm(mu1-b*xGrade)-pnorm(mu2-b*xGrade))*b
Dp3DGrades <- pnorm(mu2-b*xGrade)*b

Por ejemplo, el efecto marginal de las grades sobre la probabilidad de asistir a una
universidad de cuatro años para un estudiante con una calificación promedio y para un
estudiante en el 5 por ciento superior es, respectivamente, −0.143 y −0.031.
16.8 Modelos para datos de conteo
Tales modelos utilizan la función de distribución de Poisson, de la variable (contar) y,
como se muestra en las ecuaciones 10 y 11.

data("olympics", package="PoEdata")
olympics.count <- glm(medaltot~log(pop)+log(gdp),
family= "poisson",
na.action=na.omit,
data=olympics)
kable(tidy(olympics.count), digits=4, align='c',
caption="Poisson model for the 'olympics' problem")

Tabla 16.6: Modelo de Poisson para el problema de los "Juegos Olímpicos"

library(AER)
dispersiontest(olympics.count)
##
## Overdispersion test
##
## data: olympics.count
## z = 5.489, p-value = 2.02e-08
## alternative hypothesis: true dispersion is greater than 1
## sample estimates:
## dispersion
## 13.5792

La Tabla 16.6 muestra el resultado de un modelo de conteo para explicar la cantidad de


medallas ganadas por un país según la población y el PIB del país. La función
dispersiontest en el paquete AER prueba la validez de la distribución de Poisson
basándose en la característica de esta distribución de que su media es igual a su
varianza. La hipótesis nula de la prueba es la equidispersión; Rechazar las preguntas
nulas sobre la validez del modelo. Nuestro ejemplo no pasa la prueba de
sobredispersión.
16.9 El Tobit, o modelo de datos censurado
Los datos censurados incluyen un gran número de observaciones para las cuales la
variable dependiente toma uno, o un número limitado de valores. Un ejemplo son los
datos de mroz, donde aproximadamente el 43 por ciento de las mujeres observadas no
están en la fuerza laboral, por lo tanto, sus horas de mercado trabajadas son cero. La
figura 16.2 muestra el histograma de la variable wage en el conjunto de datos mroz.
data("mroz", package="PoEdata")
hist(mroz$hours, breaks=20, col="grey")

Figura 16.2: Histograma para la variable "salario" en el conjunto de datos "mroz"


Un modelo censurado se basa en la idea de una variable latente o no observada que no
se censura, y se explica mediante un modelo Probit, como se muestra en la Ecuación 12.
La variable observable, , es cero para todos que son menores o iguales a cero y

es igual a cuando es mayor que cero. El modelo para los datos censurados se
llama Tobit y se describe en la Ecuación 13.

El efecto marginal de un cambio en en la variable observada está dado por la


Ecuación 14.

library(AER)
mroz.tobit <- tobit(hours~educ+exper+age+kidsl6,
data=mroz)
sMrozTobit <- summary(mroz.tobit)
sMrozTobit

##
## Call:
## tobit(formula = hours ~ educ + exper + age + kidsl6, data = mroz)
##
## Observations:
## Total Left-censored Uncensored Right-censored
## 753 325 428 0
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1349.8763 386.2991 3.49 0.00048 ***
## educ 73.2910 20.4746 3.58 0.00034 ***
## exper 80.5353 6.2878 12.81 < 2e-16 ***
## age -60.7678 6.8882 -8.82 < 2e-16 ***
## kidsl6 -918.9181 111.6607 -8.23 < 2e-16 ***
## Log(scale) 7.0332 0.0371 189.57 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Scale: 1134
##
## Gaussian distribution
## Number of Newton-Raphson Iterations: 4
## Log-likelihood: -3.83e+03 on 6 Df
## Wald-statistic: 243 on 4 Df, p-value: < 2.2e-16

Las siguientes líneas de código calculan el efecto marginal de la educación en horas para
algunos valores dados de los regresores.
xEduc <- 12.29
xExper <- 10.63
xAge <- 42.54
xKids <- 1
bInt <- coef(mroz.tobit)[[1]]
bEduc <- coef(mroz.tobit)[[2]]
bExper <- coef(mroz.tobit)[[3]]
bAge <- coef(mroz.tobit)[[4]]
bKids <- coef(mroz.tobit)[[5]]
bSigma <- mroz.tobit$scale
Phactor <- pnorm((bInt+bEduc*xEduc+bExper*xExper+
bAge*xAge+bKids*xKids)/bSigma)
DhoursDeduc <- bEduc*Phactor

El efecto marginal calculado es 26.606. (La función censReg () del paquete censReg
también se puede usar para estimar modelos de Tobit; esta función brinda la posibilidad
de calcular efectos marginales utilizando la función margEff ()).
16.10 El Heckit, o modelo de selección de muestra
Los modelos son útiles cuando la selección de la muestra no es aleatoria, pero cuando
un individuo está en la muestra depende de las características individuales. Por ejemplo,
al estudiar la determinación del salario para las mujeres casadas, algunas mujeres no
están en la fuerza laboral, por lo tanto, su salario es cero.
El modelo a usar en tal situación es Heckit, que involucra dos ecuaciones: la ecuación de
selección, dada en la Ecuación 15, y la ecuación lineal de interés, como en la Ecuación
16.

las estimaciones de los se pueden obtener usando mínimos cuadrados en el

modelo de la Ecuación 17, donde se calcula utilizando la fórmula de la Ecuación 18.

La cantidad λ dada por la Ecuación 18 se llama inverse Mills ratio.


El procedimiento Heckit involucra dos pasos, estimando tanto la ecuación de selección
como la ecuación de interés. La función selection() en el paquete sampleSelection realiza
ambos pasos; por lo tanto, necesita ambas ecuaciones entre sus argumentos. (La
ecuación de selección es, de hecho, un modelo Probit.)
library(sampleSelection)
wage.heckit <- selection(lfp~age+educ+I(kids618+kidsl6)+mtr,
log(wage)~educ+exper,
data=mroz, method="ml")
summary(wage.heckit)

## --------------------------------------------
## Tobit 2 model (sample selection model)
## Maximum Likelihood estimation
## Newton-Raphson maximisation, 4 iterations
## Return code 2: successive function values within tolerance limit
## Log-Likelihood: -913.513
## 753 observations (325 censored and 428 observed)
## 10 free parameters (df = 743)
## Probit selection equation:
## Estimate Std. error t value Pr(> t)
## (Intercept) 1.53798 0.61889 2.49 0.013 *
## age -0.01346 0.00603 -2.23 0.026 *
## educ 0.06278 0.02180 2.88 0.004 **
## I(kids618 + kidsl6) -0.05108 0.03276 -1.56 0.119
## mtr -2.20864 0.54620 -4.04 0.000053 ***
## Outcome equation:
## Estimate Std. error t value Pr(> t)
## (Intercept) 0.64622 0.23557 2.74 0.0061 **
## educ 0.06646 0.01657 4.01 0.000061 ***
## exper 0.01197 0.00408 2.93 0.0034 **
## Error terms:
## Estimate Std. error t value Pr(> t)
## sigma 0.8411 0.0430 19.6 <2e-16 ***
## rho -0.8277 0.0391 -21.2 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## --------------------------------------------
CAPÍTULO 15 MODELOS DE DATOS DEL PANEL
rm(list=ls()) #Removes all items in Environment!
library(plm)
library(tseries) # for `adf.test()`
library(dynlm) #for function `dynlm()`
library(vars) # for function `VAR()`
library(nlWaldTest) # for the `nlWaldtest()` function
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for `kable()`
library(forecast)
library(systemfit)
library(AER)
library(xtable)

Nuevo paquete: plm (Croissant y Millo 2015).


Los datos del panel recopilan información sobre varios individuos (unidades
transversales) durante varios períodos. El panel está equilibrado si se observan todas las
unidades en todos los períodos; Si faltan algunas unidades en algunos períodos, el panel
no está equilibrado. La ecuación 1 da la forma de un modelo de datos de panel
agrupado, donde el subíndice i = 1, ..., N denota un individuo (unidad de sección
transversal), y t = 1, ..., T denota el período de tiempo, o longitudinal unidad. El número
total de observaciones en el panel es N × T.

15.1 Organizando los datos como un panel


Un panel ancho tiene la dimensión de la sección transversal (N) mucho más grande que
la dimensión longitudinal (T); Cuando lo contrario es cierto, tenemos un panel largo.
Normalmente, las mismas unidades se observan en todos los periodos; cuando este no
es el caso y cada período muestra principalmente otras unidades, el resultado no es un
panel de datos adecuado, sino un modelo de secciones cruzadas agrupadas.
Este manual utiliza el paquete de datos de panel plm (), que también ofrece la
posibilidad de organizar los datos en forma de panel. Los conjuntos de paneles se
pueden organizar principalmente en dos formas: la forma larga tiene una columna para
cada variable y una fila para cada período individual; la forma ancha tiene una columna
para cada período variable y una fila para cada individuo. La mayoría de los métodos de
datos de panel requieren un formulario largo, pero muchas fuentes de datos
proporcionan una tabla de formato ancho para cada variable; ensamblar los datos de
diferentes fuentes en un marco de datos de forma larga a menudo no es un asunto
trivial.
La siguiente secuencia de código crea una estructura de panel para el conjunto de datos
nls_panel utilizando la función pdata.frame del paquete plm y muestra una pequeña
parte de este conjunto de datos. Tenga en cuenta cómo se realiza la selección de las filas
y columnas que se mostrarán, utilizando el operador compacto% in% y matrices como
c (1: 6, 14:15). La tabla 15.1 muestra esta muestra.
library(xtable)
data("nls_panel", package="PoEdata")
nlspd <- pdata.frame(nls_panel, index=c("id", "year"))
smpl <- nlspd[nlspd$id %in% c(1,2),c(1:6, 14:15)]
tbl <- xtable(smpl)
kable(tbl, digits=4, align="c",
caption="A data sample")

Tabla 15.1: Una muestra de datos

La función pdim () extrae las dimensiones de los datos del panel:


pdim(nlspd)
## Balanced Panel: n=716, T=5, N=3580

15.2 El modelo agrupado


Un modelo agrupado tiene la especificación en la Ecuación 1, que no permite interceptar
o diferencias de pendiente entre individuos. Tal modelo se puede estimar en R utilizando
la agrupación de especificaciones en la función plm (), como lo ilustra la siguiente
secuencia de código.
wage.pooled <- plm(lwage~educ+exper+I(exper^2)+
tenure+I(tenure^2)+black+south+union,
model="pooling", data=nlspd)
kable(tidy(wage.pooled), digits=3,
caption="Pooled model")

Tabla 15.2: Modelo agrupado

La función plm () acepta los siguientes argumentos principales, donde los parámetros
mostrados como vectores c (...), como el effect y el model, solo pueden tomar un valor
a la vez fuera de la lista proporcionada.
plm(formula, data, subset, na.action, effect = c("individual",
"time", "twoways"), model = c("within", "random", "ht",
"between", "pooling", "fd"),...)
tbl <- tidy(coeftest(wage.pooled, vcov=vcovHC(wage.pooled,
type="HC0",cluster="group")))
kable(tbl, digits=5, caption=
"Pooled 'wage' model with cluster robust standard errors")

Tabla 15.3: Modelo de "wage" agrupado con errores estándar robustos de grupo
15.3 El modelo de efectos fijos
El modelo de efectos fijos tiene en cuenta las diferencias individuales, traducidas en
diferentes intercepciones de la línea de regresión para diferentes individuos. El modelo
en este caso asigna el subíndice i al término constante β1, como se muestra en la
Ecuación 2; Los términos constantes calculados de esta manera se llaman efectos fijos.

Las variables que cambian poco o nada en el tiempo, como algunas características
individuales, no deben incluirse en un modelo de efectos fijos porque producen
colinealidad con los efectos fijos.
nls10 <- pdata.frame(nls_panel[nls_panel$id %in% 1:10,])
## series nev_mar, not_smsa, south are constants and have been removed

wage.fixed <- lm(lwage~exper+I(exper^2)+


tenure+I(tenure^2)+union+factor(id)-1,
data=nls10)
kable(tidy(wage.fixed), digits=3,
caption="Fixed effects in a subsample")
Tabla 15.4: Efectos fijos en una submuestra

La Tabla 15.4 muestra los resultados de una regresión OLS en una submuestra de los
primeros 10 individuos en el conjunto de datos nls_panel. La tabla se genera mediante
la secuencia de códigos anterior, donde la novedad utiliza la variable de factor id. La
función factor() genera variables ficticias para todas las categorías de la variable,
tomando la primera categoría como referencia. Para incluir la referencia en la salida, es
necesario excluir la constante del modelo de regresión incluyendo el término -1 en la
fórmula de regresión. Cuando no se excluye la constante, los coeficientes de las variables
ficticias representan, como de costumbre, la diferencia entre la categoría respectiva y la
de referencia.
Sin embargo, para estimar un efecto fijo en R no necesitamos crear las variables ficticias,
sino usar la opción model = "within" en la función plm (). El siguiente fragmento de
código utiliza la muestra completa.
wage.within <- plm(lwage~exper+I(exper^2)+
tenure+I(tenure^2)+south+union,
data=nlspd,
model="within")
tbl <- tidy(wage.within)
kable(tbl, digits=5, caption=
"Fixed effects using 'within' with full sample")
Tabla 15.5: Efectos fijos utilizando "dentro" con muestra completa

wage10.within <- plm(lwage~exper+I(exper^2)+


tenure+I(tenure^2)+union,
data=nls10,
model="within")
tbl <- tidy(wage10.within)
kable(tbl, digits=5, caption=
"Fixed effects using the 'within' model option for n=10")

Tabla 15.6: Efectos fijos utilizando la opción del modelo ‘dentro’ para n = 10

La Tabla 15.6 presenta los resultados del modelo de efectos fijos para la submuestra de
10 individuos del conjunto de datos nls_panel. Esto debe compararse con la Tabla 15.4
para ver que el método whitin interno es equivalente a incluir los maniquíes en el
modelo. Una comparación interesante es entre los modelos de efectos combinados y
fijos. Al comparar la Tabla 15.2 con la Tabla 15.5, se puede observar que el hecho de
incluir la heterogeneidad individual reduce significativamente los efectos marginales de
las variables.
Comprobar si los efectos fijos son necesarios es comparar el salario del modelo de
wage.within con el modelo wage.within. La función pFtest() hace esta comparación,
como en las siguientes líneas de código.
kable(tidy(pFtest(wage.within, wage.pooled)), caption=
"Fixed effects test: Ho:'No fixed effects'")

Tabla 15.7: Prueba de efectos fijos: Ho: "Sin efectos fijos"

La tabla 15.7 muestra que la hipótesis nula de no tener efectos fijos es rechazada.
15.4 El modelo de efectos aleatorios
El modelo de efectos aleatorios elabora el modelo de efectos fijos al reconocer que,
dado que los individuos en el panel se seleccionan al azar, sus características, medidas

por el intercepto , también deben ser aleatorios. Por lo tanto, el modelo de efectos

aleatorios asume la forma de la intersección como se indica en la Ecuación 3, donde


representa el promedio de la población y representa un término aleatorio específico
del individuo. Como en el caso de los efectos fijos, los efectos aleatorios también son
invariantes en el tiempo.

Si esta forma de intercepción se reemplaza en la Ecuación 2, el resultado se parece a la


Ecuación 4.

La intercepción se encuentra aquí, a diferencia del modelo de efectos fijos constante en

los individuos, pero el término de error, incorpora tanto los detalles individuales
como el término de error de regresión inicial, como lo muestra la Ecuación 5.

Por lo tanto, el modelo de efectos aleatorios se distingue por la estructura especial de

su término de error: los errores tienen media cero, una varianza igual a , no

correlacionada entre los individuos, y con una covarianza en el tiempo igual a


Una característica importante del modelo de efectos aleatorios es que la correlación de
tiempo en los errores no disminuye con el tiempo (ver Ecuación 6).
La prueba de los efectos aleatorios equivale a probar la hipótesis de que no hay
diferencias entre los individuos, lo que implica que la variable aleatoria específica del
individuo tiene una variación cero. La ecuación 7 muestra la hipótesis a probar.

La misma función que usamos para los efectos fijos se puede usar para los efectos
aleatorios, pero configurando el argumento del model = a 'aleatorio' y seleccionando el
random.method como una de cada cuatro posibilidades: "swar" (predeterminado),
"amemiya", " walhus ”, o“ nerlove ”. La función de prueba de efectos aleatorios es
plmtest (), que toma como principal argumento el modelo de agrupación (de hecho,
extrae los residuos del objeto de agrupación).
wageReTest <- plmtest(wage.pooled, effect="individual")
kable(tidy(wageReTest), caption=
"A random effects test for the wage equation")

Tabla 15.8: Una prueba de efectos aleatorios para la ecuación salarial

La Tabla 15.8 muestra que se rechaza la hipótesis nula de varianza cero en errores
específicos del individuo; por lo tanto, la heterogeneidad entre individuos puede ser
significativa.
El estimador de efectos aleatorios es confiable bajo el supuesto de que las características
individuales (heterogeneidad) son exógenas, es decir, son independientes con respecto
a los regresores en la ecuación de efectos aleatorios. La misma prueba de Hausman para
la endogeneidad que ya hemos utilizado en otro capítulo también se puede usar aquí,
con la hipótesis nula de que los efectos aleatorios individuales son exógenos. La función
de prueba phtest () compara los modelos de efectos fijos y de efectos aleatorios; las
siguientes líneas de código estiman el modelo de efectos aleatorios y realizan la prueba
de endogeneidad de Hausman.
wage.random <- plm(lwage~educ+exper+I(exper^2)+
tenure+I(tenure^2)+black+south+union,
data=nlspd, random.method="swar",
model="random")
kable(tidy(wage.random), digits=4, caption=
"The random effects results for the wage equation")
Tabla 15.9: Resultados de los efectos aleatorios para la ecuación salarial

kable(tidy(phtest(wage.within, wage.random)), caption=


"Hausman endogeneity test for the random effects wage model")

Tabla 15.10: Prueba de endogeneidad de Hausman para el modelo de salario de efectos


aleatorios

La Tabla 15.10 muestra un valor de p bajo de la prueba, lo que indica que la hipótesis
nula que dice que los efectos aleatorios individuales son exógenos se rechaza, lo que
hace que la ecuación de los efectos aleatorios sea inconsistente. En este caso, el modelo
de efectos fijos es la solución correcta. (El número de parámetros en la Tabla 15.10 se
da solo para las variables que varían en el tiempo).
El modelo de efectos fijos, sin embargo, no permite variables invariantes en el tiempo
como educ o black. Dado que el problema del modelo de efectos aleatorios es la
endogeneidad, se pueden usar métodos de variables instrumentales cuando deben
estar en el modelo regresores invariantes en el tiempo. El estimador de Hausman-Taylor
usa variables instrumentales en un modelo de efectos aleatorios; asume cuatro
categorías de regresores: exógeno variable en el tiempo, endógeno variable en el
tiempo, exógeno invariante en el tiempo y endógeno invariante en el tiempo.. El número
de variables que varían en el tiempo debe ser al menos igual al número de variables
invariantes en el tiempo. En nuestro modelo de wage, supongamos que exper, tenure y
union son exógenas que varían con el tiempo, south es endógena que varía con el
tiempo, el black es exógeno invariante en el tiempo, y educ es endógeno con invariante
en el tiempo. La misma función plm () permite realizar una estimación de Hausman-
Taylor al configurar el model= "ht".
wage.HT <- plm(lwage~educ+exper+I(exper^2)+
tenure+I(tenure^2)+black+south+union |
exper+I(exper^2)+tenure+I(tenure^2)+union+black,
data=nlspd, model="ht")
kable(tidy(wage.HT), digits=5, caption=
"Hausman-Taylor estimates for the wage equation")

Tabla 15.11: estimaciones de Hausman-Taylor para la ecuación salarial

La Tabla 15.11 muestra los resultados de la estimación de Hausman-Taylor, con los


cambios más grandes que tienen lugar para educ y black.
15.5 Ejemplo de inversión de Grunfeld
El conjunto de datos grunfeld2 es un subconjunto del conjunto de datos inicial; incluye
dos empresas, GE y WE observaron durante el período 1935 a 1954. El propósito de este
ejemplo es identificar varios problemas que deben tenerse en cuenta al crear un modelo
econométrico de datos de panel. El problema es encontrar los determinantes de la
inversión por parte de una empresa, entre los regresores, como el valor de la

empresa, y el capital social . La tabla 15.12 da un vistazo a los datos del panel
de grunfeld.
data("grunfeld2", package="PoEdata")
grun <- pdata.frame(grunfeld2, index=c("firm","year"))
kable(head(grun), align="c", caption=
"The head of the grunfeld2 dataset organized as a panel")
Tabla 15.12: El jefe del conjunto de datos grunfeld2 organizado como un panel

Consideremos primero un modelo de agrupación, asumiendo que los coeficientes de la


ecuación de regresión, así como las variaciones de error son las mismas para ambas
empresas (sin heterogeneidad individual).
grun.pool <- plm(inv~v+k,
model="pooling",data=grun)
kable(tidy(grun.pool), digits=5, caption=
"Grunfeld dataset, pooling panel data results")

Tabla 15.13: conjunto de datos de Grunfeld, resultados de datos del panel de agrupación

SSE.pool <- sum(resid(grun.pool)^2)


sigma2.pool <- SSE.pool/(grun.pool$df.residual)

Para el modelo de pooling,


Permitir diferentes coeficientes entre las empresas, pero la misma estructura de error
es el modelo de efectos fijos que se resume en la Tabla 15.14. Tenga en cuenta que los
efectos fijos se modelan utilizando la función factor().
grun.fe <- plm(inv~v*grun$firm+k*grun$firm,
model="pooling",data=grun)
kable(tidy(grun.fe), digits=4, caption=
"Grunfeld dataset, 'pooling' panel data results")
Tabla 15.14: conjunto de datos de Grunfeld, resultados de datos del panel de
"agrupación"

SSE.fe <- sum(resid(grun.fe)^2)


sigma2.fe <- SSE.fe/(grun.fe$df.residual)

Para el modelo de efectos fijos con dummy firmes,

Se puede hacer una prueba para ver si los coeficientes son significativamente diferentes
entre la agrupación y las ecuaciones de efectos fijos en R usando la función pooltest del
paquete plm; Para realizar esta prueba, el modelo de efectos fijos se debe estimar con
la función pvcm con el argumento model = "within", como se muestra en las siguientes
líneas de código.
grun.pvcm <- pvcm(inv~v+k,
model="within", data=grun)
coef(grun.pvcm)

pooltest(grun.pool, grun.pvcm)

##
## F statistic
##
## data: inv ~ v + k
## F = 1.189, df1 = 3, df2 = 34, p-value = 0.328
## alternative hypothesis: unstability
El resultado muestra que la hipótesis nula de coeficientes cero para los términos ficticios
individuales es cero no puede ser rechazada. (Sin embargo, la función pvcm no es
equivalente al modelo de efectos fijos que utiliza variables ficticias individuales; sin
embargo, es útil para probar la "poolability" de un conjunto de datos).
Ahora, si permitimos diferentes coeficientes y diferentes variaciones de error, las
ecuaciones para cada individuo son independientes de las de otros individuos y se
pueden estimar por separado.
grun1.pool <- plm(inv~v+k, model="pooling",
subset=grun$firm==1, data=grun)
SSE.pool1<- sum(resid(grun1.pool)^2)
sig2.pool1 <- SSE.pool1/grun1.pool$df.residual
kable(tidy(grun1.pool), digits=4, align='c', caption=
"Pooling astimates for the GE firm (firm=1)")

Tabla 15.15: Agrupación de las estimaciones de la firma de GE (firma = 1)

grun2.pool <- plm(inv~v+k, model="pooling",


subset=grun$firm==2, data=grun)
SSE.pool2 <- sum(resid(grun2.pool)^2)
sig2.pool2 <- SSE.pool2/grun2.pool$df.residual
kable(tidy(grun2.pool), digits=4, align='c', caption=
"Pooling estimates for the WE firm (firm=2)")

Tabla 15.16: Estimaciones de agrupamiento para la firma WE (firma = 2)

Las tablas 15.15 y 15.16 muestran los resultados de las ecuaciones en subconjuntos de
datos, separados por empresas.
Se puede realizar una prueba de Goldfeld-Quandt para determinar si las variaciones son
diferentes entre las empresas, como se muestra en el siguiente código.
gqtest(grun.pool, point=0.5, alternative="two.sided",
order.by=grun$firm)

##
## Goldfeld-Quandt test
##
## data: grun.pool
## GQ = 0.1342, df1 = 17, df2 = 17, p-value = 0.000143

El resultado es el rechazo de la hipótesis nula de que las varianzas son iguales, lo que
indica que estimar ecuaciones separadas para cada empresa es el modelo correcto.
¿Qué sucede cuando asumimos que el único vínculo entre las dos empresas es la
correlación entre sus términos de error contemporáneos? Este es el modelo de
regresiones aparentemente no relacionadas, un método de mínimos cuadrados
generalizado.
library("systemfit")
grunf<- grunfeld2
grunf$Firm<-"WE"
for (i in 1:40){
if(grunf$firm[i]==1){grunf$Firm[i] <- "GE"}
}
grunf$firm <- NULL
names(grunf)<- c("inv", "val", "cap", "year", "firm")
grunfpd <- plm.data(grunf, c("firm","year"))
grunf.SUR <- systemfit(inv~val+cap, method="SUR", data=grunfpd)
summary(grunf.SUR, resdCov=FALSE, equations=FALSE)

##
## systemfit results
## method: SUR
##
## N DF SSR detRCov OLS-R2 McElroy-R2
## system 40 34 15590 35641 0.69897 0.6151
##
## N DF SSR MSE RMSE R2 Adj R2
## GE 20 17 13788.4 811.08 28.479 0.69256 0.65639
## WE 20 17 1801.3 105.96 10.294 0.74040 0.70986
##
## The covariance matrix of the residuals used for estimation
## GE WE
## GE 777.45 207.59
## WE 207.59 104.31
##
## The covariance matrix of the residuals
## GE WE
## GE 811.08 224.28
## WE 224.28 105.96
##
## The correlations of the residuals
## GE WE
## GE 1.00000 0.76504
## WE 0.76504 1.00000
##
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## GE_(Intercept) -27.719317 29.321219 -0.9454 0.357716
## GE_val 0.038310 0.014415 2.6576 0.016575 *
## GE_cap 0.139036 0.024986 5.5647 0.00003423 ***
## WE_(Intercept) -1.251988 7.545217 -0.1659 0.870168
## WE_val 0.057630 0.014546 3.9618 0.001007 **
## WE_cap 0.063978 0.053041 1.2062 0.244256
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Primero, tenga en cuenta que la función systemfit () requiere un archivo de datos de


panel creado con plm.data, en lugar del pdata.frame que hemos utilizado
anteriormente; segundo, por alguna razón tuve que cambiar los nombres de las
variables a nombres que tienen más de una letra para que la función funcione. Hice esto
usando la función names ().
CAPÍTULO 14 VOLATILIDAD QUE VARÍA EN EL TIEMPO Y
MODELOS ARCH
rm(list=ls()) #Removes all items in Environment!
library(FinTS) #for function `ArchTest()`
library(rugarch) #for GARCH models
library(tseries) # for `adf.test()`
library(dynlm) #for function `dynlm()`
library(vars) # for function `VAR()`
library(nlWaldTest) # for the `nlWaldtest()` function
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for `kable()`
library(forecast)

Nuevos paquetes: FinTS (Graves 2014) y rugarch (Ghalanos 2015).


El modelo de heteroscedasticidad condicional autorregresiva (ARCH, por sus siglas en
inglés) se refiere a series de tiempo con heteroscedasticidad variable en el tiempo,
donde la varianza está condicionada a la información existente en un momento dado.
14.1 El modelo ARCH
El modelo ARCH supone que la media condicional del término de error en un modelo de
serie temporal es constante (cero), a diferencia de las series no estacionarias que hemos
analizado hasta ahora, pero su varianza condicional no lo es. Dicho modelo se puede
describir como en las ecuaciones 1, 2 y 3.

Las ecuaciones 4 y 5 dan el modelo de prueba y las hipótesis para probar los efectos

ARCH en una serie de tiempo, donde los residuos provienen de la regresión de la

variable en una constante, como 1, o en una constante más otros regresores; La


prueba que se muestra en la Ecuación 4 puede incluir varios términos de retraso, en
cuyo caso la hipótesis nula (Ecuación 5) sería que todos ellos son conjuntamente
insignificantes.
La hipótesis nula es que no hay efectos ARCH. La prueba estadística es

El siguiente ejemplo utiliza el byd del conjunto de datos, que contiene 500 observaciones
generadas en las devoluciones a las acciones en BrightenYourDay Lighting. La figura 14.1
muestra una gráfica de series de tiempo de los datos y el histograma.
data("byd", package="PoEdata")
rTS <- ts(byd$r)
plot.ts(rTS)
hist(rTS, main="", breaks=20, freq=FALSE, col="grey")
Primero realicemos, paso a paso, la prueba ARCH descrita en las ecuaciones 4 y 5, en la
variable r del conjunto de datos byd.
byd.mean <- dynlm(rTS~1)
summary(byd.mean)

##
## Time series regression with "ts" data:
## Start = 1, End = 500
##
## Call:
## dynlm(formula = rTS ~ 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.847 -0.723 -0.049 0.669 5.931
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.078 0.053 20.4 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.19 on 499 degrees of freedom

ehatsq <- ts(resid(byd.mean)^2)


byd.ARCH <- dynlm(ehatsq~L(ehatsq))
summary(byd.ARCH)
##
## Time series regression with "ts" data:
## Start = 2, End = 500
##
## Call:
## dynlm(formula = ehatsq ~ L(ehatsq))
##
## Residuals:
## Min 1Q Median 3Q Max
## -10.802 -0.950 -0.705 0.320 31.347
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.908 0.124 7.30 1.1e-12 ***
## L(ehatsq) 0.353 0.042 8.41 4.4e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.45 on 497 degrees of freedom
## Multiple R-squared: 0.125, Adjusted R-squared: 0.123
## F-statistic: 70.7 on 1 and 497 DF, p-value: 4.39e-16

T <- nobs(byd.mean)
q <- length(coef(byd.ARCH))-1
Rsq <- glance(byd.ARCH)[[1]]
LM <- (T-q)*Rsq
alpha <- 0.05
Chicr <- qchisq(1-alpha, q)

El resultado es el estadístico LM, igual a 62.16, que debe compararse con el valor crítico
de chi-cuadrado con α = 0.05 y q = 1 grado de libertad; este valor es χ2 (0.95,1) = 3.84;
esto indica que la hipótesis nula se rechaza, concluyendo que la serie tiene efectos
ARCH.
Se puede llegar a la misma conclusión si, en lugar del procedimiento paso a paso, usamos
una de las capacidades de prueba ARCH de R, la función ArchTest () en el paquete FinTS.
bydArchTest <- ArchTest(byd, lags=1, demean=TRUE)
bydArchTest

##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: byd
## Chi-squared = 62.16, df = 1, p-value = 3.22e-15

La función garch () en el paquete tseries, se convierte en un modelo ARCH cuando se usa


con el order = argumento igual a c(0,1). Esta función se puede usar para estimar y trazar
la varianza definida en la Ecuación 3, como se muestra en el siguiente código y en la
Figura 14.2.
byd.arch <- garch(rTS,c(0,1))

##
## ***** ESTIMATION WITH ANALYTICAL GRADIENT *****
##
##
## I INITIAL X(I) D(I)
##
## 1 1.334069e+00 1.000e+00
## 2 5.000000e-02 1.000e+00
##
## IT NF F RELDF PRELDF RELDX STPPAR D*STEP
NPRELDF
## 0 1 5.255e+02
## 1 2 5.087e+02 3.20e-02 7.13e-01 3.1e-01 3.8e+02 1.0e+00
1.34e+02
## 2 3 5.004e+02 1.62e-02 1.78e-02 1.2e-01 1.9e+00 5.0e-01
2.11e-01
## 3 5 4.803e+02 4.03e-02 4.07e-02 1.2e-01 2.1e+00 5.0e-01
1.42e-01
## 4 7 4.795e+02 1.60e-03 1.99e-03 1.3e-02 9.7e+00 5.0e-02
1.36e-02
## 5 8 4.793e+02 4.86e-04 6.54e-04 1.2e-02 2.3e+00 5.0e-02
2.31e-03
## 6 9 4.791e+02 4.16e-04 4.93e-04 1.2e-02 1.7e+00 5.0e-02
1.39e-03
## 7 10 4.789e+02 3.80e-04 4.95e-04 2.3e-02 4.6e-01 1.0e-01
5.36e-04
## 8 11 4.789e+02 6.55e-06 6.73e-06 9.0e-04 0.0e+00 5.1e-03
6.73e-06
## 9 12 4.789e+02 4.13e-08 3.97e-08 2.2e-04 0.0e+00 9.8e-04
3.97e-08
## 10 13 4.789e+02 6.67e-11 6.67e-11 9.3e-06 0.0e+00 4.2e-05
6.67e-11
##
## ***** RELATIVE FUNCTION CONVERGENCE *****
##
## FUNCTION 4.788831e+02 RELDX 9.327e-06
## FUNC. EVALS 13 GRAD. EVALS 11
## PRELDF 6.671e-11 NPRELDF 6.671e-11
##
## I FINAL X(I) D(I) G(I)
##
## 1 2.152304e+00 1.000e+00 -2.370e-06
## 2 1.592050e-01 1.000e+00 -7.896e-06

sbydarch <- summary(byd.arch)


sbydarch

##
## Call:
## garch(x = rTS, order = c(0, 1))
##
## Model:
## GARCH(0,1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.459 0.220 0.668 1.079 4.293
##
## Coefficient(s):
## Estimate Std. Error t value Pr(>|t|)
## a0 2.1523 0.1857 11.59 <2e-16 ***
## a1 0.1592 0.0674 2.36 0.018 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Diagnostic Tests:
## Jarque Bera Test
##
## data: Residuals
## X-squared = 48.57, df = 2, p-value = 2.85e-11
##
##
## Box-Ljung test
##
## data: Squared.Residuals
## X-squared = 0.1224, df = 1, p-value = 0.726

hhat <- ts(2*byd.arch$fitted.values[-1,1]^2)


plot.ts(hhat)

Figura 14.2: variación estimada de ARCH (1) para el conjunto de datos "byd"
14.2 El modelo GARCH
# Using package `rugarch` for GARCH models
library(rugarch)
garchSpec <- ugarchspec(
variance.model=list(model="sGARCH",
garchOrder=c(1,1)),
mean.model=list(armaOrder=c(0,0)),
distribution.model="std")
garchFit <- ugarchfit(spec=garchSpec, data=rTS)
coef(garchFit)

## mu omega alpha1 beta1 shape


## 1.049280 0.396544 0.495161 0.240827 99.999225

rhat <- garchFit@fit$fitted.values


plot.ts(rhat)
hhat <- ts(garchFit@fit$sigma^2)
plot.ts(hhat)

Figura 14.3: Modelo GARCH estándar (sGARCH) con el conjunto de datos ‘byd’
# tGARCH
garchMod <- ugarchspec(variance.model=list(model="fGARCH",
garchOrder=c(1,1),
submodel="TGARCH"),
mean.model=list(armaOrder=c(0,0)),
distribution.model="std")
garchFit <- ugarchfit(spec=garchMod, data=rTS)
coef(garchFit)

## mu omega alpha1 beta1 eta11 shape


## 0.986682 0.352207 0.390636 0.375328 0.339432 99.999884

rhat <- garchFit@fit$fitted.values


plot.ts(rhat)
hhat <- ts(garchFit@fit$sigma^2)
plot.ts(hhat)

Figura 14.4: El modelo tGARCH con el conjunto de datos ‘byd’


# GARCH-in-mean
garchMod <- ugarchspec(
variance.model=list(model="fGARCH",
garchOrder=c(1,1),
submodel="APARCH"),
mean.model=list(armaOrder=c(0,0),
include.mean=TRUE,
archm=TRUE,
archpow=2
),
distribution.model="std"
)
garchFit <- ugarchfit(spec=garchMod, data=rTS)
coef(garchFit)

## mu archm omega alpha1 beta1 eta11


## 0.820603 0.193476 0.368730 0.442930 0.286748 0.185531
## lambda shape
## 1.897586 100.000000

rhat <- garchFit@fit$fitted.values


plot.ts(rhat)
hhat <- ts(garchFit@fit$sigma^2)
plot.ts(hhat)
Figura 14.5: Una versión del modelo GARCH-in-mean con el conjunto de datos ‘byd’
Las figuras 14.3, 14.4 y 14.5 muestran algunas versiones del modelo GARCH. Las
predicciones se pueden obtener utilizando la función ugarchboot () del paquete ugarch.
CAPÍTULO 13 MODELOS VEC Y VAR
rm(list=ls()) #Removes all items in Environment!
library(tseries) # for `adf.test()`
library(dynlm) #for function `dynlm()`
library(vars) # for function `VAR()`
library(nlWaldTest) # for the `nlWaldtest()` function
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for `kable()`
library(forecast)

Nuevo paquete: vars (Pfaff 2013).


Cuando no hay una buena razón para asumir una relación causal unidireccional entre
dos variables de series de tiempo, podemos pensar que su relación es una de interacción
mutua. El concepto de "vector", como en la corrección de errores vectoriales, se refiere
a una serie de series en dicho modelo.
13.1 modelos VAR y VEC
Las ecuaciones 1 y 2 muestran un modelo genérico de autorregresión vectorial de orden
1, VAR (1), que puede estimarse si las dos series son I(0). Si son I(1), las mismas
ecuaciones deben estimarse en las primeras diferencias.

Si las dos variables en las ecuaciones 1 y 2 se cointegran, su relación de cointegración


debe tenerse en cuenta en el modelo, ya que es información valiosa; tal modelo se llama
corrección de error vectorial. La relación de cointegración es, recuerde, como se
muestra en la Ecuación 3, donde se ha demostrado que el término de error es
estacionario.

13.2 Estimación de un modelo VEC


El método más simple es un procedimiento de dos pasos. Primero, estime la relación de
cointegración dada en la Ecuación 3 y cree las series residuales resultantes retrasadas

Segundo, estime las ecuaciones 4 y 5 por OLS.


El siguiente ejemplo utiliza el conjunto de datos gdp, que incluye series de PIB para
Australia y EE. UU. Para el período desde 1970: 1 a 2000: 4. Primero determinamos el
orden de integración de las dos series.
data("gdp", package="PoEdata")
gdp <- ts(gdp, start=c(1970,1), end=c(2000,4), frequency=4)

ts.plot(gdp[,"usa"],gdp[,"aus"], type="l",
lty=c(1,2), col=c(1,2))
legend("topleft", border=NULL, legend=c("USA","AUS"),
lty=c(1,2), col=c(1,2))

Figura 13.1: series del PIB de Australia y Estados Unidos a partir del conjunto de datos
‘gdp '

La figura 13.1 representa las dos series en niveles, revelando una tendencia común y,
por lo tanto, sugiere que las series no son estacionarias.
adf.test(gdp[,"usa"])
##
## Augmented Dickey-Fuller Test
##
## data: gdp[, "usa"]
## Dickey-Fuller = -0.9083, Lag order = 4, p-value = 0.949
## alternative hypothesis: stationary

adf.test(gdp[,"aus"])

##
## Augmented Dickey-Fuller Test
##
## data: gdp[, "aus"]
## Dickey-Fuller = -0.6124, Lag order = 4, p-value = 0.975
## alternative hypothesis: stationary

adf.test(diff(gdp[,"usa"]))

##
## Augmented Dickey-Fuller Test
##
## data: diff(gdp[, "usa"])
## Dickey-Fuller = -4.293, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

adf.test(diff(gdp[,"aus"]))

##
## Augmented Dickey-Fuller Test
##
## data: diff(gdp[, "aus"])
## Dickey-Fuller = -4.417, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

Las pruebas de estacionariedad indican que ambas series son I(1). Ahora probemos las
cointegraciones, utilizando las ecuaciones 6 y 7.

cint1.dyn <- dynlm(aus~usa-1, data=gdp)


kable(tidy(cint1.dyn), digits=3,
caption="The results of the cointegration equation
'cint1.dyn'")
Tabla 13.1: Los resultados de la ecuación de cointegración 'cint1.dyn'

ehat <- resid(cint1.dyn)


cint2.dyn <- dynlm(d(ehat)~L(ehat)-1)
summary(cint2.dyn)

##
## Time series regression with "ts" data:
## Start = 1970(2), End = 2000(4)
##
## Call:
## dynlm(formula = d(ehat) ~ L(ehat) - 1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.4849 -0.3370 -0.0038 0.4656 1.3507
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## L(ehat) -0.1279 0.0443 -2.89 0.0046 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.598 on 122 degrees of freedom
## Multiple R-squared: 0.064, Adjusted R-squared: 0.0564
## F-statistic: 8.35 on 1 and 122 DF, p-value: 0.00457

Nuestra prueba rechaza la nula de no cointegración, lo que significa que las series están
cointegradas. Con series cointegradas podemos construir un modelo VEC para
comprender mejor la relación causal entre las dos variables.
vecaus<- dynlm(d(aus)~L(ehat), data=gdp)
vecusa <- dynlm(d(usa)~L(ehat), data=gdp)
tidy(vecaus)

tidy(vecusa)
El coeficiente del término de corrección de errores es significativo para
Australia, lo que sugiere que los cambios en la economía de los Estados Unidos sí afectan
la economía australiana; el coeficiente de corrección de errores en la ecuación de EE.
UU. no es estadísticamente significativo, lo que sugiere que los cambios en Australia no
influyen en la economía estadounidense. Para interpretar el signo del coeficiente de

corrección de errores, se debe recordar que mide la desviación de la economía


australiana con respecto a su nivel de cointegración de 0.985 de la economía de los EE.
UU. (Consulte las ecuaciones 6 y 7 y el valor de β1 en la Tabla 13.1) .
13.3 Estimando un modo VAR
El modelo VAR se puede utilizar cuando las variables en estudio son I(1) pero no están
integradas. El modelo es el de las ecuaciones??? pero en diferencias, como se especifica
en las ecuaciones 8 y 9.

Veamos la relación entre ingresos y consumo basada en fred detaset, donde el consumo
y los ingresos ya se encuentran en los registros, y el período es 1960: 1 a 2009: 4. La
figura 13.2 muestra que las dos series tienen una tendencia.
data("fred", package="PoEdata")
fred <- ts(fred, start=c(1960,1),end=c(2009,4),frequency=4)
ts.plot(fred[,"c"],fred[,"y"], type="l",
lty=c(1,2), col=c(1,2))
legend("topleft", border=NULL, legend=c("c","y"),
lty=c(1,2), col=c(1,2))
Figura 13.2: Registros de ingresos (y) y consumo (c), conjunto de datos ‘fred’

¿Están las dos series cointegradas?


Acf(fred[,"c"])
Acf(fred[,"y"])
adf.test(fred[,"c"])

##
## Augmented Dickey-Fuller Test
##
## data: fred[, "c"]
## Dickey-Fuller = -2.62, Lag order = 5, p-value = 0.316
## alternative hypothesis: stationary

adf.test(fred[,"y"])

##
## Augmented Dickey-Fuller Test
##
## data: fred[, "y"]
## Dickey-Fuller = -2.291, Lag order = 5, p-value = 0.454
## alternative hypothesis: stationary
adf.test(diff(fred[,"c"]))

##
## Augmented Dickey-Fuller Test
##
## data: diff(fred[, "c"])
## Dickey-Fuller = -4.713, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

adf.test(diff(fred[,"y"]))

##
## Augmented Dickey-Fuller Test
##
## data: diff(fred[, "y"])
## Dickey-Fuller = -5.775, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

cointcy <- dynlm(c~y, data=fred)


ehat <- resid(cointcy)
adf.test(ehat)

##
## Augmented Dickey-Fuller Test
##
## data: ehat
## Dickey-Fuller = -2.562, Lag order = 5, p-value = 0.341
## alternative hypothesis: stationary

Figura 13.3: Correlogramas para las series c e y, conjunto de datos fred


La figura 13.3 muestra una larga secuencia de correlación en serie; por lo tanto, dejaré
que R calcule el orden de retraso en la prueba ADF. Como muestran los resultados de
las pruebas de adf y cointegración anteriores, ambas series son I(1) pero fallan en la
prueba de cointegración (las series no están cointegradas). (Por favor, recuerde que la
función adf.test utiliza una constante y una tendencia en la ecuación de la prueba; por
lo tanto, los valores críticos no son los mismos que en el libro de texto. Sin embargo, los
resultados de las pruebas deben ser los mismos la mayor parte del tiempo).
library(vars)
Dc <- diff(fred[,"c"])
Dy <- diff(fred[,"y"])
varmat <- as.matrix(cbind(Dc,Dy))
varfit <- VAR(varmat) # `VAR()` from package `vars`
summary(varfit)

##
## VAR Estimation Results:
## =========================
## Endogenous variables: Dc, Dy
## Deterministic variables: const
## Sample size: 198
## Log Likelihood: 1400.444
## Roots of the characteristic polynomial:
## 0.344 0.343
## Call:
## VAR(y = varmat)
##
##
## Estimation results for equation Dc:
## ===================================
## Dc = Dc.l1 + Dy.l1 + const
##
## Estimate Std. Error t value Pr(>|t|)
## Dc.l1 0.215607 0.074749 2.88 0.0044 **
## Dy.l1 0.149380 0.057734 2.59 0.0104 *
## const 0.005278 0.000757 6.97 4.8e-11 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.00658 on 195 degrees of freedom
## Multiple R-Squared: 0.12, Adjusted R-squared: 0.111
## F-statistic: 13.4 on 2 and 195 DF, p-value: 3.66e-06
##
##
## Estimation results for equation Dy:
## ===================================
## Dy = Dc.l1 + Dy.l1 + const
##
## Estimate Std. Error t value Pr(>|t|)
## Dc.l1 0.475428 0.097326 4.88 2.2e-06 ***
## Dy.l1 -0.217168 0.075173 -2.89 0.0043 **
## const 0.006037 0.000986 6.12 5.0e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
##
## Residual standard error: 0.00856 on 195 degrees of freedom
## Multiple R-Squared: 0.112, Adjusted R-squared: 0.103
## F-statistic: 12.3 on 2 and 195 DF, p-value: 9.53e-06
##
##
##
## Covariance matrix of residuals:
## Dc Dy
## Dc 0.0000432 0.0000251
## Dy 0.0000251 0.0000733
##
## Correlation matrix of residuals:
## Dc Dy
## Dc 1.000 0.446
## Dy 0.446 1.000

La función VAR (), que forma parte del paquete vars (Pfaff 2013), acepta los siguientes
argumentos principales: y = una matriz que contiene las variables endógenas en el
modelo VAR, p = el orden de retraso deseado (el valor predeterminado es 1) y exogen =
una matriz de variables exógenas. (El VAR es un instrumento más poderoso de lo que
sugiero aquí; escriba ?VAR () para obtener más información.) Los resultados de un
modelo VAR son más útiles para analizar la respuesta de tiempo a los choques en las
variables, que es el tema del siguiente sección.
13.4 Respuestas de impulso y descomposiciones de varianza
Las respuestas de impulso se representan mejor en gráficos que muestran las respuestas
de una variable endógena VAR en el tiempo.
impresp <- irf(varfit)
plot(impresp)

Figura 13.4: Diagramas de respuesta de impulso para las series c and y, conjunto de
datos fred
La interpretación de las Figuras 13.4 es sencilla: un impulso (choque) a Dc en el tiempo
cero tiene grandes efectos en el próximo período, pero los efectos se hacen cada vez
más pequeños a medida que pasa el tiempo. Las líneas de puntos muestran las
estimaciones del intervalo del 95 por ciento de estos efectos. La función VAR imprime
los valores correspondientes a los gráficos de respuesta al impulso.
plot(fevd(varfit)) # `fevd()` is in package `vars`

Figura 13.5: Descomposición de la varianza del pronóstico para las series c and y,
conjunto de datos fred

La descomposición de la varianza del pronóstico estima la contribución de un choque en


cada variable a la respuesta en ambas variables. La figura 13.5 muestra que casi el 100
por ciento de la variación en Dc está causada por el propio Dc, mientras que solo el 80
por ciento de la variación de Dy es causada por Dy y el resto por Dc. La función R fevd ()
en los paquetes vars permite la descomposición de la varianza del pronóstico.
CAPÍTULO 12 SERIES TEMPORALES: NO ESTACIONARIEDAD
rm(list=ls()) #Removes all items in Environment!
library(tseries) # for ADF unit root tests
library(dynlm)
library(nlWaldTest) # for the `nlWaldtest()` function
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for kable()
library(forecast)

Nuevo paquete: tseries (Trapletti y Hornik 2016).


Una serie de tiempo no es estacionaria si su distribución, en particular su media,
varianza o covarianza en el tiempo cambia con el tiempo. Las series de tiempo no
estacionarias no se pueden usar en modelos de regresión porque pueden crear
regresión no esencial, una relación falsa debido, por ejemplo, a una tendencia común
en variables que no están relacionadas de otra manera. Dos o más series no
estacionarias aún pueden ser parte de un modelo de regresión si se cointegran, es decir,
están en una relación estacionaria de algún tipo.
Nos preocupa probar las series de tiempo para determinar la no estacionariedad y
descubrir cómo podemos transformar las series de tiempo no estacionarias de manera
que aún podamos usarlas en el análisis de regresión.
data("usa", package="PoEdata")
usa.ts <- ts(usa, start=c(1984,1), end=c(2009,4),
frequency=4)
Dgdp <- diff(usa.ts[,1])
Dinf <- diff(usa.ts[,"inf"])
Df <- diff(usa.ts[,"f"])
Db <- diff(usa.ts[,"b"])
usa.ts.df <- ts.union(gdp=usa.ts[,1], # package tseries
inf=usa.ts[,2],
f=usa.ts[,3],
b=usa.ts[,4],
Dgdp,Dinf,Df,Db,
dframe=TRUE)

plot(usa.ts.df$gdp)
plot(usa.ts.df$Dgdp)
plot(usa.ts.df$inf)
plot(usa.ts.df$Dinf)
plot(usa.ts.df$f)
plot(usa.ts.df$Df)
plot(usa.ts.df$b)
plot(usa.ts.df$Db)

Figura 12.1: Varias series de tiempo para ilustrar la no estacionariedad.


Una novedad en la secuencia de códigos anterior es el uso de la función ts.union, que se
une a varias series de tiempo, con la posibilidad de construir un marco de datos. La tabla
12.1 presenta el encabezado de este cuadro de datos.
kable(head(usa.ts.df),
caption="Time series data frame constructed with 'ts.union'")

Tabla 12.1: Marco de datos de series de tiempo construido con 'ts.union'

12.1 AR (1), el modelo autorregresivo de primer orden


Un proceso estocástico AR(1) se define mediante la Ecuación 1, donde el término de
error a veces se llama "innovación" o "shock".

El proceso AR (1) es estacionario si ; cuando ρ = 1, el proceso se llama caminata


aleatoria. La siguiente pieza de código representa varios procesos AR (1), con o sin una
constante, con o sin tendencia (el tiempo como un término en la ecuación de proceso
aleatorio), con ρ menor o igual a 1. La ecuación genérica utilizada para dibujar los
diagramas se da en la ecuación 2.

N <- 500
a <- 1
l <- 0.01
rho <- 0.7

set.seed(246810)
v <- ts(rnorm(N,0,1))

y <- ts(rep(0,N))
for (t in 2:N){
y[t]<- rho*y[t-1]+v[t]
}
plot(y,type='l', ylab="rho*y[t-1]+v[t]")
abline(h=0)

y <- ts(rep(0,N))
for (t in 2:N){
y[t]<- a+rho*y[t-1]+v[t]
}
plot(y,type='l', ylab="a+rho*y[t-1]+v[t]")
abline(h=0)

y <- ts(rep(0,N))
for (t in 2:N){
y[t]<- a+l*time(y)[t]+rho*y[t-1]+v[t]
}
plot(y,type='l', ylab="a+l*time(y)[t]+rho*y[t-1]+v[t]")
abline(h=0)

y <- ts(rep(0,N))
for (t in 2:N){
y[t]<- y[t-1]+v[t]
}
plot(y,type='l', ylab="y[t-1]+v[t]")
abline(h=0)

a <- 0.1
y <- ts(rep(0,N))
for (t in 2:N){
y[t]<- a+y[t-1]+v[t]
}
plot(y,type='l', ylab="a+y[t-1]+v[t]")
abline(h=0)

y <- ts(rep(0,N))
for (t in 2:N){
y[t]<- a+l*time(y)[t]+y[t-1]+v[t]
}
plot(y,type='l', ylab="a+l*time(y)[t]+y[t-1]+v[t]")
abline(h=0)

Figura 12.2: Procesos de AR (1) generados artificialmente con rho = 0.7


12.2 Regresión espuria
La no estacionariedad puede llevar a una regresión espuria, una relación aparente entre
variables que, en realidad, no están relacionadas. La siguiente secuencia de código
genera dos procesos de paseo aleatorios independientes, y and x, and regresa y en x.
T <- 1000
set.seed(1357)
y <- ts(rep(0,T))
vy <- ts(rnorm(T))
for (t in 2:T){
y[t] <- y[t-1]+vy[t]
}

set.seed(4365)
x <- ts(rep(0,T))
vx <- ts(rnorm(T))
for (t in 2:T){
x[t] <- x[t-1]+vx[t]
}
y <- ts(y[300:1000])
x <- ts(x[300:1000])
ts.plot(y,x, ylab="y and x")

Figura 12.3: Variables aleatorias independientes generadas artificialmente

spurious.ols <- lm(y~x)


summary(spurious.ols)

##
## Call:
## lm(formula = y ~ x)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12.55 -5.97 -2.45 4.51 24.68
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -20.3871 1.6196 -12.59 < 2e-16 ***
## x -0.2819 0.0433 -6.51 1.5e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7.95 on 699 degrees of freedom
## Multiple R-squared: 0.0571, Adjusted R-squared: 0.0558
## F-statistic: 42.4 on 1 and 699 DF, p-value: 1.45e-10

El resultado resumido de la regresión muestra una fuerte correlación entre las dos
variables, aunque se han generado de forma independiente. (Sin embargo, no es
necesario que dos procesos generados aleatoriamente para crear una regresión
espúrea). La Figura 12.3 representa las dos series de tiempo, y and x, y la Figura 12.4 las
muestra en un diagrama de dispersión.
plot(x, y, type="p", col="grey")

Figura 12.4: Diagrama de dispersión de series artificiales y and x

12.3 Pruebas de raíz unitaria para estacionariedad


La prueba de Dickey-Fuller para la estacionariedad se basa en un proceso AR(1) como se
define en la Ecuación 1; Si nuestra serie de tiempo parece mostrar una constante y una
tendencia, la ecuación básica es la de la Ecuación 2. De acuerdo con la prueba de Dickey-
Fuller, una serie de tiempo no es estacionaria cuando ρ = 1, lo que hace que AR (1)
procese una caminata aleatoria. Las hipótesis nula y alternativa de la prueba se dan en
la Ecuación 3.

Las ecuaciones básicas de AR(1) mencionadas anteriormente se transforman, con el


propósito de la prueba DF en la Ecuación 4, con la hipótesis transformada que se
muestra en la Ecuación 5. Rechazar la hipótesis nula del DF implica que nuestra serie de
tiempo es estacionaria.

Una prueba de DF aumentada incluye varios retrasos de la variable probada; el número


de retrasos a incluir se puede evaluar mediante el examen del correlograma de la
variable. La prueba DF puede ser de tres tipos: sin constante y sin tendencia, con
constante y sin tendencia y, finalmente, con constante y tendencia. Es importante
especificar qué prueba de DF queremos, ya que los valores críticos son diferentes para
los tres tipos diferentes de la prueba. Uno decide qué prueba realizar al examinar una
gráfica de serie temporal de la variable y determinar si una línea de regresión imaginaria
tendría una intersección y una pendiente.
Apliquemos la prueba DF a la serie f en el conjunto de datos usa.
plot(usa.ts.df$f)
Acf(usa.ts.df$f)

Figura 12.5: un gráfico y un correlograma para la serie f en el conjunto de datos usa


El gráfico de series de tiempo en la Figura 12.5 indica tanto la intersección como la
tendencia de nuestra serie, mientras que el correlograma sugiere incluir 10 rezagos en
la ecuación de la prueba DF. Supongamos que elegimos α = 0.05 para la prueba DF. La
función adf.test no requiere especificar si la prueba debe realizarse con constante o
tendencia, y si no se proporciona un valor para el número de retrasos (el argumento
para el número de retrasos es k), R calculará un valor para él . Recomendaría siempre
echar un vistazo a la trama y el correlograma de la serie.
adf.test(usa.ts.df$f, k=10)

##
## Augmented Dickey-Fuller Test
##
## data: usa.ts.df$f
## Dickey-Fuller = -3.373, Lag order = 10, p-value = 0.0628
## alternative hypothesis: stationary

El resultado de la prueba es un valor p mayor que nuestro nivel de significación elegido


de 0.05; por lo tanto, no podemos rechazar la hipótesis nula de la no estacionariedad.
plot(usa.ts.df$b)

Acf(usa.ts.df$b)
adf.test(usa.ts.df$b, k=10)

##
## Augmented Dickey-Fuller Test
##
## data: usa.ts.df$b
## Dickey-Fuller = -2.984, Lag order = 10, p-value = 0.169
## alternative hypothesis: stationary

Aquí hay un código para reproducir los resultados en el libro de texto.


f <- usa.ts.df$f
f.dyn <- dynlm(d(f)~L(f)+L(d(f)))
tidy(f.dyn)

b <- usa.ts.df$b
b.dyn <- dynlm(d(b)~L(b)+L(d(b)))
tidy(b.dyn)
Un concepto que está estrechamente relacionado con la estacionariedad es el orden de
integración, que es la cantidad de veces que tenemos que diferenciar una serie hasta
que se vuelve estacionaria. Una serie es I(0), es decir, integrada de orden 0 si ya está
estacionaria (es estacionaria en niveles, no en diferencias); una serie es I(1) si no es
estacionaria en niveles, sino estacionaria en sus primeras diferencias.
df <- diff(usa.ts.df$f)
plot(df)
Acf(df)
adf.test(df, k=2)

##
## Augmented Dickey-Fuller Test
##
## data: df
## Dickey-Fuller = -4.178, Lag order = 2, p-value = 0.01
## alternative hypothesis: stationary

Figura 12.6: Gráfica y correlograma para series diff (f) en el conjunto de datos usa
db <- diff(usa.ts.df$b)
plot(db)
Acf(db)
adf.test(db, k=1)

##
## Augmented Dickey-Fuller Test
##
## data: db
## Dickey-Fuller = -6.713, Lag order = 1, p-value = 0.01
## alternative hypothesis: stationary

Figura 12.7: Gráfico y correlograma para series diff (b) en el conjunto de datos usa
Tanto las gráficas como las pruebas de DF indican que las series f y b son estacionarias
en las primeras diferencias, lo que hace que cada una de ellas esté integrada en el orden
1. La siguiente secuencia de código reproduce los resultados en el libro de texto. Tenga
en cuenta el término (−1) en el comando dynlm; le dice a R que no queremos una
intercepción en nuestro modelo. Las figuras 12.6 y 12.7 muestran gráficos de las series
f y b diferenciadas, respectivamente.
df.dyn <- dynlm(d(df)~L(df)-1)
db.dyn <- dynlm(d(db)~L(db)-1)
tidy(df.dyn)

tidy(db.dyn)

La función ndiffs () en el forecast del paquete es una forma muy conveniente de


determinar el orden de integración de una serie. Los argumentos de esta función son x,
una serie de tiempo, alfa, el nivel de significación de la prueba (0.05 por defecto), test =
uno de "kpss", "adf" o "pp", que indica la prueba de la raíz unitaria para ser usado; solo
hemos estudiado la prueba "adf") y max.d = número máximo de diferencias. La salida
de esta función es un entero, que es el orden de integración de la serie de tiempo.
ndiffs(f)
## [1] 1
ndiffs(b)
## [1] 1

Como ya hemos encontrado, los órdenes de integración para f y b son 1.


12.4 Cointegración
Dos series se integran cuando sus tendencias no están demasiado alejadas y, en cierto
sentido, son similares. Esta declaración vaga, sin embargo, se puede hacer precisa
mediante la realización de una prueba de cointegración, que comprueba si los residuos
de la regresión de una serie en la otra son estacionarios. Si lo son, las series se
cointegrarán. Por lo tanto, una prueba de cointegración es, de hecho, una prueba de
estacionariedad de Dickey-Fuler sobre residuos, y su hipótesis nula es de no
cointegración. En otras palabras, nos gustaría rechazar la hipótesis nula en una prueba
de cointegración, como queríamos en una prueba de estacionariedad.
Apliquemos este método para determinar el estado de cointegración entre las series f y
b en el conjunto de datos usa.
fb.dyn <- dynlm(b~f)
ehat.fb <- resid(fb.dyn)
ndiffs(ehat.fb) #result: 1
## [1] 1

output <- dynlm(d(ehat.fb)~L(ehat.fb)+L(d(ehat.fb))-1) #no


constant
foo <- tidy(output)
foo

La estadística relevante es τ = −4.196133, que es menor que −3.37, el valor crítico


relevante para la prueba de cointegración. En conclusión, rechazamos la hipótesis nula
de que los residuos tienen raíces unitarias, por lo tanto, las series están cointegradas.
R tiene una función especial para realizar pruebas de cointegración, función po.test en
el paquete tseries. (El nombre proviene del método que utiliza, que se llama "Phillips-
Ouliaris"). El argumento principal de la función es una matriz que tiene en su primera
columna la variable dependiente de la ecuación de cointegración y las variables
independientes en las otras columnas. Permítanme ilustrar su aplicación en el caso de
la misma serie fb y f.
bfx <- as.matrix(cbind(b,f), demean=FALSE)
po.test(bfx)

##
## Phillips-Ouliaris Cointegration Test
##
## data: bfx
## Phillips-Ouliaris demeaned = -20.51, Truncation lag parameter = 1,
## p-value = 0.0499

La prueba de PO rechaza marginalmente el nulo de no cointegración en el nivel del 5 por


ciento.
12.5 El modelo de corrección de errores
Una relación entre las variables I(1) cointegradas es una relación a largo plazo, mientras
que una relación entre las variables I(0) es una relación a corto plazo. El modelo de
corrección de errores a corto plazo combina, en cierto sentido, efectos a corto y largo
plazo. Partiendo de un modelo ARDL(1,1) (Ecuación 6) y asumiendo que existe una
relación de estado estable (largo plazo) entre y and x, se puede derivar el modelo de
corrección de errores en la Ecuación 7, donde más diferencias retrasadas de x pueden
Ser necesario eliminar la autocorrelación.
En el caso del ejemplo de los bonos y fondos de EE. UU., El modelo de corrección de
errores se puede construir como en la Ecuación 8.

La función R que estima un modelo no lineal como el de la Ecuación 8 es nls, que requiere
tres argumentos principales: una formula, que es el modelo de regresión que se debe
escribir mediante el uso de operadores matemáticos de texto regular, una lista de start=
lista de conjeturas o de otro tipo valores aproximados de los parámetros estimados para
iniciar un proceso de optimización numérica de Gauss-Newton y data = un marco de
datos, una lista o una fuente de datos del entorno. Tenga en cuenta que los data no
pueden ser una matriz.
En la siguiente secuencia de código, los valores iniciales de los parámetros se han
determinado al estimar la Ecuación 6 con b y f reemplazando y and x.
b.ols <- dynlm(L(b)~L(f))
b1ini <- coef(b.ols)[[1]]
b2ini <- coef(b.ols)[[2]]
d.ols <- dynlm(b~L(b)+f+L(f))
aini <- 1-coef(d.ols)[[2]]
d0ini <- coef(d.ols)[[3]]
d1ini <- coef(d.ols)[[4]]
Db <- diff(b)
Df <- diff(f)
Lb <- lag(b,-1)
Lf <- lag(f,-1)
LDf <- lag(diff(f),-1)
bfset <- data.frame(ts.union(cbind(b,f,Lb,Lf,Db,Df,LDf)))
formula <- Db ~ -a*(Lb-b1-b2*Lf)+d0*Df+d1*LDf
bf.nls <- nls(formula, na.action=na.omit, data=bfset,
start=list(a=aini, b1=b1ini, b2=b2ini,
d0=d0ini, d1=d1ini))
kable(tidy(bf.nls),
caption="Parameter estimates in the error correction model")

Tabla 12.2: Estimaciones de parámetros en el modelo de corrección de errores


El modelo de corrección de errores también se puede utilizar para probar la
cointegración de las dos series. Todo lo que necesitamos hacer es probar los errores de
la parte de corrección incorporada en la Ecuación 8 para determinar la estacionariedad.
Los errores estimados están dados por la ecuación 9.

ehat <- bfset$Lb-coef(bf.nls)[[2]]-coef(bf.nls)[[3]]*bfset$Lf


ehat <- ts(ehat)
ehat.adf <- dynlm(d(ehat)~L(ehat)+L(d(ehat))-1)
kable(tidy(ehat.adf),
caption="Stationarity test within the error correction model")

Tabla 12.3: Prueba de estacionariedad dentro del modelo de corrección de errores

foo <- tidy(ehat.adf)

Para probar la cointegración, uno debe comparar la proporción t del término retrasado
que se muestra como "estadística" en la ecuación 12.3, t = −3.927 con el valor crítico de
−3.37. El resultado es rechazar el nulo de no cointegración, lo que significa que las series
están cointegradas.
CAPÍTULO 11 MODELOS DE ECUACIONES SIMULTÁNEAS
rm(list=ls()) #Removes all items in Environment!
library(systemfit)
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 dataset
library(knitr) #for kable()

Nuevo paquete: systemfit (Henningsen y Hamann 2015).


Las ecuaciones simultáneas son modelos con más de una variable de respuesta, donde
la solución está determinada por un equilibrio entre fuerzas opuestas. El problema
econométrico es similar a las variables endógenas que ya hemos estudiado en el capítulo
anterior porque la interacción mutua entre variables dependientes puede considerarse
una forma de endogeneidad. El ejemplo típico de un problema económico de
ecuaciones simultáneas es el modelo de oferta y demanda, donde el precio y la cantidad
son interdependientes y están determinados por la interacción entre la oferta y la
demanda.
Generalmente, un modelo económico como las ecuaciones de demanda y oferta
incluyen varias de las variables dependientes (endógenas) en cada ecuación. Tal modelo
se llama la forma estructural del modelo. Si la forma estructural se transforma de modo
que cada ecuación muestre una variable dependiente en función de solo variables
independientes exógenas, la nueva forma se denomina forma reducida. La forma
reducida puede estimarse por mínimos cuadrados, mientras que la forma estructural no
puede porque incluye variables endógenas en su lado derecho.
La condición necesaria para la identificación requiere que, para que el problema tenga
una solución, cada ecuación en la forma estructural del sistema pierda al menos una
variable exógena que esté presente en otras ecuaciones.
Las ecuaciones simultáneas son el objeto del paquete systemfit en R, con la función
systemfit (), que requiere los siguientes argumentos principales: formula = una lista que
describe las ecuaciones del sistema; method = el método de estimación deseado
(apropiado), que puede ser uno de "OLS", "WLS", "SUR", "2SLS", "W2SLS" o "3SLS" (solo
hemos estudiado OLS, WLS y 2SLS hasta ahora); inst = una lista de variables
instrumentales bajo la forma de fórmulas de modelo de un lado; Todas las variables
endógenas en el sistema deben estar en esta lista.
El siguiente ejemplo utiliza el conjunto de datos truffles, donde q es la cantidad de trufas
comercializadas, p es el precio de mercado, ps es el precio de un sustituto, di es el
ingreso y pf es una medida de los costos de producción. Las ecuaciones estructurales de
demanda y oferta (ecuaciones 1 y 2) se formulan en base a la teoría económica; La
cantidad y el precio son endógenos, y todas las demás variables se consideran exógenas.
data("truffles", package="PoEdata")
D <- q~p+ps+di
S <- q~p+pf
sys <- list(D,S)
instr <- ~ps+di+pf
truff.sys <- systemfit(sys, inst=instr,
method="2SLS", data=truffles)
summary(truff.sys)

##
## systemfit results
## method: 2SLS
##
## N DF SSR detRCov OLS-R2 McElroy-R2
## system 60 53 692.47 49.803 0.43896 0.80741
##
## N DF SSR MSE RMSE R2 Adj R2
## eq1 30 26 631.917 24.3045 4.9300 -0.02395 -0.14210
## eq2 30 27 60.555 2.2428 1.4976 0.90188 0.89461
##
## The covariance matrix of the residuals
## eq1 eq2
## eq1 24.3045 2.1694
## eq2 2.1694 2.2428
##
## The correlations of the residuals
## eq1 eq2
## eq1 1.00000 0.29384
## eq2 0.29384 1.00000
##
##
## 2SLS estimates for 'eq1' (equation 1)
## Model Formula: q ~ p + ps + di
## Instruments: ~ps + di + pf
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.27947 5.54388 -0.7719 0.44712
## p -0.37446 0.16475 -2.2729 0.03154 *
## ps 1.29603 0.35519 3.6488 0.00116 **
## di 5.01398 2.28356 2.1957 0.03724 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4.92996 on 26 degrees of freedom
## Number of observations: 30 Degrees of Freedom: 26
## SSR: 631.91714 MSE: 24.30451 Root MSE: 4.92996
## Multiple R-Squared: -0.02395 Adjusted R-Squared: -0.1421
##
##
## 2SLS estimates for 'eq2' (equation 2)
## Model Formula: q ~ p + pf
## Instruments: ~ps + di + pf
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 20.032802 1.223115 16.378 1.554e-15 ***
## p 0.337982 0.024920 13.563 1.434e-13 ***
## pf -1.000909 0.082528 -12.128 1.946e-12 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.49759 on 27 degrees of freedom
## Number of observations: 30 Degrees of Freedom: 27
## SSR: 60.55457 MSE: 2.24276 Root MSE: 1.49759
## Multiple R-Squared: 0.90188 Adjusted R-Squared: 0.89461

La salida de la función systemfit () muestra las estimaciones por ecuación estructural:


eq1 es la función de demanda, donde, como se esperaba, el precio tiene un signo
negativo, y eq2 es la ecuación de la oferta, con un signo positivo para el precio.
Al evaluar la ecuación de forma reducida utilizando OLS, se pueden determinar los
efectos de los cambios en las variables exógenas en el precio y la cantidad de mercado
de equilibrio, mientras que las ecuaciones estructurales muestran los efectos de dichos
cambios en la cantidad demandada, respectivamente, en la cantidad ofrecida. La
estimación de las ecuaciones estructurales mediante métodos como 2SLS es, de hecho,
la estimación de la demanda del mercado y las curvas de oferta, lo que es
extremadamente útil para el análisis económico. Estimar las formas reducidas, si bien es
útil para la predicción, no permite un análisis profundo, solo proporciona el punto de
equilibrio, no las curvas completas.
Q.red <- lm(q~ps+di+pf, data=truffles)
P.red <- lm(q~ps+di+pf, data=truffles)
kable(tidy(Q.red), digits=4,
caption="Reduced form for quantity")

Tabla 11.1: Forma reducida por cantidad

kable(tidy(P.red), digits=4,
caption="Reduced form for price")
Tabla 11.2: Forma reducida por precio

Las tablas 11.1 y 11.2 muestran que todas las variables exógenas tienen efectos
significativos en la cantidad y el precio de equilibrio y tienen los signos esperados.
El conjunto de datos de fultonfish proporciona otro ejemplo de oferta y demanda donde
se puede aplicar el método de ecuaciones simultáneas. El propósito de este ejemplo es
enfatizar que las variables exógenas que son clave para la identificación deben ser
estadísticamente significativas. De lo contrario, la ecuación estructural que necesita ser
identificada por esas variables no puede ser estimada confiablemente. Sin embargo, las
ecuaciones restantes en el sistema estructural no se ven afectadas.

En el ejemplo de fultonfish, las variables endógenas son lprice, el registro de precio y


lquan; las variables exógenas son las variables indicadoras para el día de la semana, y si
el día de la captura fue tormentoso. La variable de identificación para la ecuación de
demanda es stormy, que solo se mostrará en la ecuación de oferta; las variables de
identificación para la ecuación de oferta serán mon, tue, wed y thu.

Ahora, consideremos las ecuaciones de forma reducida (Ecuaciones 5 y 6). Dado que la
variable endógena que aparece en el lado derecho de las ecuaciones estructurales
(Ecuaciones 3 y 4) es el price, la ecuación de price reducido (Ecuación 6) es esencial para
evaluar el estado de identificación del modelo. Centrémonos en esta ecuación. Si los
indicadores del día de la semana son todos insignificantes, la ecuación de la oferta no se
puede identificar; si stormy resulta insignificante, la ecuación de demanda no puede ser
identificada; si los indicadores del día de la semana son insignificantes pero stormy son
significativos, no se identifica la oferta, pero sí la demanda; si al menos un indicador de
día de la semana resulta significativo pero tormentoso resulta insignificante, la ecuación
de demanda no se identifica, pero sí la ecuación de oferta. Las ecuaciones 3 y 4 muestran
las demandas estructurales y las ecuaciones de oferta para el ejemplo de fultonfish.
data("fultonfish", package="PoEdata")
fishQ.ols <- lm(lquan~mon+tue+wed+thu+stormy, data=fultonfish)
kable(tidy(fishQ.ols), digits=4,
caption="Reduced 'Q' equation for the fultonfish
example")

Tabla 11.3: Ecuación reducida de "Q" para el ejemplo de fultonfish

fishP.ols <- lm(lprice~mon+tue+wed+thu+stormy, data=fultonfish)


kable(tidy(fishP.ols), digits=4,
caption="Reduced 'P' equation for the fultonfish
example")

Tabla 11.4: Ecuación 'P' reducida para el ejemplo de fultonfish

La ecuación relevante para evaluar la identificación se muestra en la Tabla 11.4, que es


la ecuación de precio reducido. Los resultados muestran que los indicadores del día de
la semana no son significativos, lo que hará que la estimación 2SLS de la ecuación de la
oferta no sea confiable; el coeficiente de stormy es significativo, por lo que la estimación
de la ecuación de la demanda (estructural) será confiable. La siguiente secuencia de
código y salida muestran las estimaciones 2SLS de las ecuaciones de oferta y demanda
(las estructurales).
fish.D <- lquan~lprice+mon+tue+wed+thu
fish.S <- lquan~lprice+stormy
fish.eqs <- list(fish.D, fish.S)
fish.ivs <- ~mon+tue+wed+thu+stormy
fish.sys <- systemfit(fish.eqs, method="2SLS",
inst=fish.ivs, data=fultonfish)
summary(fish.sys)

##
## systemfit results
## method: 2SLS
##
## N DF SSR detRCov OLS-R2 McElroy-R2
## system 222 213 109.61 0.1073 0.09424 -0.59781
##
## N DF SSR MSE RMSE R2 Adj R2
## eq1 111 105 52.090 0.49610 0.70434 0.13912 0.09813
## eq2 111 108 57.522 0.53261 0.72980 0.04936 0.03176
##
## The covariance matrix of the residuals
## eq1 eq2
## eq1 0.49610 0.39614
## eq2 0.39614 0.53261
##
## The correlations of the residuals
## eq1 eq2
## eq1 1.00000 0.77065
## eq2 0.77065 1.00000
##
##
## 2SLS estimates for 'eq1' (equation 1)
## Model Formula: lquan ~ lprice + mon + tue + wed + thu
## Instruments: ~mon + tue + wed + thu + stormy
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.505911 0.166167 51.1890 < 2.2e-16 ***
## lprice -1.119417 0.428645 -2.6115 0.010333 *
## mon -0.025402 0.214774 -0.1183 0.906077
## tue -0.530769 0.208000 -2.5518 0.012157 *
## wed -0.566351 0.212755 -2.6620 0.008989 **
## thu 0.109267 0.208787 0.5233 0.601837
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.70434 on 105 degrees of freedom
## Number of observations: 111 Degrees of Freedom: 105
## SSR: 52.09032 MSE: 0.4961 Root MSE: 0.70434
## Multiple R-Squared: 0.13912 Adjusted R-Squared: 0.09813
##
##
## 2SLS estimates for 'eq2' (equation 2)
## Model Formula: lquan ~ lprice + stormy
## Instruments: ~mon + tue + wed + thu + stormy
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.6283544 0.3889702 22.1826 <2e-16 ***
## lprice 0.0010593 1.3095470 0.0008 0.9994
## stormy -0.3632461 0.4649125 -0.7813 0.4363
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7298 on 108 degrees of freedom
## Number of observations: 111 Degrees of Freedom: 108
## SSR: 57.52184 MSE: 0.53261 Root MSE: 0.7298
## Multiple R-Squared: 0.04936 Adjusted R-Squared: 0.03176

En la salida de la estimación 2SLS, eq1 es la ecuación de demanda, y eq2 es la oferta.


Como hemos visto, se identifica la ecuación de la demanda, es decir, es confiable,
mientras que la ecuación de la oferta no lo es. Una solución podría ser encontrar mejores
instrumentos, aparte de los días de la semana para la ecuación de demanda. Encontrar
instrumentos válidos es, sin embargo, una tarea difícil en muchos problemas.
CAPÍTULO 10 REGRESORES ALEATORIOS
rm(list=ls()) #Removes all items in Environment!
library(AER) #for `ivreg()`
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for making neat tables with `kable()`
library(stargazer)

En la mayoría de los datos provenientes de fenómenos naturales no controlados, tanto


las variables dependientes como las independientes son aleatorias. En muchos casos,
algunas de las variables independientes también se correlacionan con el término de
error en un modelo de regresión, lo que hace que el método OLS sea inapropiado. Los
regresores que están correlacionados con el término de error se denominan
endógenos; Del mismo modo, los que no lo son se llaman exógenos. El remedio para
esta violación del supuesto de regresión lineal es el uso de variables instrumentales, o

instrumentos, que son variables que no influyen directamente en la respuesta pero


que están correlacionadas con el regresor endógeno en cuestión.
10.1 El método de las variables instrumentales (IV)
Un instrumento fuerte, uno que está altamente correlacionado con el regresor
endógeno al que se refiere, reduce la varianza del coeficiente estimado. Supongamos el

modelo de regresión múltiple en la Ecuación 1, donde los regresores a son

exógenos y es endógeno. El método IV consiste en dos etapas: primera regresión

en todos los otros regresores y todos los instrumentos y crea la serie de valores

ajustados, ; segundo, regrese la ecuación inicial, en la que se reemplaza por

. Por lo tanto, el método IV se suele llamar mínimos cuadrados de dos etapas, o


2SLS.

Considere el modelo wage en la Ecuación 2 usando el conjunto de datos mroz. La


dificultad notoria con este modelo es que el término de error puede incluir algunos
atributos no observados, como la capacidad personal, que determinan tanto el salario
como la educación. En otras palabras, la variable independiente educ se correlaciona
con el término de error, es endógena.
Un instrumento que puede abordar la endogeneidad de educ es mothereduc , del cual
podemos asumir razonablemente que no influye directamente en el salario de la hija,
sino que influye en su educación.
Primero llevemos a cabo un modelo explícito de dos etapas con un solo instrumento,
mothereduc. La primera etapa es la regresión de educ en otros regresores y el
instrumento, como lo muestra la Ecuación 3.

data("mroz", package="PoEdata")
mroz1 <- mroz[mroz$lfp==1,] #restricts sample to lfp=1
educ.ols <- lm(educ~exper+I(exper^2)+mothereduc, data=mroz1)
kable(tidy(educ.ols), digits=4, align='c',caption=
"First stage in the 2SLS model for the 'wage' equation")

Tabla 10.1: Primera etapa en el modelo 2SLS para la ecuación de "wage"

El valor p para mothereduc es muy bajo (consulte la Tabla 10.1), lo que indica una fuerte
correlación entre este instrumento y la variable endógena educ aven después de
controlar otras variables. La segunda etapa en el procedimiento de dos etapas es crear
los valores ajustados de educ a partir de la primera etapa (Ecuación 3) y conectarlos al
modelo de interés, ecuación 2 para reemplazar la variable original educ.
educHat <- fitted(educ.ols)
wage.2sls <- lm(log(wage)~educHat+exper+I(exper^2), data=mroz1)
kable(tidy(wage.2sls), digits=4, align='c',caption=
"Second stage in the 2SLS model for the 'wage' equation")

Tabla 10.2: Segunda etapa en el modelo 2SLS para la ecuación de "wage"


Los resultados del procedimiento 2SLS explícito se muestran en la Tabla 10.2; Tenga en
cuenta, sin embargo, que los errores estándar calculados de esta manera son
incorrectos; el método correcto es utilizar una función de software dedicada para
resolver un modelo de variable instrumental. En R, tal función es ivreg ().
data("mroz", package="PoEdata")
mroz1 <- mroz[mroz$lfp==1,] #restricts sample to lfp=1.
mroz1.ols <- lm(log(wage)~educ+exper+I(exper^2), data=mroz1)
mroz1.iv <- ivreg(log(wage)~educ+exper+I(exper^2)|
exper+I(exper^2)+mothereduc, data=mroz1)
mroz1.iv1 <- ivreg(log(wage)~educ+exper+I(exper^2)|
exper+I(exper^2)+mothereduc+fathereduc,
data=mroz1)
stargazer(mroz1.ols, wage.2sls, mroz1.iv, mroz1.iv1,
title="Wage equation: OLS, 2SLS, and IV models compared",
header=FALSE,
type=.stargazertype, # "html" or "latex" (in index.Rmd)
keep.stat="n", # what statistics to print
omit.table.layout="n",
star.cutoffs=NA,
digits=4,
# single.row=TRUE,
intercept.bottom=FALSE, #moves the intercept coef to top
column.labels=c("OLS","explicit 2SLS", "IV mothereduc",
"IV mothereduc and fathereduc"),
dep.var.labels.include = FALSE,
model.numbers = FALSE,
dep.var.caption="Dependent variable: wage",
model.names=FALSE,
star.char=NULL) #supresses the stars)

Ecuación wage: modelos OLS, 2SLS y IV comparados


La tabla titulada "Ecuación wage: OLS, 2SLS y IV en comparación" muestra que la
importancia de la educación para determinar las disminuciones salariales en el modelo
IV. También muestra que el modelo 2SLS explícito y el modelo IV con un solo mothered
instrumento de origen producen los mismos coeficientes (el educ en el modelo IV es
equivalente al educHat en 2SLS), pero los errores estándar son diferentes. Los correctos
son los proporcionados por el modelo IV.
Algunas observaciones están en orden con respecto a la secuencia del código anterior.
Primero, dado que algunos de los individuos no están en la fuerza laboral, sus salarios
son cero y el registro no se puede calcular. Excluí esas observaciones usando solo
aquellas para las que lpf es igual a 1. En segundo lugar, la lista de instrumentos en el
comando ivreg incluye tanto el instrumento en sí (mothereduc) como todos los
regresores exógenos, que son, por así decirlo, sus propios instrumentos. El carácter de
barra vertical | separa la lista de regresores adecuada de la lista de instrumentos.
Para probar los instrumentos débiles en la ecuación wage, solo probamos la importancia
conjunta de los instrumentos en un modelo educ como se muestra en la Ecuación 4.

educ.ols <- lm(educ~exper+I(exper^2)+mothereduc+fathereduc,


data=mroz1)
tab <- tidy(educ.ols)
kable(tab, digits=4,
caption="The 'educ' first-stage equation")

Tabla 10.3: La ecuación de primera etapa "educ"

linearHypothesis(educ.ols, c("mothereduc=0", "fathereduc=0"))

La prueba rechaza la hipótesis nula de que los coeficientes de mothereduc y fathereduc


son cero, lo que indica que al menos un instrumento es fuerte. Una regla de oro requiere
rechazar sólidamente la hipótesis nula a un valor de la estadística F mayor que 10 o, para
un solo instrumento, una estadística t mayor que 3.16, para asegurarse de que un
instrumento es fuerte.
Para identificar un modelo, el número de instrumentos debe ser al menos igual al
número de variables endógenas. Si hay más instrumentos que variables endógenas, se
dice que el modelo está sobreidentificado.
10.2 Pruebas de especificación
Ya hemos visto cómo probar los instrumentos débiles con un solo instrumento. Esta
prueba puede extenderse a varios instrumentos. La hipótesis nula es H0: "Todos los
instrumentos son débiles".
Dado que usar IV cuando no es necesario empeora nuestras estimaciones, nos gustaría
probar si las variables que nos preocupan son realmente endógenas. Este problema se
resuelve mediante la prueba de Hausman para la endogeneidad, donde la hipótesis nula
es Por lo tanto, rechazar la hipótesis nula indica la existencia
de endogeneidad y la necesidad de variables instrumentales.
La prueba de la validez de los instrumentos (si los instrumentos están correlacionados
con el término de error) solo se puede realizar para los instrumentos adicionales,
aquellos que excedan el número de variables endógenas. Esta prueba a veces se
denomina prueba para las restricciones de identificación excesiva, o la prueba de
Sargan. La hipótesis nula es que la covarianza entre el instrumento y el término de error

es cero, Por lo tanto, rechazar el nulo indica que al menos uno


de los instrumentos adicionales no es válido.
R realiza automáticamente estas tres pruebas e informa los resultados en la salida a la
función ivreg.
summary(mroz1.iv1, diagnostics=TRUE)

##
## Call:
## ivreg(formula = log(wage) ~ educ + exper + I(exper^2) | exper +
## I(exper^2) + mothereduc + fathereduc, data = mroz1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0986 -0.3196 0.0551 0.3689 2.3493
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.048100 0.400328 0.12 0.9044
## educ 0.061397 0.031437 1.95 0.0515 .
## exper 0.044170 0.013432 3.29 0.0011 **
## I(exper^2) -0.000899 0.000402 -2.24 0.0257 *
##
## Diagnostic tests:
## df1 df2 statistic p-value
## Weak instruments 2 423 55.40 <2e-16 ***
## Wu-Hausman 1 423 2.79 0.095 .
## Sargan 1 NA 0.38 0.539
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.675 on 424 degrees of freedom
## Multiple R-Squared: 0.136, Adjusted R-squared: 0.13
## Wald test: 8.14 on 3 and 424 DF, p-value: 0.0000279

Los resultados para la ecuación wage son los siguientes:


.Prueba de instrumentos débiles: rechaza el valor nulo, lo que significa que al menos un
instrumento es fuerte
.(Wu-) Prueba de Hausman para la endogeneidad: apenas rechaza el nulo de que la
variable en cuestión no está correlacionada con el término de error, lo que indica que
educ es marginalmente endógeno
.Restricciones de identificación excesiva de Sargan: no rechaza el valor nulo, lo que
significa que los instrumentos adicionales son válidos (no están correlacionados con el
término de error).
Sin embargo, la prueba para instrumentos débiles puede ser poco confiable con más de
un regresor endógeno, porque en realidad hay una estadística F para cada regresor
endógeno. Una alternativa es la prueba de Cragg-Donald basada en la estadística que se
muestra en la Ecuación 5, donde G es el número de regresores exógenos, B es el número

de regresores endógenos, L es el número de instrumentos externos y es la


correlación canónica más baja (una medida de la correlación entre las variables
endógenas y exógenas, calculada por la función cancor () en R).

Veamos la ecuación de horas con dos variables endógenas, mtr y educ, y dos
instrumentos externos, mothereduc y fathereduc. Uno de los dos regresores exógenos,
nwifeinc, es el ingreso familiar neto del ingreso de la esposa; el otro regresor exógeno,
mtr, es el impuesto marginal de la esposa. La ecuación 6 muestra este modelo; el
conjunto de datos es mroz, restringido a las mujeres que están en la fuerza laboral.

La siguiente secuencia de código usa la función R cancor () para calcular la más baja de

las dos correlaciones canónicas, , que es necesaria para el estadístico F de Cragg-


Donald en la Ecuación 5.
data("mroz", package="PoEdata")
mroz1 <- mroz[which(mroz$wage>0),]
nwifeinc <- (mroz1$faminc-mroz1$wage*mroz1$hours)/1000
G<-2; L<-2; N<-nrow(mroz1)
x1 <- resid(lm(mtr~kidsl6+nwifeinc, data=mroz1))
x2 <- resid(lm(educ~kidsl6+nwifeinc, data=mroz1))
z1 <-resid(lm(mothereduc~kidsl6+nwifeinc, data=mroz1))
z2 <-resid(lm(fathereduc~kidsl6+nwifeinc, data=mroz1))
X <- cbind(x1,x2)
Y <- cbind(z1,z2)
rB <- min(cancor(X,Y)$cor)
CraggDonaldF <- ((N-G-L)/L)/((1-rB^2)/rB^2)

El resultado es el Cragg-Donald F = 0.100806, que es mucho más pequeño que el valor


crítico de 4.58 dado en la Tabla 10E.1 del libro de texto (Hill, Griffiths y Lim 2011). Esta
prueba rechaza la hipótesis nula de instrumentos fuertes, contradiciendo mi resultado
anterior.
CAPÍTULO 9 SERIES TEMPORALES: VARIABLES ESTACIONARIAS
rm(list=ls()) #Removes all items in Environment!
library(dynlm) #for the `dynlm()` function
library(orcutt) # for the `cochrane.orcutt()` function
library(nlWaldTest) # for the `nlWaldtest()` function
library(zoo) # for time series functions (not much used here)
library(pdfetch) # for retrieving data (just mentioned here)
library(lmtest) #for `coeftest()` and `bptest()`.
library(broom) #for `glance(`) and `tidy()`
library(PoEdata) #for PoE4 datasets
library(car) #for `hccm()` robust standard errors
library(sandwich)
library(knitr) #for kable()
library(forecast)

Nuevos paquetes: dynlm (Zeileis 2016); orcutt (Spada, Quartagno y Tamburini 2012);
nlWaldTest (Komashko 2016); zoo [R-zoo]; pdfetch (Reinhart 2015); y pronóstico
(Hyndman 2016).
Las series temporales son datos sobre varias variables en una unidad de observación
(como un individuo, país o empresa) cuando las observaciones abarcan varios períodos.
La correlación entre las observaciones subsiguientes, la importancia del orden natural
en los datos y la dinámica (los valores pasados de los datos influyen en los valores
presentes y futuros) son características de las series temporales que no aparecen en los
datos de corte transversal.
Los modelos de series de tiempo suponen, además de las suposiciones de regresión
lineal habituales, que los series son estacionarios, es decir, la distribución del término
de error, así como la correlación entre los términos de error que son unos pocos
periodos separados a lo largo del tiempo. La distribución constante requiere, en
particular, que la variable no muestre una tendencia en su media o varianza; La
correlación constante no implica agrupamiento de observaciones en ciertos períodos.
9.1 Una descripción general de las herramientas de series de tiempo en R
R crea una serie de tiempo o conjunto de datos usando la función ts (), con los siguientes
argumentos principales: su archivo de data en forma de matriz o marco de datos, el
período de start, el período de finalización, la frecuency de los datos (1 es anual, 4 es
trimestral, y 12 es mensual), y los names de sus variables de columna. Otra clase de
objetos de series de tiempo es creada por la función zoo () en el paquete zoo, que, a
diferencia de ts (), puede manejar series de tiempo irregulares o de alta frecuencia. Las
clases de objetos ts y zoo se pueden usar con la función dynlm () en el paquete con el
mismo nombre para resolver modelos que incluyen retrasos y otros operadores
específicos de series de tiempo.
En R estándar, dos funciones son muy útiles cuando se trabaja con series de tiempo: la

función de diferencia, y la función de retardo,

El paquete pdfetch es una herramienta muy útil para obtener datos de series de tiempo
compatibles con R de diferentes fuentes en línea como el Banco Mundial, Eurostat, el
Banco Central Europeo y Yahoo Finance. El paquete WDI recupera datos de la muy rica
base de datos de Indicadores de Desarrollo Mundial, mantenida por el Banco Mundial.
9.2 Lags distribuidos finitos
Un modelo de retraso distribuido finito (FDL) asume una relación lineal entre una
variable dependiente y and varios rezagos de una variable independiente x. La ecuación
1 muestra un modelo de retraso distribuido finito de orden q.

El coeficiente βs es un multiplicador de retardo en el período s, y el coeficiente β0, el


impacto inmediato (contemporáneo) de un cambio en x sobre y, es un multiplicador de
impacto. Si x aumenta en una unidad hoy, el cambio en y será β0 + β1 + ... + βs después
de s periodos; esta cantidad se denomina multiplicador interino s -periodo. El
multiplicador total es igual a la suma de todos los βs en el modelo.
Veamos la ley de Okun como un ejemplo de un modelo FDL. La ley de Okun relaciona los

cambios contemporáneos (tiempo t) en la tasa de desempleo, con los niveles

actuales y pasados de la tasa de crecimiento económico,


data("okun", package="PoEdata")
library(dynlm)
check.ts <- is.ts(okun) # "is structured as time series?"
okun.ts <- ts(okun, start=c(1985,2), end=c(2009,3),frequency=4)
okun.ts.tab <- cbind(okun.ts,
lag(okun.ts[,2], -1),
diff(okun.ts[,2], lag=1),
lag(okun.ts[,1], -1),
lag(okun.ts[,1], -2),
lag(okun.ts[,1], -3))
kable(head(okun.ts.tab),
caption="The `okun` dataset with differences and lags",
col.names=c("g","u","uL1","du","gL1","gL2","gL3"))
Tabla 9.1: El conjunto de datos de okun con diferencias y retrasos

La tabla 9.1 muestra cómo funcionan los retrasos y las diferencias. Tenga en cuenta
cómo cada retraso utiliza un período de observación.
okunL3.dyn <- dynlm(d(u)~L(g, 0:3), data=okun.ts)
kable(tidy(summary(okunL3.dyn)), digits=4,
caption="The `okun` distributed lag model with three lags")

Tabla 9.2: El modelo de retraso distribuido okun con tres retrasos

okunL2.dyn <- dynlm(d(u)~L(g, 0:2), data=okun.ts)


kable(tidy(summary(okunL2.dyn)), digits=4,
caption="The `okun` distributed lag model with two lags")

Tabla 9.3: El modelo de retraso distribuido okun con dos retrasos


Las tablas 9.2 y 9.3 resumen los resultados de los modelos lineales con 3 y 2 rezagos
respectivamente. Muchas de las funciones de análisis de salida que hemos utilizado con
la función lm (), como summary () y coeftest () también son aplicables a dynlm ().
glL3 <-
glance(okunL3.dyn)[c("r.squared","statistic","AIC","BIC")]
glL2 <-
glance(okunL2.dyn)[c("r.squared","statistic","AIC","BIC")]
tabl <- rbind(glL3, as.numeric(glL2))
kable(tabl, caption="Goodness-of-fit statistics for `okun`
models")

Tabla 9.4: Estadísticas de bondad de ajuste para modelos de okun

La tabla 9.4 compara los dos modelos FDL del ejemplo de okun. La primera fila es el
modelo con tres rezagos, la segunda es el modelo con dos rezagos. Todas las medidas
en esta tabla apuntan al segundo modelo (dos lags) como una mejor especificación.
Una nota sobre cómo se crearon estas tablas en R es de interés. La tabla 9.1 se creó
utilizando la función cbind, que agrupa varias columnas (vectores); la tabla 9.4 utilizó
dos funciones: rbind (), que reúne dos filas, y as.numeric, que extrae solo los números
del objeto de vista, sin los nombres de las columnas.
9.3 Correlación serial
La correlación en serie, o autocorrelación en una serie de tiempo describe la correlación
entre dos observaciones separadas por uno o varios períodos. Las series temporales
tienden a mostrar la autocorrelación más que las secciones transversales debido a su
naturaleza ordenada. La autocorrelación podría ser un atributo de una serie,
independientemente del modelo en el que aparece esta serie. Sin embargo, si esta serie
es un término de error, sus propiedades dependen del modelo, ya que las series de error
solo pueden existir en relación con un modelo.
plot(okun.ts[,"g"], ylab="growth")
plot(okun.ts[,"u"], ylab="unemployment")

Figura 9.1: Tasas de crecimiento y desempleo en el conjunto de datos "okun"


El gráfico de "crecimiento" en la Figura 9.1 muestra grupos de valores: positivo durante
varios períodos seguidos por algunos valores negativos, lo que es una indicación de
autocorrelación; Lo mismo ocurre con el desempleo, que no cambia tan
dramáticamente como el crecimiento, pero sigue mostrando persistencia.
ggL1 <- data.frame(cbind(okun.ts[,"g"], lag(okun.ts[,"g"],-1)))
names(ggL1) <- c("g","gL1")
plot(ggL1)
meang <- mean(ggL1$g, na.rm=TRUE)
abline(v=meang, lty=2)
abline(h=mean(ggL1$gL1, na.rm=TRUE), lty=2)

ggL2 <- data.frame(cbind(okun.ts[,"g"], lag(okun.ts[,"g"],-2)))


names(ggL2) <- c("g","gL2")
plot(ggL2)
meang <- mean(ggL2$g, na.rm=TRUE)
abline(v=meang, lty=2)
abline(h=mean(ggL2$gL2, na.rm=TRUE), lty=2)

Figura 9.2: Gráficos de dispersión entre "g" y sus retrasos


Las figuras 9.2 ilustran la correlación entre la tasa de crecimiento y sus dos primeros
retrasos, que es, de hecho, la autocorrelación. ¿Pero hay una prueba más precisa para
detectar la autocorrelación?
Supongamos que deseamos probar la hipótesis formulada en la Ecuación 2, donde ρk es
el coeficiente de autocorrelación del orden k de la población k.

Se puede construir una prueba basada en el coeficiente de correlación de la muestra,

que mide la correlación entre una variable y su lag; el estadístico de prueba


se da en la ecuación 3, donde T es el número de períodos.

Para un nivel de significación del 5%, Z debe estar fuera del intervalo [−1.96,1,96], es
decir, en la región de rechazo. Rechazar la hipótesis nula es, en este caso, una mala
noticia, ya que el rechazo constituye una evidencia de autocorrelación. Entonces, para
una manera de recordar el significado de la prueba, uno puede pensar que es una
prueba de no autocorrelación.
Los resultados de la prueba de (no) autocorrelación generalmente se resumen en un
correlograma, un diagrama de barras que visualiza los valores del estadístico de prueba
durante varios retrasos, así como el intervalo de confianza del 95%. Una barra
que supera (hacia arriba o hacia abajo) los límites del intervalo de confianza
indica autocorrelación para el retraso correspondiente.
growth_rate <- okun.ts[,"g"]
acf(growth_rate)

Figura 9.3: Correlograma para la tasa de crecimiento, conjunto de datos "okun"

La Figura 9.3 es un correlograma, donde cada barra corresponde a un retardo,


comenzando con el retardo 0. El correlograma muestra poca o ninguna evidencia de
autocorrelación, excepto el primer y segundo retardo (segundo y tercer compás de la
figura).
Consideremos otro ejemplo, el conjunto de datos phillips_aus, que contiene datos
trimestrales sobre el desempleo y la inflación durante el período 1987Q1 a 2009Q3.
Deseamos aplicar la prueba de autocorrelación al término de error en una regresión de
series de tiempo para ver si se viola la no autocorrelación en los errores. Consideremos
el modelo FDL en la ecuación 4.
Primero echemos un vistazo a los gráficos de los datos (se dice que la visualización de
los datos es una buena práctica en el análisis de datos).
data("phillips_aus", package="PoEdata")
phill.ts <- ts(phillips_aus,
start=c(1987,1),
end=c(2009,3),
frequency=4)
inflation <- phill.ts[,"inf"]
Du <- diff(phill.ts[,"u"])
plot(inflation)
plot(Du)

Figura 9.4: Gráficos de tiempo de datos en el conjunto de datos 'phillips'


Las gráficas en la Figura 9.4 definitivamente muestran patrones en los datos tanto para
la inflación como para las tasas de desempleo. Pero nos interesa determinar si el
término de error en la Ecuación 4 satisface el supuesto de no autocorrelación del modelo
de regresión de series de tiempo.
phill.dyn <- dynlm(inf~diff(u),data=phill.ts)
ehat <- resid(phill.dyn)
kable(tidy(phill.dyn), caption="Summary of the `phillips`
model")

Tabla 9.5: Resumen del modelo phillips

La tabla 9.5 da un valor de p de 0.0238, que es significativo a un nivel de $ 5%. Pero, ¿es
este valor p confiable? Investiguemos la estructura de autocorrelación de los errores en
este modelo.
plot(ehat)
abline(h=0, lty=2)

Figura 9.5: Residuos de la ecuación de Phillips

corrgm <- acf(ehat)


plot(corrgm)

Figura 9.6: Correlograma de los residuos en el modelo de Phillips


El gráfico de series de tiempo en la Figura 9.5 sugiere que existen algunos patrones en
los residuos, lo que se confirma con el correlograma en la Figura 9.6. El resultado
anterior que sugiere que existe una relación significativa entre la inflación y el cambio
en la tasa de desempleo puede no ser, después de todo, demasiado confiable.
Si bien visualizar los datos y trazar el correlograma son métodos poderosos para
detectar la autocorrelación, en muchas aplicaciones necesitamos un criterio preciso,
una estadística de prueba para decidir si la autocorrelación es un problema. Uno de
estos métodos es la prueba de multiplicador de Lagrange. Supongamos que queremos
probar la autocorrelación en los residuales del modelo dado en la Ecuación 5, donde
asumimos que los errores tienen la estructura de autocorrelación descrita en la Ecuación
6.

Una prueba de autocorrelación se basaría en la hipótesis de la Ecuación 7.

Después de una pequeña manipulación algebraica, la regresión auxiliar que realmente


utiliza la prueba LM es la de la Ecuación 8.
El estadístico de prueba es donde es el coeficiente de determinación
resultante de estimar la ecuación auxiliar (Ecuación 8). En R, todos estos cálculos se
pueden hacer en un comando, bgtest (), que es la prueba de Breusch-Godfrey para la
función de autocorrelación. Esta función puede probar la autocorrelación de órdenes

superiores, lo que requiere incluir retrasos mayores para en la ecuación auxiliar.


Hagamos esta prueba para el ejemplo de Phillips. La siguiente secuencia de código
realiza primero la prueba para un solo retraso y utiliza una estadística F; luego, para
retrasos de hasta 4, usando una estadística χ2. R realiza esta prueba eliminando las
primeras observaciones que son necesarias para calcular los retrasos (fill = NA), o
estableciendo que sean iguales a cero (fill = 0).
a <- bgtest(phill.dyn, order=1, type="F", fill=0)
b <- bgtest(phill.dyn, order=1, type="F", fill=NA)
c <- bgtest(phill.dyn, order=4, type="Chisq", fill=0)
d <- bgtest(phill.dyn, order=4, type="Chisq", fill=NA)
dfr <- data.frame(rbind(a[c(1,2,4)],
b[c(1,2,4)],
c[c(1,2,4)],
d[c(1,2,4)]
))
dfr <- cbind(c("1, F, 0",
"1, F, NA", "4, Chisq, 0", "4, Chisq, NA"), dfr)
names(dfr)<-c("Method", "Statistic", "Parameters", "p-Value")
kable(dfr, caption="Breusch-Godfrey test for the Phillips
example")

Tabla 9.6: Prueba de Breusch-Godfrey para el ejemplo de Phillips

Las cuatro pruebas resumidas en la Tabla 9.6 rechazan la hipótesis nula de no


autocorrelación. La secuencia de código anterior requiere un poco de explicación. Las
primeras cuatro líneas realizan la prueba de BG en el modelo Phillips estimado
previamente (phill.dyn), utilizando varios parámetros: el orden le dice a R cuántos
retrasos queremos; type proporciona el estadístico de prueba que se utilizará, ya sea F
o χ2; y, finalmente, el relleno le dice a R si debe borrar las primeras observaciones o
reemplazarlas con e = 0. La primera columna en la Tabla 9.6 resume estas opciones:
número de retrasos, estadísticos de prueba utilizados y cómo se manejan las
observaciones faltantes.
El resto de la secuencia de códigos es solo para crear una forma clara y conveniente de
presentar los resultados de las cuatro pruebas. Como siempre, para inspeccionar el
contenido de un objeto como un tipo y ejecutar los nombres de comando (objeto).
¿Cuántos retrasos deben considerarse al realizar la prueba de autocorrelación? Una
sugerencia sería limitar la prueba a la cantidad de retrasos que muestra el correlograma
para superar la banda de confianza.
R puede realizar otra prueba de autocorrelación, Durbin-Watson, que se usa cada vez
menos debido a sus limitaciones. Sin embargo, puede considerarse cuando la muestra
es pequeña. El siguiente comando se puede utilizar para realizar esta prueba:
dwtest(phill.dyn)

##
## Durbin-Watson test
##
## data: phill.dyn
## DW = 0.8873, p-value = 2.2e-09
## alternative hypothesis: true autocorrelation is greater than 0

9.4 Estimación con errores correlacionados en serie


Al igual que en el caso de la heteroscedasticidad, la autocorrelación en los errores no
produce estimaciones sesgadas de los coeficientes en la regresión lineal, pero produce
errores estándar incorrectos. La similitud con la heterocedasticidad va incluso más allá:
con la autocorrelación es posible calcular los errores estándar correctos
(heterocedasticidad y autocorrelación coherentes, HAC), conocidos como errores
estándar de Newey-West.
Hay varias funciones en R que calculan los errores estándar de HAC, de los cuales elijo
tres, todas disponibles en el paquete sándwich.
library(sandwich)
s0 <- coeftest(phill.dyn)
s1 <- coeftest(phill.dyn, vcov.=vcovHAC(phill.dyn))
s2 <- coeftest(phill.dyn, vcov.=NeweyWest(phill.dyn))
s3 <- coeftest(phill.dyn, vcov.=kernHAC(phill.dyn))
tbl <- data.frame(cbind(s0[c(3,4)],s1[c(3,4)],
s2[c(3,4)],s3[c(3,4)]))
names(tbl) <- c("Incorrect","vcovHAC", "NeweyWest", "kernHAC")
row.names(tbl) <- c("(Intercept", "Du")
kable(tbl, digits=3,
caption="Comparing standard errors for the Phillips model")
Tabla 9.7: Comparación de errores estándar para el modelo de Phillips

La Tabla 9.7 compara tres versiones de errores estándar de HAC para la ecuación de
Phillips más los incorrectos de la ecuación inicial. Las diferencias provienen de diferentes
opciones para los métodos de cálculo.
La corrección de los errores estándar en un modelo con errores autocorrelacionados no
hace que el estimador de los coeficientes sea de una varianza mínima. Por lo tanto, nos
gustaría encontrar mejores estimadores, como lo hicimos en el caso de la
heteroscedasticidad. Veamos los modelos con una estructura particular del término de
error, una estructura denominada proceso autorregresivo de primer orden o modelo AR
(1), que se describe en la Ecuación 9. Se supone que la variable en este proceso tiene

una media y una variación constantes de cero, y los errores no deben ser
autocorrelacionados. Además, el coeficiente de autocorrelación, ρ, debe tomar valores

en el intervalo (−1,1). Se puede mostrar que


Las siguientes líneas de código calculan y muestran los coeficientes de correlación para
los primeros cinco retrasos en los residuales de la ecuación de Phillips (Ecuación 4).
Tenga en cuenta que las autocorrelaciones tienden a ser cada vez más pequeñas para
los retrasos, pero siguen siendo más altas de lo que implica la Ecuación 9.
ehat <- resid(phill.dyn)
ac <- acf(ehat, plot=FALSE)
# The Phillips equation: five lag correlations in residuals
ac$acf[2:6]

## [1] 0.548659 0.455732 0.433216 0.420494 0.339034

El coeficiente de correlación para el primer retraso es una estimación del coeficiente

en el proceso AR (1) definido en la Ecuación 9,


9.5 Estimación de mínimos cuadrados no lineales
El modelo de regresión lineal simple en la Ecuación 5 con AR (1) errores definidos en la
Ecuación 6 se puede transformar en un modelo con errores no correlacionados, como
lo muestra la Ecuación 10.
La ecuación 10 no es lineal en los coeficientes y, por lo tanto, necesita métodos
especiales de estimación. Aplicando las mismas transformaciones al modelo de Phillips
dado en la Ecuación 4, obtenemos su versión no lineal, la Ecuación 11.

La siguiente línea de código estima el modelo no lineal en la Ecuación 11 utilizando la


función nls (), que requiere los datos en forma de marco de datos. Las primeras líneas
de código crean variables separadas para inf y u y sus lags, y luego las reúne en un marco
de datos. Los principales argumentos de la función nls son los siguientes: formula, una
función no lineal de los parámetros de regresión, datos = un cuadro de datos y `start =
list (valores iniciales de conjetura de los parámetros), y otros.
library(dynlm)
phill.dyn <- dynlm(inf~diff(u), data=phill.ts)
# Non-linear AR(1) model with 'Cochrane-Orcutt method'nls'

phill.ts.tab <- cbind(phill.ts[,"inf"],


phill.ts[,"u"],
lag(phill.ts[,"inf"], -1),
diff(phill.ts[,"u"], lag=1),
lag(diff(phill.ts[,2],lag=1), -1)
)
phill.dfr <- data.frame(phill.ts.tab)
names(phill.dfr) <- c("inf", "u", "Linf", "Du", "LDu")
phill.nls <- nls(inf~b1*(1-rho)+b2*Du+rho*Linf-
rho*b2*LDu,
data=phill.dfr,
start=list(rho=0.5, b1=0.5, b2=-0.5))
s1 # This is `phill.dyn` with HAC errors:

##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.77762 0.09485 8.198 1.82e-12 ***
## diff(u) -0.52786 0.30444 -1.734 0.0864 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

phill.dyn # The simple linear model:

##
## Time series regression with "ts" data:
## Start = 1987(2), End = 2009(3)
##
## Call:
## dynlm(formula = inf ~ diff(u), data = phill.ts)
##
## Coefficients:
## (Intercept) diff(u)
## 0.778 -0.528

phill.nls # The 'nls' model:

## Nonlinear regression model


## model: inf ~ b1 * (1 - rho) + b2 * Du + rho * Linf - rho * b2 * LDu
## data: phill.dfr
## rho b1 b2
## 0.557 0.761 -0.694
## residual sum-of-squares: 23.2
##
## Number of iterations to convergence: 3
## Achieved convergence tolerance: 8.06e-06

coef(phill.nls)[["rho"]]

## [1] 0.557398
La comparación del modelo no lineal con los dos modelos lineales (con y sin errores
estándar de HAC) muestra diferencias tanto en los coeficientes como en los errores
estándar. Esto es una indicación de que la estimación no lineal es una mejor opción que
los errores estándar de HAC. Tenga en cuenta que el modelo NLS proporciona una
estimación del coeficiente de autocorrelación, ρ = 0.557.
9.6 Un modelo más general
La ecuación 12 proporciona un modelo de retraso distribuido autorregresivo, que es una
generalización del modelo presentado en la ecuación 10. Los dos modelos son

equivalentes bajo la restricción

La ecuación 13 es la versión de Phillips del modelo ARDL dada por la ecuación 12.

Se puede usar una prueba de Wald para decidir si los dos modelos, el no lineal y el más
general son equivalentes.
s.nls <- summary(phill.nls)
phill.gen <- dynlm(inf~L(inf)+d(u)+L(d(u)),
data=phill.ts)
s.gen <- summary(phill.gen)
nlW <- nlWaldtest(phill.gen, texts="b[4]=-b[2]*b[3]")
La función R que realiza la prueba de Wald es nlWaldtest en el paquete nlWaldTest, que

puede probar restricciones no lineales. El resultado en nuestro caso es un valor de


de 0.11227, con un p-valor de 0.737574, que no rechaza la hipótesis nula de que la

restricción no puede ser rechazada, lo que hace, a su vez, equivalentes


a las ecuaciones 11 y 13.
Las líneas de código anteriores usan la L y la d del paquete dynlm para construir retrasos
y diferencias en series de tiempo. A diferencia de las funciones similares que hemos
usado anteriormente (lag y diff), estas no funcionan fuera del comando dynlm. Tenga en
cuenta que la creación de retrasos con retraso () requiere especificar el signo negativo
del retraso, lo que no es necesario para la función L().
phill1.gen <- dynlm(inf~lag(inf, -1)+diff(u)+lag(diff(u), -1),
data=phill.ts)

Los resultados pueden compararse en las Tablas 9.8 y 9.9.


kable(tidy(phill.gen),
caption="Using dynlm with L and d operators")

Tabla 9.8: Uso de dynlm con operadores L y d

kable(tidy(phill1.gen),
caption="Using dynlm with lag and diff operators")

Tabla 9.9: Uso de dynlm con operadores de retardo y diff.

9.7 Modelos autorregresivos


Un modelo autorregresivo de orden p, AR (p) (Ecuación 14) es un modelo con p retrasos
de la respuesta que actúan como variables independientes y no otros regresores.

La siguiente secuencia de códigos y la Tabla 9.10 muestran un modelo autorregresivo de


orden 2 utilizando la serie g en el archivo de datos okun.
data(okun)
okun.ts <- ts(okun)
okun.ar2 <- dynlm(g~L(g)+L(g,2), data=okun.ts)
kable(tidy(okun.ar2), digits=4,
caption="Autoregressive model of order 2 using the dataset
$okun$")

Tabla 9.10: Modelo autorregresivo de orden 2 usando el conjunto de datos okun

Cómo podemos decidir cuántos retrasos se incluirán en un modelo autorregresivo? Una


forma es observar el correlograma de la serie e incluir los retrasos que muestran la
autocorrelación. El siguiente código crea el correlograma en los residuos AR (2) de la
serie del PIB de EE. UU. El correlograma en la Figura 9.7 muestra que, básicamente, solo
se pueden incluir los dos primeros retrasos.
res.ar2 <- resid(okun.ar2)
Acf(res.ar2, lag.max=12) # New: Acf() from package forecast

Figura 9.7: Correlograma residual para el modelo AR (2) del PIB de EE. UU.
Otra forma de elegir la especificación de un modelo autorregresivo es comparar
modelos de varios pedidos y elegir el que proporcione el valor más bajo de AIC o BIC.
aics <- rep(0,5)
bics <- rep(0,5)
y <- okun.ts[,"g"]
for (i in 1:5){
ari <- dynlm(y~L(y,1:i), start=i)
aics[i] <- AIC(ari)
bics[i] <- BIC(ari)
}
tbl <- data.frame(rbind(aics, bics))
names(tbl) <- c("1","2","3","4","5")
row.names(tbl) <- c("AIC","BIC")
kable(tbl, digits=1, align='c',
caption="Lag order selection for an AR model")

Tabla 9.11: Selección de orden de retraso para un modelo AR

La Tabla 9.11 muestra los valores AIC y BIC (o SC) para modelos autorregresivos en el
PIB de EE. UU. En el conjunto de datos okun con un número de retrasos de 1 a 5. (Como
se mencionó anteriormente, los números no coinciden con los de PoE, pero la
clasificación sí lo hace). El valor AIC más bajo indica que el modelo óptimo debe incluir
cuatro rezagos, mientras que los valores BIC indican el modelo con solo dos rezagos
como ganador. Se pueden tener en cuenta otros criterios en tal situación, por ejemplo,
el correlograma, que concuerda con la elección del modelo por parte del BIC.
El fragmento de código anterior necesita una explicación. Las dos primeras líneas
inicializan los vectores que van a contener los resultados AIC y BIC. El problema de
cambiar automáticamente el número de regresores se resuelve utilizando la función
conveniente L (y, 1: i). AIC () y BIC () son funciones R básicas.
9.8 Pronóstico
Consideremos primero un modelo autorregresivo (AR), ejemplificado por el crecimiento
del PIB de EE. UU. Con dos rezagos especificados en la Ecuación 15.

Una vez que se estiman los coeficientes de este modelo, se pueden usar para predecir
(pronosticar) los valores futuros de la variable de respuesta. Hagamos esto para los
períodos T + 1, T + 2 y T + 3, donde T es el último período en la muestra. La ecuación 16

da el pronóstico para el período en el futuro.

y <- okun.ts[,"g"]
g.ar2 <- dynlm(y~L(y, 1:2))
kable(tidy(g.ar2), caption="The AR(2) growth model")

Tabla 9.12: El modelo de crecimiento AR (2)

La tabla 9.12 muestra los resultados del modelo AR (2). R utiliza la función forecast () en
el pronóstico del paquete para calcular automáticamente los pronósticos basados en
modelos autorregresivos u otras series de tiempo. Uno de estos modelos es ar (), que
ajusta un modelo autorregresivo a una serie temporal univariada. Los argumentos de ar
() incluyen: x = el nombre de la serie de tiempo, aic = VERDADERO, si queremos la
selección automática del número de retrasos según el criterio de información AIC; de lo
contrario, aic = FALSO; order.max = el máximo orden de retraso en el modelo
autorregresivo.
ar2g <- ar(y, aic=FALSE, order.max=2, method="ols")
fcst <- data.frame(forecast(ar2g, 3))
kable(fcst, digits=3,
caption="Forcasts for the AR(2) growth model")

Tabla 9.13: Forcasts para el modelo de crecimiento AR (2)

La Tabla 9.13 muestra los valores pronosticados para tres períodos futuros basados en
el modelo de crecimiento AR (2).
plot(forecast(ar2g,3))

Figura 9.8: Pronósticos e intervalos de confianza para tres períodos futuros

a Figura 9.8 ilustra los pronósticos producidos por el modelo AR (2) del PIB de EE. UU. Y
sus estimaciones de intervalo.
El uso de más información bajo la forma de regresores adicionales puede mejorar la
precisión de los pronósticos. Ya hemos estudiado los modelos ARDL; Usemos un modelo
de este tipo para pronosticar la tasa de desempleo según los datos de desempleo
pasados y el crecimiento del PIB. El conjunto de datos sigue siendo correcto y el modelo
es un ARDL (1,1) como el de la Ecuación 17.

Ya que estamos interesados en pronosticar los niveles de desempleo, no las diferencias,


queremos transformar el modelo ARDL (1,1) en la Ecuación 17 en ARDL (2,1) uno en la
Ecuación 18.

Otro modelo de pronóstico es el suavizamiento exponencial, que, al igual que el modelo


AR, usa solo la variable para pronosticar. Además, el modelo de suavizado exponencial
requiere un parámetro de ponderación, α, y un nivel inicial de la variable pronosticada,

El pronóstico del próximo período es un promedio ponderado del nivel de este


período y el pronóstico de este período, como se indica en la Ecuación 19.

Hay varias formas de calcular un pronóstico de suavizado exponencial en R. Sólo uso dos
aquí, para la comparación. La primera es la función ets () en el paquete de forecast.
y <- okun.ts[,"g"]
okun.ets <- ets(y)
okunf.ets <- forecast(okun.ets,1) #one-period forecast
plot(okunf.ets)

Figura 9.9: Pronóstico de suavizado exponencial usando 'ets'


Los resultados incluyen el valor computado del peso, α = 0.381, la estimación puntual

de la tasa de crecimiento y la estimación del intervalo del 95 por


ciento (−1.051, 1.158). La figura 9.9 ilustra estos resultados.
El segundo método utiliza la función HoltWinters y se muestra en el siguiente fragmento
de código.
okun.HW <- HoltWinters(y, beta=FALSE, gamma=FALSE)
plot(okun.HW)

Figura 9.10: Pronóstico de suavizado exponencial usando 'HoltWinters'


okunf.HW <- forecast(okun.HW,1)

Al igual que la función ets, HoltWinters determina automáticamente el peso óptimo α


del modelo de suavizado exponencial. En nuestro caso, el valor es α = 0.381. La

estimación puntual es y la estimación del intervalo del 95 por ciento


es (−1.06,1.168). La figura 9.10 compara la serie pronosticada con la real.
9.9 Análisis multiplicador
En un modelo ARDL (p, q), si una variable cambia en algún período, afecta la respuesta
en varios períodos subsiguientes. El análisis multiplicador cuantifica estos efectos de
tiempo. Permítame recordarle la forma del modelo ARDL (p, q) en la Ecuación 20.

El modelo en la Ecuación 20 se puede transformar por sustitución iterativa en un modelo


de retardo distribuido infinito, que incluye solo variables explicativas sin retrasos en la
respuesta. El modelo transformado se muestra en la ecuación 21.

El coeficiente βs en la ecuación 21 se denomina multiplicador de retardo del período s;


la suma de los β de hoy al periodo s en el pasado se llama multiplicador interino, y la
suma de todos los periodos al infinito se llama multiplicador total.
El coeficiente βs en la ecuación 21 se denomina multiplicador de retardo del período s;
la suma de los βs de hoy al periodo s en el pasado se llama multiplicador interino, y la
suma de todos los periodos al infinito se llama multiplicador total.

CAPÍTULO 8 HETEROSCEDASTICIDAD.
rm(list=ls()) #Removes all items in Environment!
library(lmtest) #for coeftest() and bptest().
library(broom) #for glance() and tidy()
library(PoEdata) #for PoE4 datasets
library(car) #for hccm() robust standard errors
library(sandwich)
library(knitr)
library(stargazer)

Referencia para el paquete sandwich (Lumley y Zeileis 2015).


Una de las suposiciones del teorema de Gauss-Markov es la homoskedasticidad, que
requiere que todas las observaciones de la variable de respuesta (dependiente)

provengan de distribuciones con la misma varianza Sin embargo, en muchas


aplicaciones económicas, la extensión de y tiende a depender de uno o más de los
regresores x. Por ejemplo, en el modelo de regresión simple de alimentos (Ecuación 1),
el gasto en alimentos se mantiene más cercano a su media (línea de regresión) en
ingresos más bajos y se distribuye más sobre su media en ingresos más altos. Piensa
simplemente que las personas tienen más opciones con ingresos más altos, ya sea que
gasten sus ingresos adicionales en alimentos o en otra cosa.

En presencia de heterocedasticidad, los estimadores de coeficientes siguen siendo


insesgados, pero su varianza se calcula incorrectamente por el método habitual de MCO,
lo que hace que los intervalos de confianza y las hipótesis también sean incorrectos. Por
lo tanto, se deben aplicar nuevos métodos para corregir las variaciones.
8.1 Detección de heterocedasticidad en parcelas de dispersión
data("food",package="PoEdata")
mod1 <- lm(food_exp~income, data=food)
plot(food$income,food$food_exp, type="p",
xlab="income", ylab="food expenditure")
abline(mod1)

Figura 8.1: Heteroscedasticidad en los datos de "foods"


Otro método útil para visualizar la posible heteroscedasticidad es trazar los residuos
contra los regresores sospechosos de crear heteroscedasticidad o, más generalmente,
contra los valores ajustados de la regresión. La Figura 8.2 muestra estas dos opciones
para el modelo simple de food_exp.
res <- residuals(mod1)
yhat <- fitted(mod1)
plot(food$income,res, xlab="income", ylab="residuals")
plot(yhat,res, xlab="fitted values", ylab="residuals")

Figura 8.2: Parcelas de residuos en el modelo de "foods"


8.2 Pruebas de heterocedasticidad
Supongamos que el modelo de regresión que queremos probar para la
heterocedasticidad es el de la Ecuación 2.
La prueba que estamos construyendo asume que la varianza de los errores es una

función de un número de regresores que puede o no estar presente en el


modelo de regresión inicial que queremos probar. La ecuación 3 muestra la forma
general de la función de varianza.

La varianza es constante solo si todos los coeficientes de los regresores en


la Ecuación 3 son cero, lo que proporciona la hipótesis nula de nuestra prueba de
heteroscedasticidad que se muestra en la Ecuación 4

Como no conocemos las verdaderas variaciones de la variable de respuesta todo lo


que podemos hacer es estimar los residuos del modelo inicial en la Ecuación 2 y

reemplazar en la Ecuación 3 con los residuos estimados. Para una función lineal
la ecuación de prueba es, finalmente, la ecuación 5.

El estadístico de prueba relevante es dado por la Ecuación 6, donde es el


resultado de la Ecuación 5.

La prueba de heterocedasticidad de Breusch-Pagan utiliza el método que acabamos de

describir, donde los regresores son las variables en el modelo inicial.


Apliquemos esta prueba al modelo alimenticio. La función para determinar un valor

crítico de la distribución de para un nivel de significancia α y S-1 grados de libertad


es qchisq (1-alpha, S-1).
alpha <- 0.05
mod1 <- lm(food_exp~income, data=food)
ressq <- resid(mod1)^2
#The test equation:
modres <- lm(ressq~income, data=food)
N <- nobs(modres)
gmodres <- glance(modres)
S <- gmodres$df #Number of Betas in model
#Chi-square is always a right-tail test
chisqcr <- qchisq(1-alpha, S-1)
Rsqres <- gmodres$r.squared
chisq <- N*Rsqres
pval <- 1-pchisq(chisq,S-1)

Nuestra prueba arroja un valor del estadístico de prueba χ2 de 7.38, que se compara

con el crítico que tiene S − 1 = 1 grado de libertad y α = 0.05. Este valor crítico es
cr2cr = 3.84. Como el χ2 calculado supera el valor crítico, rechazamos la hipótesis nula
de la homoscedasticidad, lo que significa que hay heterocedasticidad en nuestros datos
y modelo. Alternativamente, podemos encontrar el valor de p correspondiente al χ2
calculado, p = 0.007.
Hagamos ahora la misma prueba, pero usando una versión blanca de la ecuación de
residuos, en su forma cuadrática.
modres <- lm(ressq~income+I(income^2), data=food)
gmodres <- glance(modres)
Rsq <- gmodres$r.squared
S <- gmodres$df #Number of Betas in model
chisq <- N*Rsq
pval <- 1-pchisq(chisq, S-1)

El valor p calculado en esta versión es p = 0.023, lo que también implica el rechazo de la


hipótesis nula de la homoscedasticidad.
La función bptest () en el paquete lmtest realiza (la versión robusta de) la prueba
Breusch-Pagan en R. El siguiente código aplica esta función a la ecuación básica de
alimentos, que muestra los resultados en la Tabla 8.1, donde "estadística" es el χ2
calculado.
mod1 <- lm(food_exp~income, data=food)
kable(tidy(bptest(mod1)),
caption="Breusch-Pagan heteroskedasticity test")

Tabla 8.1: Prueba de heteroscedasticidad de Breusch-Pagan

La prueba de heteroscedasticidad de Goldfeld-Quandt es útil cuando el modelo de


regresión que se va a probar incluye una variable indicadora entre sus regresores. La
prueba compara la varianza de un grupo de la variable indicadora (por ejemplo, el grupo
1) con la varianza del grupo de referencia (por ejemplo, el grupo 0), como muestra la
hipótesis nula en la Ecuación 7.

El estadístico de prueba cuando la hipótesis nula es verdadera, dada en la Ecuación 8,


tiene una distribución F con sus dos grados de libertad iguales a los grados de libertad
de las dos submuestras, respectivamente, y

Apliquemos esta prueba a una ecuación salarial basada en el conjunto de datos cps2,
donde metro es una variable indicadora igual a 1 si el individuo vive en un área
metropolitana y 0 para el área rural. Dividiré el conjunto de datos en dos según la
variable de indicador metro y aplicaré el modelo de regresión (Ecuación 9) por separado
a cada grupo.

alpha <- 0.05 #two tail, will take alpha/2


data("cps2", package="PoEdata")
#Create the two groups, m (metro) and r (rural)
m <- cps2[which(cps2$metro==1),]
r <- cps2[which(cps2$metro==0),]
wg1 <- lm(wage~educ+exper, data=m)
wg0 <- lm(wage~educ+exper, data=r)
df1 <- wg1$df.residual #Numerator degrees of freedom
df0 <- wg0$df.residual #Denominatot df
sig1squared <- glance(wg1)$sigma^2
sig0squared <- glance(wg0)$sigma^2
fstat <- sig1squared/sig0squared
Flc <- qf(alpha/2, df1, df0)#Left (lower) critical F
Fuc <- qf(1-alpha/2, df1, df0) #Right (upper) critical F

Los resultados de estos cálculos son los siguientes: la estadística F calculada F = 2.09, el

valor crítico de la cola inferior y el valor crítico de la cola superior


Dado que la cantidad calculada es mayor que el valor crítico superior,
rechazamos la hipótesis de que las dos varianzas son iguales, enfrentando, por lo tanto,
un problema de heteroscedasticidad. Si se espera que la varianza en el área
metropolitana sea mayor y se quiera probar la hipótesis (alternativa)
se debe volver a calcular el valor crítico para α =
0.05 de la siguiente manera:
Fc <- qf(1-alpha, df1, df0) #Right-tail test

El valor crítico para la prueba de la cola derecha es lo que todavía implica


rechazar la hipótesis nula.
La prueba Goldfeld-Quant puede utilizarse incluso cuando no hay una variable
indicadora en el modelo o en el conjunto de datos. Uno puede dividir el conjunto de
datos en dos usando una regla arbitraria. Apliquemos el método a la ecuación básica de

food, con los datos divididos en mitades de bajos ingresos y de altos ingresos
. El punto de corte es, en este caso, el ingreso medio y la hipótesis a probar.

alpha <- 0.05


data("food", package="PoEdata")
medianincome <- median(food$income)
li <- food[which(food$income<=medianincome),]
hi <- food[which(food$income>=medianincome),]
eqli <- lm(food_exp~income, data=li)
eqhi <- lm(food_exp~income, data=hi)
dfli <- eqli$df.residual
dfhi <- eqhi$df.residual
sigsqli <- glance(eqli)$sigma^2
sigsqhi <- glance(eqhi)$sigma^2
fstat <- sigsqhi/sigsqli #The larger var in numerator
Fc <- qf(1-alpha, dfhi, dfli)
pval <- 1-pf(fstat, dfhi, dfli)

Você também pode gostar