Forma funcional

Introducción

Utilizaremos la base de datos vote1 para reexaminar la relación existente entre los gastos de campaña y los resultados electorales. En esta ocasión, examinaremos la existencia de problemas de heteroscedasticidad así como posibles problemas de forma funcional incorrecta.

Datos

Podemos cargar los datos usando la siguiente instrucción:

vote1 <- read.csv2("http://jcpernias.com/ec1027/data/vote1.csv")

Además necesitaremos los siguientes paquetes de R:

sandwich
matrices de covarianzas robustas a heteroscedasticidad.
lmtest
contrastes de hipótesis.
library(sandwich)
library(lmtest)

Estadísticos descriptivos

summary(vote1)
    state        district          democA           voteA     
CA     : 19   Min.   : 1.000   Min.   :0.0000   Min.   :16.0  
MI     : 11   1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:36.0  
NY     : 10   Median : 6.000   Median :1.0000   Median :50.0  
IL     :  9   Mean   : 8.838   Mean   :0.5549   Mean   :50.5  
OH     :  8   3rd Qu.:11.000   3rd Qu.:1.0000   3rd Qu.:65.0  
PA     :  8   Max.   :42.000   Max.   :1.0000   Max.   :84.0  
(Other):108                                                   
   expendA           expendB           prtystrA    
Min.   :   0.30   Min.   :   0.93   Min.   :22.00  
1st Qu.:  81.63   1st Qu.:  60.05   1st Qu.:44.00  
Median : 242.78   Median : 221.53   Median :50.00  
Mean   : 310.61   Mean   : 305.09   Mean   :49.76  
3rd Qu.: 457.41   3rd Qu.: 450.72   3rd Qu.:56.00  
Max.   :1470.67   Max.   :1548.19   Max.   :71.00

Creamos nuevas variables en la base de datos:

  • diffAB: diferencia entre los gastos de campaña del candidato A y los del candidato B. $$ \mathit{diffAB}_i = expendA_i - expendB_i $$
  • shareA: el porcentaje que sobre los gastos totales de campaña representan los gastos del candidato A. $$ \mathit{shareA}_i = 100 \frac{expendA_i}{expendA_i + expendB_i} $$

Para añadir variables a una base de datos, data.frame en la terminología de R, tenemos varias opciones. Podemos utilizar expresiones com datos$var para acceder a la variable var dentro de la base de datos datos. En nuestro caso:

vote1$diffAB <- vote1$expendA - vote1$expendB
vote1$shareA <- 100 * vote1$expendA / (vote1$expendA + vote1$expendB)

El problema de esta opción es la repetición del nombre de la base de datos cada vez que utilizamos una variable.

Una alternativa que requiere escribir menos es usar la función within. La expresión

vote1 <- within(vote1, diffAB <- expendA - expendB)

crea una nueva base de datos a partir de vote1, el primer argumento de la función within, y añade la variable diffAB creada en el segundo argumento. Finalmente guardamos la base de datos creada por within en la variable vote1, efectivamente reemplazando la base de datos original.

Podemos crear más de una variable usando la siguiente notación:

vote1 <- within (vote1, {
  diffAB <- expendA - expendB
  shareA <- 100 * expendA / (expendA + expendB)
})

Escribimos cada una de las expresiones en su propia línea y las agrupamos escribiendo todas estas expressiones entre llaves, { }.

Usando cualquiera de estas opciones, el resultado es que nuestra base de datos ahora contiene dos nuevas variables diffAB y shareA.

summary(vote1)
    state        district          democA           voteA     
CA     : 19   Min.   : 1.000   Min.   :0.0000   Min.   :16.0  
MI     : 11   1st Qu.: 3.000   1st Qu.:0.0000   1st Qu.:36.0  
NY     : 10   Median : 6.000   Median :1.0000   Median :50.0  
IL     :  9   Mean   : 8.838   Mean   :0.5549   Mean   :50.5  
OH     :  8   3rd Qu.:11.000   3rd Qu.:1.0000   3rd Qu.:65.0  
PA     :  8   Max.   :42.000   Max.   :1.0000   Max.   :84.0  
(Other):108                                                   
   expendA           expendB           prtystrA    
