Basic Econometrics from Damodar Gujarati and Dawn Porter: R replications
En esta entrada se presenta, una de las tantas formas, de replicar los ejemplos de la 5ta edición del libro Basic Economectics de Damodar Gujarati y Dawn Porter.
Hace mucho que no se publicaba nada en este blog respecto a temas de econometría y es irónico, ya que el nombre es r-econ que hace referencia a econometría con R, sin embargo, espero con estas nuevas entradas, honrar el nombre del blog.
Empecemos por el incio, ¿por qué este libro y no el de Wooldridge o cualquier otro de econometría?, precisamente, porque le tengo un cariño muy especial a este libro y es de los de referencia más básicas que muchos estudiantes consultan; posteriormente, espero tener la oportunidad de replicar los ejemplos de otros libros intermedios y más avanzados, no el de Wooldridgre, porque este ya tiene solución en esta página.
Antes de empezar, quiero aclarar que esto no pretende de ser un manual de solución a los ejercicios propuestos, esto sería darles un atajo a los estudiantes y quitarles el incentivo del estudio, más bien, esto es sólo, como su título lo indica, la forma de replicar los ejemplos de las regresiones presentadas en cada capítulo del libro usando mi herramienta de trabajo preferida: R! para que sea un punto de partida para aquellos que quieran reciclar estos códigos y hacerlos suyos en el estudio de la econometría.
Los datos se importarán directamente del sitio https://rdrr.io/github/brunoruas2/gujarati/. Dicho todo lo anterior, vamos a ponernos manos a la obra.
Instalación de paquete con los datos
Primero procederemos a instalar de github el paquete necesario para obtener las tablas de datos de nuestro interés, para ello hacemos lo siguiente:
install.packages("remotes")
remotes::install_github("brunoruas2/gujarati")
library(gujarati)
Introduction
Dado que la Tabla I.1 no se encuentra disponible en el paquete previamente instalado, vamos a obtenerla de la página econometrics.com
Table_I.1 <- read.delim("http://www.econometrics.com/manuals/gujarati/data_3.1.shd", sep=" ", header=FALSE)[,2:4]
colnames(Table_I.1) <- c("Year", "PCE", "GDP")
plot(Table_I.1$GDP, Table_I.1$PCE,
bty = "l",
main = "Figure I.3: Personal consumption expenditure (Y)
in relation to GDP (X), 1982-1996, in billions of 2000 dollars.",
font.main = 1,
xlab = "GDP (X)",
ylab = "PCE (Y)")
abline(lm(PCE~GDP, data=Table_I.1))
Chapter 1: The Nature of Regression Analysis
library(gujarati) # carga las tablas del libro
library(readr) # para usar parse_number
Este paquete tiene un problema en la definición de los datos dentro de los dataframes, todos los datos los presenta como factor, aún debiendo ser valores numéricos, se presentan como factor por lo cual, antes de empezar vamos a crear una función para que cargue correctamente los datos y no tengamos que estar corrigiendo en cada tabla los valores con el atributo incorrecto.
load_table <- function(df){
ind_character <- sapply(lapply(df, grepl, pattern="\\d+\\.?\\d*"), any)
df[ ,ind_character] <- data.frame(sapply(df[,ind_character], function(x) readr::parse_number(as.character(x))))
return(df)
}
Table1_1 <- load_table(Table1_1)
plot(Table1_1$Y1,Table1_1$X1, xaxt="n", yaxt="s",
main="FIGURE 1.6: Relationship between eggs produced and prices, 1990",
font.main=1,
ylab="Price of eggs per dozen (in cents)",
xlab="Number of eggs produced (millions)",
bty="l")
axis(2, xaxp=c(40,160,6))
axis(1, xaxp=c(0,8000,4))
Chapter 2: Two-Variable Regression Analysis: Some Basic Ideas
Aparentemente, las columnas de todas las tablas de este paquete son factor, por lo cual siempre vamos estar convirtiendo a numéricas las variables que así deben ser, es molesto pero es la solución de momentánea.
Table2_4 <- load_table(Table2_4)
Table2_5 <- load_table(Table2_5)
plot(c(80,260), c(1,200),
main = "Figure 2.4",
xlab = "Weekly income, $",
ylab = "Weekly consumption expenditure, $",
type = "n", bty="l", xaxt = "n",
sub = "Figure 2.4 Regression lines based on two different samples")
axis(1, xaxp = c(80,260,9), tick = TRUE)
points(Table2_4$X, Table2_4$Y, pch=20, bty="l")
points(Table2_5$X, Table2_5$Y, pch=4)
abline(coef(lm(Y ~ X, data=Table2_4)))
abline(coef(lm(Y ~ X, data=Table2_5)), lty=2)
savefont <- par(font=6)
legend("topleft",c("First sample (Table 2.4)", "Second sample (Table 2.5)"),
pch = c(4, 20), col=c("black"), bg="white", bty="n")
text(170,160, "Regression based on \n the second sample", adj = c(0, -.1))
arrows(x0=205, y0=157, x1=225, y1=150, length=0.1, code=0, col="gray30", lwd=1)
text(220,105, "Regression based on \n the first sample", adj = c(0, -.1))
Chapter 3: Two-Variable Regression Model: The Problem of Estimation
EXAMPLE 3.1
# reutilizamos la Table_I.1
model3_1 <- lm( PCE ~ GDP, Table_I.1 )
summary(model3_1)
##
## Call:
## lm(formula = PCE ~ GDP, data = Table_I.1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -131.44 -67.37 -42.13 -8.75 1013.72
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -181.13011 67.77077 -2.673 0.0105 *
## GDP 0.70578 0.01043 67.659 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 175.7 on 44 degrees of freedom
## Multiple R-squared: 0.9905, Adjusted R-squared: 0.9903
## F-statistic: 4578 on 1 and 44 DF, p-value: < 2.2e-16
Para un output más profesional, listo para imprimir, podemos utilizar stargazer:
#library(stargazer)
stargazer::stargazer(model3_1, type="html")
Dependent variable: | |
PCE | |
GDP | 0.706*** |
(0.010) | |
Constant | -181.130** |
(67.771) | |
Observations | 46 |
R2 | 0.990 |
Adjusted R2 | 0.990 |
Residual Std. Error | 175.724 (df = 44) |
F Statistic | 4,577.750*** (df = 1; 44) |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 3.2
Table2_8 <- load_table(Table2_8)
model3_2 <- lm(FOODEXP ~ TOTALEXP, data = Table2_8)
stargazer::stargazer(model3_2, type='html')
Dependent variable: | |
FOODEXP | |
TOTALEXP | 0.437*** |
(0.078) | |
Constant | 94.209* |
(50.856) | |
Observations | 55 |
R2 | 0.370 |
Adjusted R2 | 0.358 |
Residual Std. Error | 66.856 (df = 53) |
F Statistic | 31.103*** (df = 1; 53) |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 3.3
Table3_3 <- load_table(Table3_3)
model3_3 <- lm(Cellphone ~ Pcapincome, data = Table3_3)
model3_4 <- lm(PCs ~ Pcapincome, data = Table3_3)
stargazer::stargazer(model3_3, model3_4, title = "Example 3.3", align = TRUE, type='html')
Dependent variable: | ||
Cellphone | PCs | |
(1) | (2) | |
Pcapincome | 0.002*** | 0.002*** |
(0.0003) | (0.0001) | |
Constant | 14.467** | -6.583** |
(6.152) | (2.744) | |
Observations | 34 | 34 |
R2 | 0.602 | 0.829 |
Adjusted R2 | 0.590 | 0.824 |
Residual Std. Error (df = 32) | 20.555 | 9.167 |
F Statistic (df = 1; 32) | 48.476*** | 155.177*** |
Note: | p<0.1; p<0.05; p<0.01 |
Chapter 4: Classical Normal Linear Regression Model (CNLRM)
##install.packages("maxLik")
library(maxLik)
# Definiendo la verosimilitud
loglik <- function(theta){
b1 <- theta[1]
b2 <- theta[2]
sigma <- theta[3]
n <- nrow(Table2_8)
# Esto corresponde a la Eq. (5) de la página 103
(-n*log(sigma)) - ((n/2)*log(2*pi)) - (1/2)* sum((Table2_8$FOODEXP-b1-b2*Table2_8$TOTALEXP)^2/sigma^2)
}
# maximixando el logaritmo de la verosimilitud:
results_loglik <- maxLik(loglik, start = c(b1=100, b2=1, sigma=60), method = "NR")
summary(results_loglik)
## --------------------------------------------
## Maximum Likelihood estimation
## Newton-Raphson maximisation, 40 iterations
## Return code 8: successive function values within relative tolerance limit (reltol)
## Log-Likelihood: -308.1625
## 3 free parameters
## Estimates:
## Estimate Std. error t value Pr(> t)
## b1 94.20622 4.73688 19.89 <2e-16 ***
## b2 0.43681 0.01539 28.38 <2e-16 ***
## sigma 65.63805 2.20132 29.82 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## --------------------------------------------
Como se puede observar los resultados son muy parecidos (casi iguales) a los obtenidos por Mínimos Cuadrados Ordinarios (MCO), sin embargo, debo aclarar dos puntos:
- El resultado obtenido en
sigma
corresponde a la desviación estándar, así, para obtener la varianza se tiene que elevar ese resultado al cuadrado, por tanto, la varianza estimada esresults$estimate["sigma"]^2
que da como resultado 4308.354. - El otro punto importante es que hay un fallo en el libro donde indica que el estimador máximoverosimil (ML) de la varianza de los residuos es 4407.1563 en realidad es 4307.157, el cual puede extraerse basado en la ecuación (14) del libro y con la siguiente instrucción de R
sum(model3_2$residuals^2)/55
. La estimación de la varianza de los errores por MCO es correcta según reporta el libro y se obtiene en R a partir de:sum(model3_2$residuals^2)/53
Cabe destacar que estas diferencias respecto a los resultados presentados en el libro se debe, principalmente, a que la respuesta del libro es una respuesta exacta obtenida a partir de las expresiones analíticas de cada estimador máximo verosímil, mientras que las respuestas obtenidas usando maxLik
es una aproximación basado en optimización numérica.
Chapter 5: Two-Variable Regression: Interval Estimation and Hypothesis Testing
Sin ejercicios que reproducir
Chapter 6: Extensions of the Two-Variable Linear Regression Model
Regresión a través del origen (es decir, regresión sin intercepto)
EXAMPLE 6.1
Table6_1 <- load_table(Table6_1)
model6_1 <- lm(Y ~ X - 1, data = Table6_1) # sin intercepto
model6_2 <- lm(Y ~ X, data = Table6_1) # con intercepto
stargazer::stargazer(model6_1, model6_2, type="html", title = "Example 6.1")
Dependent variable: | ||
Y | ||
(1) | (2) | |
X | 1.156*** | 1.171*** |
(0.074) | (0.075) | |
Constant | -0.447 | |
(0.363) | ||
Observations | 240 | 240 |
R2 | 0.502 | 0.503 |
Adjusted R2 | 0.500 | 0.501 |
Residual Std. Error | 5.549 (df = 239) | 5.543 (df = 238) |
F Statistic | 241.243*** (df = 1; 239) | 241.336*** (df = 1; 238) |
Note: | p<0.1; p<0.05; p<0.01 |
Regresión sobre variables estandarizadas.
Table6_2 <- load_table(Table6_2)
model6_3 <- lm(GPDIBL ~ GDPB, data = Table6_2) # Eq (6.3.6)
model6_4 <- lm(GPDIBL ~ GDPB, data = data.frame(scale(Table6_2[, c("GPDIBL", "GDPB")]))) # Eq (6.3.7)
stargazer::stargazer(model6_3, model6_4, type="html", align = TRUE)
Dependent variable: | ||
GPDIBL | ||
(1) | (2) | |
GDPB | 0.254*** | 0.982*** |
(0.013) | (0.050) | |
Constant | -926.090*** | 0.000 |
(116.358) | (0.049) | |
Observations | 16 | 16 |
R2 | 0.965 | 0.965 |
Adjusted R2 | 0.962 | 0.962 |
Residual Std. Error (df = 14) | 66.427 | 0.194 |
F Statistic (df = 1; 14) | 383.469*** | 383.469*** |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 6.3
#install.packages("equatiomatic")
library(equatiomatic)
Table6_3 <- load_table(Table6_3)
model6_5 <- lm(log(EXPDUR) ~ log(PCEXP), data=Table6_3)
extract_eq(model6_5, wrap = TRUE, use_coefs = TRUE) # para extraer la ecuación como se presenta en el libro
\[ \begin{aligned} \operatorname{\widehat{log(EXPDUR)}} &= -7.54 + 1.63(\operatorname{\log(PCEXP)}) \end{aligned} \]
EXAMPLE 6.4
Table6_3$T <- 1:nrow(Table6_3)
model6_6 <- lm(log(EXPSERVICES) ~ T, data=Table6_3)
extract_eq(model6_6, wrap = TRUE, use_coefs = TRUE)
\[ \begin{aligned} \operatorname{\widehat{log(EXPSERVICES)}} &= 8.32 + 0.01(\operatorname{T}) \end{aligned} \]
EXAMPLE 6.5
model6_7 <- lm(FOODEXP ~ log(TOTALEXP), data = Table2_8)
extract_eq(model6_7, wrap = TRUE, use_coefs = TRUE)
\[ \begin{aligned} \operatorname{\widehat{FOODEXP}} &= -1283.91 + 257.27(\operatorname{\log(TOTALEXP)}) \end{aligned} \]
EXAMPLE 6.6
Table6_4 <- load_table(Table6_4)
model6_8 <- lm(CM ~ I(1/PGNP), data = Table6_4)
extract_eq(model6_8, wrap = TRUE, use_coefs = TRUE)
\[ \begin{aligned} \operatorname{\widehat{CM}} &= 81.79 + 27273.17(\operatorname{1/PGNP}) \end{aligned} \]
EXAMPLE 6.7
Table6_5 <- load_table(Table6_5)
# creando el cambio en la tasa de inflación
Table6_5$dINFLRATE <- with(Table6_5, INFLRATE - dplyr::lag(INFLRATE))
linear_model <- lm(dINFLRATE ~ UNRATE, data = Table6_5)
reciprocal_model <- lm(dINFLRATE ~ I(1/UNRATE), data = Table6_5)
stargazer::stargazer(linear_model, reciprocal_model, title = "Example 6.7", align = TRUE, type="html")
Dependent variable: | ||
dINFLRATE | ||
(1) | (2) | |
UNRATE | -0.638*** | |
(0.149) | ||
I(1/UNRATE) | 17.208*** | |
(5.232) | ||
Constant | 3.784*** | -3.068*** |
(0.903) | (0.970) | |
Observations | 46 | 46 |
R2 | 0.294 | 0.197 |
Adjusted R2 | 0.277 | 0.179 |
Residual Std. Error (df = 44) | 1.445 | 1.540 |
F Statistic (df = 1; 44) | 18.280*** | 10.815*** |
Note: | p<0.1; p<0.05; p<0.01 |
Chapter 7: Multiple Regression Analysis: The Problem of Estimation
EXAMPLE 7.1
model7_1 <- lm(CM ~ PGNP + FLR, data = Table6_4)
stargazer::stargazer(model7_1, type="html", title = "Example 7.1")
Dependent variable: | |
CM | |
PGNP | -0.006*** |
(0.002) | |
FLR | -2.232*** |
(0.210) | |
Constant | 263.642*** |
(11.593) | |
Observations | 64 |
R2 | 0.708 |
Adjusted R2 | 0.698 |
Residual Std. Error | 41.748 (df = 61) |
F Statistic | 73.833*** (df = 2; 61) |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 7.3
Table7_3 <- load_table(Table7_3)
colnames(Table7_3)[-1] <- c("Y", "X1", "X2")
cobb_douglas <- lm(Y ~ X1 + X2, data=Table7_3)
stargazer::stargazer(cobb_douglas, type="html", title = "Example 7.3")
Dependent variable: | |
Y | |
X1 | 47.987*** |
(7.058) | |
X2 | 9.952*** |
(0.978) | |
Constant | 233,621.600 |
(1,250,364.000) | |
Observations | 51 |
R2 | 0.981 |
Adjusted R2 | 0.980 |
Residual Std. Error | 6,300,694.000 (df = 48) |
F Statistic | 1,243.514*** (df = 2; 48) |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 7.4
Table7_4 <- load_table(Table7_4)
total_cost <- lm(Y ~ X + I(X^2) + I(X^3), data = Table7_4)
extract_eq(total_cost, wrap = TRUE, use_coefs = TRUE)
\[ \begin{aligned} \operatorname{\widehat{Y}} &= 141.77 + 63.48(\operatorname{X}) - 12.96(\operatorname{X\texttt{^}2}) + 0.94(\operatorname{X\texttt{^}3}) \end{aligned} \]
plot(Table7_4$X, Table7_4$Y,
las = 1,
main = "FIGURE 7.2 The total cost curve.",
xlab = "Output",
ylab = "Total cost of production")
Chapter 8: Multiple Regression Analysis: The Problem of Inference
CM1 <- lm(CM ~ PGNP, data = Table6_4) # Eq (8.4.14)
anova(CM1) # resultados de Table 8.5: ANOVA Table for Regression Equation (8.4.14)
EXAMPLE 8.4
Para hacer test de hipótesis a partir del “General F Testing” se puede proceder con cualquiera de las dos formas siguientes para reproducir el ejemplo 8.4
#install.packages("car")
library(car)
Table7_9 <- load_table(Table7_9)
# forma 1: estimar el modelo y usar el paquete 'car'
model1 <- lm(Y ~ X2 + X3 + X4 + X5, data = log(Table7_9))
linearHypothesis(model1, c("X4=0", "X5=0"), test = "F")
# forma 2: estimar el modelo restringido y obtener la anova de ambos modelos
model2 <- lm(Y ~ X2 + X3, data = log(Table7_9))
anova(model2, model1)
Note que ambos procedimientos dan el mismo resultado. Particularmente, lo que nos interesa es el estadístico F y el p-valor que coinciden con los valores reportados en el libro.
EXAMPLE 8.5
library(lmtest)
Table7_6 <- load_table(Table7_6)
roses_lin <- lm(Y ~ X2 + X3, data = Table7_6)
roses_log <- lm(Y ~ X2 + X3, data = log(Table7_6))
petest(roses_lin, roses_log)
Note el p-valor de 0.1225 que es el mismo del libro.
Chapter 9: Dummy Variable Regression Models
EXAMPLE 9.1
Table9_1 <- load_table(Table9_1)
lm(Salary ~ D2 + D3, data=Table9_1)
##
## Call:
## lm(formula = Salary ~ D2 + D3, data = Table9_1)
##
## Coefficients:
## (Intercept) D2 D3
## 48015 1524 -1721
EXAMPLE 9.3
lm(Salary ~ D2 + D3 + Spending, data=Table9_1)
##
## Call:
## lm(formula = Salary ~ D2 + D3 + Spending, data = Table9_1)
##
## Coefficients:
## (Intercept) D2 D3 Spending
## 28694.92 -2954.13 -3112.19 2.34
EXAMPLE 9.4
Table9_2 <- load_table(Table9_2)
eq1 <- lm(SAVINGS ~ DUM + INCOME + DUM*INCOME, data = Table9_2) # Eq (9.5.4)
eq2 <- lm(SAVINGS ~ INCOME, subset = DUM==0, data = Table9_2) # Eq (9.5.5)
eq3 <- lm(SAVINGS ~ INCOME, subset = DUM==1, data = Table9_2) # Eq (9.5.6)
stargazer::stargazer(eq1, eq2, eq3, type="html", title = "Example 9.4", align = TRUE)
Dependent variable: | |||
SAVINGS | |||
(1) | (2) | (3) | |
DUM | 152.479*** | ||
(33.082) | |||
INCOME | 0.080*** | 0.080*** | 0.015 |
(0.014) | (0.008) | (0.008) | |
DUM:INCOME | -0.065*** | ||
(0.016) | |||
Constant | 1.016 | 1.016 | 153.495*** |
(20.165) | (11.638) | (32.712) | |
Observations | 26 | 12 | 14 |
R2 | 0.882 | 0.902 | 0.207 |
Adjusted R2 | 0.866 | 0.892 | 0.141 |
Residual Std. Error | 23.150 (df = 22) | 13.361 (df = 10) | 28.875 (df = 12) |
F Statistic | 54.784*** (df = 3; 22) | 92.190*** (df = 1; 10) | 3.136 (df = 1; 12) |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 9.6
Table9_4 <- load_table(Table9_4)
# crear una dummy para el primer trimestre
Table9_4$D1 <- with(Table9_4, D2==0 & D3==0 & D4==0)*1
# estimar la regresión sin intercepto
four_dummies <- lm(FRIG ~ -1 + D1 + D2 + D3 + D4, data = Table9_4) # Eq (9.7.2)
# estimar regresión con 3 dummies y con intercepto
three_dummies <- lm(FRIG ~ D2 + D3 + D4, data = Table9_4) # Eq (9.7.3)
stargazer::stargazer(four_dummies, three_dummies, type="html", title = "Example 9.6", align = TRUE)
Dependent variable: | ||
FRIG | ||
(1) | (2) | |
D1 | 1,222.125*** | |
(59.990) | ||
D2 | 1,467.500*** | 245.375*** |
(59.990) | (84.839) | |
D3 | 1,569.750*** | 347.625*** |
(59.990) | (84.839) | |
D4 | 1,160.000*** | -62.125 |
(59.990) | (84.839) | |
Constant | 1,222.125*** | |
(59.990) | ||
Observations | 32 | 32 |
R2 | 0.987 | 0.532 |
Adjusted R2 | 0.985 | 0.482 |
Residual Std. Error (df = 28) | 169.679 | 169.679 |
F Statistic | 518.003*** (df = 4; 28) | 10.601*** (df = 3; 28) |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 9.7
Table9_6 <- load_table(Table9_6)
colnames(Table9_6) <- c("TotalCost", "Output")
# creando la variable (X-X*), luego una dummy para (X-X*)>0, finalmente, el producto de ambas
Table9_6$Output2 <- (Table9_6$Output - 5500)
Table9_6$D <- (Table9_6$Output2 > 0)*1
Table9_6$Output2_D <- with(Table9_6, Output2 * D)
lm(TotalCost ~ Output + Output2_D, data=Table9_6 )
##
## Call:
## lm(formula = TotalCost ~ Output + Output2_D, data = Table9_6)
##
## Coefficients:
## (Intercept) Output Output2_D
## -145.7167 0.2791 0.0945
Indian Wage Earners, 1990. Página 300
Para este ejemplo se mostrará cómo se resolvería en R, sin embargo, no los resultados no coinciden con los mostrados en el libro, ya que la Table9_7 contiene 114 observaciones, las mismas que se muestran en la Tabla 9.7 de la página 301 del libro, mientras que en el output de Eviews mostrado en el libro se registra un total de 261 observaciones utilizadas.
Table9_7 <- load_table(Table9_7)
wage1 <- lm(log(WI) ~ ., data=Table9_7)
wage2 <- lm(log(WI) ~ AGE + DSEX + DSEX*DE2 + DSEX*DE3 + DSEX*DE4 + DPT, data=Table9_7)
wage3 <- lm(log(WI) ~ AGE + DSEX + DSEX:DE2 + DSEX:DE3 + DSEX:DE4 + DPT, data=Table9_7)
stargazer::stargazer(wage1, wage2, wage3, type="html", title="Modelling the wage equation of workers in a town in southern India", align = TRUE)
Dependent variable: | |||
log(WI) | |||
(1) | (2) | (3) | |
AGE | 0.029*** | 0.030*** | 0.029*** |
(0.005) | (0.005) | (0.005) | |
DE2 | 0.157 | 0.064 | |
(0.165) | (0.177) | ||
DE3 | 0.505*** | 0.433** | |
(0.165) | (0.178) | ||
DE4 | 0.623** | 0.450 | |
(0.267) | (0.365) | ||
DPT | 0.319** | 0.333** | 0.369*** |
(0.126) | (0.128) | (0.129) | |
DSEX:DE2 | 0.656 | 0.734 | |
(0.490) | (0.465) | ||
DSEX:DE3 | 0.463 | 0.893* | |
(0.486) | (0.462) | ||
DSEX:DE4 | 0.400 | 0.830** | |
(0.526) | (0.392) | ||
DSEX | -0.666*** | -0.804*** | -0.908*** |
(0.144) | (0.167) | (0.162) | |
Constant | 3.622*** | 3.642*** | 3.740*** |
(0.170) | (0.171) | (0.162) | |
Observations | 114 | 114 | 114 |
R2 | 0.499 | 0.512 | 0.479 |
Adjusted R2 | 0.471 | 0.470 | 0.450 |
Residual Std. Error | 0.607 (df = 107) | 0.608 (df = 104) | 0.619 (df = 107) |
F Statistic | 17.769*** (df = 6; 107) | 12.123*** (df = 9; 104) | 16.412*** (df = 6; 107) |
Note: | p<0.1; p<0.05; p<0.01 |
Chapter 11: Heteroscedasticity: What Happens If the Error Variance Is Nonconstant?
EXAMPLE 11.1
data11_1 <- read.table("http://www.econometrics.com/manuals/gujarati/data_11.1.shd")
colnames(data11_1) <- c("Y", "X")
# regresión de la Eq (11.5.3)
y_hat <- lm(Y ~ X, data = data11_1)
# obteniendo los residuos y elevándolos al cuadrado
data11_1$u <- residuals(y_hat)
# regresión de la Eq (11.5.4)
u2_hat <- lm(log(I(u^2)) ~ log(X), data = data11_1)
summary(u2_hat)
##
## Call:
## lm(formula = log(I(u^2)) ~ log(X), data = data11_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.18904 -0.43633 -0.10916 0.08593 3.10162
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 35.827 38.323 0.935 0.381
## log(X) -2.802 4.196 -0.668 0.526
##
## Residual standard error: 1.467 on 7 degrees of freedom
## Multiple R-squared: 0.05989, Adjusted R-squared: -0.07442
## F-statistic: 0.4459 on 1 and 7 DF, p-value: 0.5257
EXAMPLE 11.2
summary(lm(abs(u) ~ X, data=data11_1 ))
##
## Call:
## lm(formula = abs(u) ~ X, data = data11_1)
##
## Residuals:
## Min 1Q Median 3Q Max
## -161.27 -79.65 -55.17 -37.46 558.67
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 407.47601 633.18944 0.644 0.540
## X -0.02035 0.06750 -0.301 0.772
##
## Residual standard error: 228 on 7 degrees of freedom
## Multiple R-squared: 0.01282, Adjusted R-squared: -0.1282
## F-statistic: 0.09088 on 1 and 7 DF, p-value: 0.7718
EXAMPLE 11.4
Table11_3 <- load_table(Table11_3)
library(lmtest)
gqtest(Y ~ X, order.by = ~ X, fraction = 4/30, data=Table11_3[-c(14:17)])
##
## Goldfeld-Quandt test
##
## data: Y ~ X
## GQ = 4.0746, df1 = 11, df2 = 11, p-value = 0.01409
## alternative hypothesis: variance increases from segment 1 to 2
EXAMPLE 11.5
bptest(Y ~ X, studentize = FALSE, data=Table11_3)
##
## Breusch-Pagan test
##
## data: Y ~ X
## BP = 5.214, df = 1, p-value = 0.02241
EXAMPLE 11.7
data_example_11_7 <- read.table("http://www.econometrics.com/manuals/gujarati/data_11.7.shd")
colnames(data_example_11_7) <- c("Compensation", "Employment_size", "Sigma")
WLS <- lm(Compensation ~ Employment_size, weights = 1/Sigma^2, data = data_example_11_7)
OLS <- lm(Compensation ~ Employment_size, data = data_example_11_7)
stargazer::stargazer(WLS, OLS, column.labels = c("WLS", "OLS"), type="html", title = "Example 11.7: WSL vs OLS", align = TRUE)
Dependent variable: | ||
Compensation | ||
WLS | OLS | |
(1) | (2) | |
Employment_size | 154.241*** | 148.800*** |
(16.946) | (14.406) | |
Constant | 3,406.216*** | 3,417.778*** |
(80.926) | (81.070) | |
Observations | 9 | 9 |
R2 | 0.922 | 0.938 |
Adjusted R2 | 0.911 | 0.930 |
Residual Std. Error (df = 7) | 0.135 | 111.592 |
F Statistic (df = 1; 7) | 82.849*** | 106.682*** |
Note: | p<0.1; p<0.05; p<0.01 |
EXAMPLE 11.11
library(sandwich)
Table11_11 <- read.table("http://www.econometrics.com/manuals/gujarati/data_11.11.shd")
colnames(Table11_11) <- c("Salary", "Famincome", "Propvalue")
OLS <- lm(Salary ~ ., data = log(Table11_11))
Robust <- coeftest(OLS, vcov = vcovHC(OLS, type = "HC1"))
stargazer::stargazer(OLS, Robust, column.labels = c("OLS se", "Robust se"), type="html", align = TRUE,
title = "Example 11.11: OLS estimations vs robust standard errors estimations.")
Dependent variable: | ||
Salary | ||
OLS | coefficient | |
test | ||
OLS se | Robust se | |
(1) | (2) | |
Famincome | 0.258*** | 0.258** |
(0.080) | (0.101) | |
Propvalue | 0.070*** | 0.070 |
(0.021) | (0.046) | |
Constant | 7.020*** | 7.020*** |
(0.805) | (0.772) | |
Observations | 94 | |
R2 | 0.220 | |
Adjusted R2 | 0.203 | |
Residual Std. Error | 0.093 (df = 91) | |
F Statistic | 12.824*** (df = 2; 91) | |
Note: | p<0.1; p<0.05; p<0.01 |
Chapter 13: Econometric Modeling: Model Specification and Diagnostic Testing
EXAMPLE 13.4
# Davidson–MacKinnon J Test, página 491-492
library(lmtest)
Table13_3 <- load_table(Table13_3)
example_13.4 <- ts(Table13_3[,-1], frequency = 1, start = 1970)
example_13.4 <- na.contiguous(cbind(example_13.4, lag(example_13.4, k = -1)))
colnames(example_13.4) <- c("PPCE", "PDPI", "lag_PPCE", "lag_PDPI")
model1 <- lm(PPCE ~ PDPI + lag_PDPI, data = example_13.4)
model2 <- lm(PPCE ~ PDPI + lag_PPCE, data = example_13.4)
jtest(model1, model2)
Chapter 14: Nonlinear Regression Models
EXAMPLE 14.1
Table14_1 <- load_table(Table14_1)
summary(nls(Y ~ a*exp(b*X), start=list(a=0.3, b=0), data=Table14_1))
##
## Formula: Y ~ a * exp(b * X)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## a 0.5089023 0.0074592 68.22 1.12e-14 ***
## b -0.0059652 0.0004844 -12.31 2.29e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.01303 on 10 degrees of freedom
##
## Number of iterations to convergence: 5
## Achieved convergence tolerance: 1.444e-06
Para obtener los mismos resultados del ejemplo, la ecuación que se introdujo en la función nls
fue \(\hat{Fee}_t = \beta_1 e^{\beta_2 Asset}\) y no la ecuación (14.5.1) mostrada en el libro que es \(\hat{Fee}_t = \beta_1 Asset^{\beta_2}\). Así, la ecuación (14.5.1) debería ser \(\hat{Fee}_t = 0.5089 e^{-0.0059 Asset}\). Adicionalmente, verifíquese que esta es la ecuación planteada en (14.3.1). Debe entenderse que esto es un error de escritura en el libro.
Si la espeficiación del modelo fuese \(\hat{Fee}_t = \beta_1 Asset^{\beta_2}\), entonces los resultados cambiarían y serían los siguientes:
summary(nls(Y ~ a*(X^b), start=list(a=0.3, b=0), data=Table14_1))
##
## Formula: Y ~ a * (X^b)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## a 0.52640 0.01694 31.067 2.80e-11 ***
## b -0.06947 0.01067 -6.509 6.82e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.02388 on 10 degrees of freedom
##
## Number of iterations to convergence: 6
## Achieved convergence tolerance: 5.919e-07
Como nota importante del error de este ejemplo es que se debe ser cuidadoso con la especificación del modelo teórico y la estimación del modelo empírico, ambas deben coincidir.
EXAMPLE 14.2
Table14_3 <- load_table(Table14_3)
summary(nls(GDP ~ a*(Labor^b)*(Capital^c), start = list(a=.5, b=.2, c=.9), data=Table14_3))
##
## Formula: GDP ~ a * (Labor^b) * (Capital^c)
##
## Parameters:
## Estimate Std. Error t value Pr(>|t|)
## a 0.52923 0.27124 1.951 0.0677 .
## b 0.18106 0.14130 1.281 0.2173
## c 0.88277 0.07081 12.466 5.61e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6643 on 17 degrees of freedom
##
## Number of iterations to convergence: 4
## Achieved convergence tolerance: 1.487e-06
EXAMPLE 14.3
Table14_2 <- load_table(Table14_2)
summary(lm(log(POPULATION) ~ YEAR, data=Table14_2))
##
## Call:
## lm(formula = log(POPULATION) ~ YEAR, data = Table14_2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.010838 -0.002177 0.001099 0.003441 0.011455
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.710e+00 1.477e-01 -58.96 <2e-16 ***
## YEAR 1.063e-02 7.429e-05 143.06 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.005022 on 36 degrees of freedom
## Multiple R-squared: 0.9982, Adjusted R-squared: 0.9982
## F-statistic: 2.047e+04 on 1 and 36 DF, p-value: < 2.2e-16
Chapter 15: Qualitative Response Regression Models
EXAMPLE 15.1
Table15_1 <- load_table(Table15_1)
lpm <- lm(Y ~ X, data=Table15_1)
predict(lpm, newdata = data.frame(X=12)) # predicción del modelo con X=12
## 1
## 0.2798857
Table 15.8, Table 15.13 y Table 15.14. Ver este enlace para más detalle sobre estimación y predicción de con estos modelos
Table15_7 <- load_table(Table15_7)
lpm <- lm(GRADE ~GPA + TUCE + PSI, data = Table15_7)
logit <- glm(GRADE ~GPA + TUCE + PSI, family = "binomial", data = Table15_7)
probit <- glm(GRADE ~ GPA + TUCE + PSI, family = binomial(link = "probit"), data = Table15_7)
stargazer::stargazer(lpm, logit, probit, title = "Modelos de respuesta cualitativa", type="html", align = TRUE)
Dependent variable: | |||
GRADE | |||
OLS | logistic | probit | |
(1) | (2) | (3) | |
GPA | 0.464*** | 2.826** | 1.626** |
(0.162) | (1.263) | (0.690) | |
TUCE | 0.010 | 0.095 | 0.052 |
(0.019) | (0.142) | (0.081) | |
PSI | 0.379** | 2.379** | 1.426** |
(0.139) | (1.065) | (0.587) | |
Constant | -1.498*** | -13.021*** | -7.452*** |
(0.524) | (4.931) | (2.572) | |
Observations | 32 | 32 | 32 |
R2 | 0.416 | ||
Adjusted R2 | 0.353 | ||
Log Likelihood | -12.890 | -12.819 | |
Akaike Inf. Crit. | 33.779 | 33.638 | |
Residual Std. Error | 0.388 (df = 28) | ||
F Statistic | 6.646*** (df = 3; 28) | ||
Note: | p<0.1; p<0.05; p<0.01 |
Chapter 16: Panel Data Regression Models
Sin datos para reproducir los ejemplos de estimaciones.
Chapter 17: Dynamic Econometric Models: Autoregressive and Distributed-Lag Models
EXAMPLE 17.7
Table17_2 <- load_table(Table17_2)
example_17.7 <- ts(Table17_2[,-1], frequency = 1, start = 1959)
example_17.7 <- na.contiguous(cbind(example_17.7, lag(example_17.7, k = -1)))
colnames(example_17.7) <- c("PPCE", "PDPI", "lag_PPCE", "lag_PDPI")
summary(lm(PPCE ~ PDPI + lag_PPCE, data = example_17.7))
##
## Call:
## lm(formula = PPCE ~ PDPI + lag_PPCE, data = example_17.7)
##
## Residuals:
## Min 1Q Median 3Q Max
## -613.26 -87.23 27.00 164.31 365.84
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -252.91895 157.35174 -1.607 0.1151
## PDPI 0.21389 0.07062 3.029 0.0041 **
## lag_PPCE 0.79715 0.07331 10.874 4.74e-14 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 224.9 on 44 degrees of freedom
## Multiple R-squared: 0.9982, Adjusted R-squared: 0.9981
## F-statistic: 1.231e+04 on 2 and 44 DF, p-value: < 2.2e-16
EXAMPLE 17.11
# install.packages("dLagM")
library(dLagM)
Table17_8 <- load_table(Table17_8)
almon <- polyDlm(y=Table17_8$INVETORY, x=Table17_8$SALES, q=3 , k=2, show.beta = FALSE)
summary(almon$model)
##
## Call:
## "Y ~ (Intercept) + X.t"
##
## Residuals:
## Min 1Q Median 3Q Max
## -58320 -15092 -3625 13570 52228
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.585e+04 6.597e+03 3.918 0.00035 ***
## z.t0 1.115e+00 5.382e-01 2.072 0.04494 *
## z.t1 -3.714e-01 1.374e+00 -0.270 0.78842
## z.t2 -6.005e-02 4.550e-01 -0.132 0.89568
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 23950 on 39 degrees of freedom
## Multiple R-squared: 0.9755, Adjusted R-squared: 0.9736
## F-statistic: 517.8 on 3 and 39 DF, p-value: < 2.2e-16
Chapter 22: Time Series Econometrics: Forecasting
EXAMPLE 22.4
#Table22_5
#Table22_7
Table22_6 <- load_table(Table22_6)
yen <- ts(Table22_6$Yen.exchange, start=c(1971,1), frequency = 12)
# usando función Arima del paquete forecast
library(forecast)
Arima(log(yen), order=c(0,1,1), include.constant = TRUE)
## Series: log(yen)
## ARIMA(0,1,1) with drift
##
## Coefficients:
## ma1 drift
## 0.3293 -0.0028
## s.e. 0.0443 0.0016
##
## sigma^2 estimated as 0.0006623: log likelihood=1002.67
## AIC=-1999.34 AICc=-1999.29 BIC=-1987.03
# o directamente con R base
arima(diff(log(yen)), order=c(0,0,1))
##
## Call:
## arima(x = diff(log(yen)), order = c(0, 0, 1))
##
## Coefficients:
## ma1 intercept
## 0.3293 -0.0028
## s.e. 0.0443 0.0016
##
## sigma^2 estimated as 0.0006593: log likelihood = 1002.67, aic = -1999.34
#FIN.
No hay comentarios:
Publicar un comentario