Min.   :   0.30   Min.   :   0.93   Min.   :22.00  
1st Qu.:  81.63   1st Qu.:  60.05   1st Qu.:44.00  
Median : 242.78   Median : 221.53   Median :50.00  
Mean   : 310.61   Mean   : 305.09   Mean   :49.76  
3rd Qu.: 457.41   3rd Qu.: 450.72   3rd Qu.:56.00  
Max.   :1470.67   Max.   :1548.19   Max.   :71.00  

    diffAB              shareA        
Min.   :-1081.070   Min.   : 0.09401  
1st Qu.: -230.210   1st Qu.:18.86670  
Median :   13.170   Median :50.84964  
Mean   :    5.523   Mean   :51.07644  
3rd Qu.:  290.310   3rd Qu.:84.25577  
Max.   : 1062.380   Max.   :99.49500

Modelos de regresión

En este apartado estimaremos por mínimos cuadrados ordinarios dos modelo de regresión explicando los resultados electorales del candidato A:

$$ voteA_i = \beta_0 + \beta_1 \mathit{diffAB}_i + \beta_2 democA_i + \beta_3 prtystrA_i + u_i \tag{Mod. 1} $$

$$ voteA_i = \alpha_0 + \alpha_1 \mathit{shareA}_i + \alpha_2 democA_i + \alpha_3 prtystrA_i + v_i \tag{Mod. 2} $$

Usaremos el contraste de Breusch y Pagan para determinar la existencia de problemas de heteroscedasticidad en estos dos modelos. También evaluaremos la adecuación de la forma funcional de los dos modelos usando el contraste RESET.

Modelo 1

Estimación por MCO:

mod1 <- lm (voteA ~ diffAB + democA + prtystrA, data = vote1)
summary(mod1)
Call:
lm(formula = voteA ~ diffAB + democA + prtystrA, data = vote1)

Residuals:
    Min      1Q  Median      3Q     Max 
-27.904  -7.975   0.312   6.800  35.841 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)    
(Intercept) 17.317286   5.160931   3.355 0.000978 ***
diffAB       0.030830   0.002581  11.945  < 2e-16 ***
democA       9.287212   1.827300   5.082  9.8e-07 ***
prtystrA     0.559954   0.091483   6.121  6.3e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 10.36 on 169 degrees of freedom
Multiple R-squared:  0.6258,	Adjusted R-squared:  0.6192 
F-statistic: 94.23 on 3 and 169 DF,  p-value: < 2.2e-16

Contraste de heteroscedasticidad de Breusch-Pagan:

bptest(mod1, data=vote1)
    studentized Breusch-Pagan test

data:  mod1
BP = 5.1994, df = 3, p-value = 0.1578

Contraste RESET usando cuadrados y cubos de las predicciones:

yhat1 <- fitted(mod1)
yhat1.2 <- yhat1^2
yhat1.3 <- yhat1^3
reset.aux <- lm (voteA ~ diffAB + democA + prtystrA + yhat1.2 + yhat1.3, 
                 data = vote1)
waldtest(mod1, reset.aux)
Wald test

Model 1: voteA ~ diffAB + democA + prtystrA
Model 2: voteA ~ diffAB + democA + prtystrA + yhat1.2 + yhat1.3
  Res.Df Df      F    Pr(>F)    
1    169                        
2    167  2 23.952 7.153e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Es posible llevar a cabo un contraste RESET robusto a heteroscedasticidad:

waldtest(mod1, reset.aux, vcov=vcovHC)
Wald test

Model 1: voteA ~ diffAB + democA + prtystrA
Model 2: voteA ~ diffAB + democA + prtystrA + yhat1.2 + yhat1.3
  Res.Df Df      F    Pr(>F)    
1    169                        
2    167  2 7.9271 0.0005141 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Modelo 2

Estimación por MCO:

mod2 <- lm (voteA ~ shareA + democA + prtystrA, data = vote1)
summary(mod2)
Call:
lm(formula = voteA ~ shareA + democA + prtystrA, data = vote1)

Residuals:
     Min       1Q   Median       3Q      Max 
-16.6576  -3.8423  -0.2234   3.4657  29.6361 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 16.17946    2.98650   5.418 2.05e-07 ***
shareA       0.43589    0.01638  26.617  < 2e-16 ***
democA       2.37467    1.15602   2.054  0.04150 *  
prtystrA     0.21589    0.05786   3.731  0.00026 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6.173 on 169 degrees of freedom
Multiple R-squared:  0.8671,	Adjusted R-squared:  0.8647 
F-statistic: 367.5 on 3 and 169 DF,  p-value: < 2.2e-16

Contraste de heteroscedasticidad de Breusch-Pagan:

bptest(mod2, data=vote1)
    studentized Breusch-Pagan test

data:  mod2
BP = 1.642, df = 3, p-value = 0.6499

Contraste RESET usando cuadrados y cubos de las predicciones:

yhat2 <- fitted(mod2)
yhat2.2 <- yhat2^2
yhat2.3 <- yhat2^3
reset.aux <- lm (voteA ~ shareA + democA + prtystrA + yhat2.2 + yhat2.3, 
                 data = vote1)
waldtest(mod2, reset.aux)
waldtest(mod2, reset.aux, vcov=vcovHC)
Wald test

Model 1: voteA ~ shareA + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA + yhat2.2 + yhat2.3
  Res.Df Df      F Pr(>F)
1    169                 
2    167  2 0.9783 0.3781
Wald test

Model 1: voteA ~ shareA + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA + yhat2.2 + yhat2.3
  Res.Df Df      F Pr(>F)
1    169                 
2    167  2 0.8155 0.4442

Contraste RESET robusto a heteroscedasticidad:

waldtest(mod2, reset.aux, vcov=vcovHC)
Wald test

Model 1: voteA ~ shareA + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA + yhat2.2 + yhat2.3
  Res.Df Df      F Pr(>F)
1    169                 
2    167  2 0.8155 0.4442

Conclusiones

No existe fuerte evidencia de heteroscedasticidad en ninguno de las dos regresiones. Los resultados del contraste RESET indican problemas de especificación de la forma funcional en el Modelo 1. No hay evidencia de forma funcional incorrecta en el Modelo 2.

Comparación de modelos no anidados

En esta sección usaremos contrastes de modelos no anidados para comparar las dos especificaciónes.

Contrastes de abarcamiento

Consisten en construir un modelo que abarque a los dos que queremos comparar, incluyendo en un mismo modelo todas las variables explicativas. El contraste consiste en comparar el modelo artificial que hemos construido con cada uno de los modelos rivales usando contrastes \(F\).

encomptest(mod1, mod2)
Encompassing test

Model 1: voteA ~ diffAB + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA
Model E: voteA ~ diffAB + democA + prtystrA + shareA
          Res.Df Df        F  Pr(>F)    
M1 vs. ME    168 -1 314.4601 < 2e-16 ***
M2 vs. ME    168 -1   3.3714 0.06811 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Contrastes robustos a heteroscedasticidad:

encomptest(mod1, mod2, vcov.=vcovHC)
Encompassing test

Model 1: voteA ~ diffAB + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA
Model E: voteA ~ diffAB + democA + prtystrA + shareA
          Res.Df Df        F  Pr(>F)    
M1 vs. ME    168 -1 215.9977 < 2e-16 ***
M2 vs. ME    168 -1   2.7823 0.09718 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Contrastes \(J\) de Davidson y MacKinnon

Ampliamos cada modelo añadiendo como variable explicativa las predicciones del modelo rival. Posteriormente contrastamos la significación de las variables que hemos añadido en cada modelo:

jtest(mod1, mod2)
J test

Model 1: voteA ~ diffAB + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA
                Estimate Std. Error t value Pr(>|t|)    
M1 + fitted(M2)  1.08965   0.061447 17.7330  < 2e-16 ***
M2 + fitted(M1) -0.14984   0.081605 -1.8361  0.06811 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Contrastes robustos a heteroscedasticidad:

jtest(mod1, mod2, vcov.=vcovHC)
J test

Model 1: voteA ~ diffAB + democA + prtystrA
Model 2: voteA ~ shareA + democA + prtystrA
                Estimate Std. Error t value Pr(>|t|)    
M1 + fitted(M2)  1.08965   0.074142  14.697  < 2e-16 ***
M2 + fitted(M1) -0.14984   0.089830  -1.668  0.09718 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1