Code
library('knitr')
library('xtable')
library('stargazer')
library('ggplot2')
Variable Indicadora
Un economista de bienes raíces recopila información sobre 1000 precios de venta de casas de dos vecindarios similares, uno llamado “Pueblo Universitario” que bordea una gran universidad estatal y otro vecindario a unas tres millas de la universidad. Algunas de las observaciones se muestran en la siguiente salida. El archivo de datos completo está en utown
.
library('knitr')
library('xtable')
library('stargazer')
library('ggplot2')
Los precios de las casas están dados en $1000; El tamaño (sqft
) es el número de cientos de pies cuadrados de área habitable. Por ejemplo, la primera casa se vendió por $205,452 y tiene 2346 pies cuadrados de área habitable. También se registra la edad (age
) de la casa (en años), la ubicación (utown
= 1 para casas cerca de la universidad, 0 en caso contrario), si la casa tiene piscina (pool
= 1 si hay piscina, 0 en caso contrario) y si la casa tiene piscina. una chimenea (fplace
= 1 si hay una chimenea, 0 en caso contrario).
<- read.csv('Datos/utown.csv')
utown head(utown)
price sqft age utown pool fplace
1 205.452 23.46 6 0 0 1
2 185.328 20.03 5 0 0 1
3 248.422 27.77 6 0 0 0
4 154.690 20.17 1 0 0 0
5 221.801 26.45 0 0 0 1
6 199.119 21.56 6 0 0 1
Se utilizan para dar cuenta de factores cualitativos en los modelos econométricos.
A menudo se denominan variables ficticias, binarias o dicotómicas porque sólo toman dos valores, normalmente uno o cero, para indicar la presencia o ausencia de una característica o para indicar si una condición es verdadera o falsa.
El uso de cero y uno para los valores de estas variables es arbitrario, pero muy conveniente.
\[D = \begin{cases} 1, & Característica \space Presente \\ 0, &Característica \space No \space Presente \end{cases}\]
Por el momento, supongamos que el tamaño de la casa, medido en pies cuadrados, sqft
, es la única variable relevante para determinar el precio de la vivienda, price
. Especifiquemos el modelo de regresión como
\[price = \beta_0 + \beta_1sqft + e\]
El uso más común de las variables indicadoras es modificar el parámetro de intercepción del modelo de regresión. Añadiendo la variable indicadora D
al modelo de regresión, junto con un nuevo parámetro \(\delta\), obtenemos:
\[price = \beta_0 +\delta D + \beta_1sqft + e\]
El efecto de la inclusión de una variable indicadora D
en el modelo de regresión se aprecia mejor examinando la función de regresión, \(E(price|sqft)\), en los dos lugares. Si el modelo está correctamente especificado, entonces \(E(e|sqft,D) = 0\) y
\[E(price|sqft) = \begin{cases} (\beta_0+\delta)+\beta_1sqft & cuando \space D=1 \\ \beta_0+\beta_1sqft & cuando \space D=0 \end{cases}\]
El cambio se produce en la pendiente de la relación.
Podemos permitir un cambio en la pendiente incluyendo en el modelo una variable explicativa adicional que es igual al producto de una variable indicadora y una variable continua.
En nuestro modelo, la pendiente de la relación es el valor de un pie cuadrado adicional de superficie habitable. Si suponemos que éste es un valor para las viviendas de la zona deseable y otro valor para las viviendas de otras zonas, podemos especificar
\[price = \beta_0 + \beta_1 sqft + \gamma (sqft \times D) + e\]
\[E(price|sqft,D) = \begin{cases} \beta_0+(\beta_1+\gamma)sqft & cuando \space D=1 \\ \beta_0+\beta_1sqft & cuando \space D=0 \end{cases}\] La derivada parcial del precio esperado de la vivienda con respecto al tamaño (medido en pies cuadrados), que da la pendiente de la relación, es
\[\frac{\partial E(price|sqft,D)}{\partial sqft} = \begin{cases} \beta_1+\gamma & cuando \space D=1 \\ \beta_1 & cuando \space D=0 \end{cases}\]
Si suponemos que la ubicación de la vivienda afecta tanto al intercepto como a la pendiente, ambos efectos pueden incorporarse a un único modelo. El modelo de regresión resultante es
\[price = \beta_0 + \delta D + \beta_1 sqft + \gamma (sqft \times D) + e\] En este caso, las funciones de regresión para los precios de la vivienda en las dos localidades son
\[E(price|sqft,D) = \begin{cases} (\beta_0 + \delta) +(\beta_1+\gamma)sqft & cuando \space D=1 \\ \beta_0+\beta_1sqft & cuando \space D=0 \end{cases}\]
Los precios de las casas están dados en $1000; El tamaño (sqft
) es el número de cientos de metros cuadrados de área habitable. Por ejemplo, la primera casa se vendió por $205,452 y tiene 2,346 metros cuadrados de área habitable. También se registra la edad (age
) de la casa (en años), la ubicación (utown
= 1 para casas cerca de la universidad, 0 en caso contrario), si la casa tiene piscina (pool
= 1 si hay piscina, 0 en caso contrario) y si la casa tiene piscina. una chimenea (fplace
= 1 si hay una chimenea, 0 en caso contrario).
head(utown)
price sqft age utown pool fplace
1 205.452 23.46 6 0 0 1
2 185.328 20.03 5 0 0 1
3 248.422 27.77 6 0 0 0
4 154.690 20.17 1 0 0 0
5 221.801 26.45 0 0 0 1
6 199.119 21.56 6 0 0 1
El economista especifica la ecuación de regresión como
\[price = \beta_0 +\beta_1 utown + \beta_2 sqft + \beta_3 (sqft \times utown) + \beta_4 age+ \\ \beta_5 pool+\beta_6 fplace+ e\]
$utown <- as.factor(utown$utown)
utown$pool <- as.factor(utown$pool)
utown$fplace <- as.factor(utown$fplace) utown
kable(summary.data.frame(utown),
caption="Tabla 1: Resumen de datos para utown")
price | sqft | age | utown | pool | fplace | |
---|---|---|---|---|---|---|
Min. :134.3 | Min. :20.03 | Min. : 0.000 | 0:481 | 0:796 | 0:482 | |
1st Qu.:215.6 | 1st Qu.:22.83 | 1st Qu.: 3.000 | 1:519 | 1:204 | 1:518 | |
Median :245.8 | Median :25.36 | Median : 6.000 | NA | NA | NA | |
Mean :247.7 | Mean :25.21 | Mean : 9.392 | NA | NA | NA | |
3rd Qu.:278.3 | 3rd Qu.:27.75 | 3rd Qu.:13.000 | NA | NA | NA | |
Max. :345.2 | Max. :30.00 | Max. :60.000 | NA | NA | NA |
library('broom') # para salida tidy lm y función glance()
<- lm(price~utown*sqft+age+pool+fplace, data=utown)
modelo kable(tidy(modelo), caption="Tabla 2: Modelo Precio de Casas")
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 24.4999849 | 6.1917214 | 3.956894 | 0.0000813 |
utown1 | 27.4529522 | 8.4225824 | 3.259446 | 0.0011542 |
sqft | 7.6121766 | 0.2451765 | 31.047746 | 0.0000000 |
age | -0.1900864 | 0.0512046 | -3.712291 | 0.0002168 |
pool1 | 4.3771633 | 1.1966916 | 3.657720 | 0.0002678 |
fplace1 | 1.6491756 | 0.9719568 | 1.696758 | 0.0900558 |
utown1:sqft | 1.2994049 | 0.3320478 | 3.913307 | 0.0000972 |
\[\begin{multline} price = 24.5 +27.453*utown + 7.612*sqft + 1.299*(sqft \times utown) \\ - 0.19*age+ 4.377*pool+1.649*fplace \end{multline}\]
\[\begin{multline} price = (24.5 + 27.453) + (7.612+1.299)*sqft - 0.19*age + \\ 4.377*pool + 1.649*fplace \end{multline}\]
\[\begin{multline} price = 51.953 + 8.911 sqft - 0.19 age + 4.377 pool+1.649 fplace \end{multline}\]
\[\begin{multline} price = 24.5 + 7.612 sqft - 0.19 age + 4.377 pool+1.649 fplace \end{multline}\]
Basándonos en los resultados de la regresión estimamos que:
En este ejercicio, examinamos las horas de trabajo en el mercado de las mujeres casadas en función de su educación y del número de hijos. Utilice el archivo de datos cps5mw_small
para este ejercicio.
<- read.csv('Datos/cps_horas.csv')
cps head(cps)
educ hrswork nchild wage
1 0 52 0 13.45
2 12 40 2 14.55
3 16 40 2 20.17
4 14 52 2 19.23
5 21 50 1 45.00
6 16 36 1 62.00
\[ HRSWORK = \beta_0 + \beta_1WAGE + \beta_2EDUC + \beta_3NCHILD + e \]
library('broom') # para salida tidy lm y función glance()
<- lm(hrswork ~ wage + educ + nchild, data = cps)
modelo_HRS kable(tidy(modelo_HRS), caption="Tabla 3: Modelo Horas de Trabajo")
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 33.0265462 | 1.2162297 | 27.154860 | 0.0000000 |
wage | -0.0357183 | 0.0175939 | -2.030159 | 0.0425614 |
educ | 0.6151225 | 0.0894927 | 6.873436 | 0.0000000 |
nchild | -0.4501219 | 0.1950974 | -2.307165 | 0.0212157 |
\[ HRSWORK = 33.0266 -0.0357*WAGE + 0.6151*EDUC -0.4501*NCHILD \]
Interprete el coeficiente de \(NCHILD\). Estime las horas esperadas de trabajo de una mujer casada cuyo salario es de 20 dólares por hora, que tiene 16 años de educación y que no tiene hijos. Haga el mismo cálculo para una mujer con un hijo, dos hijos y tres hijos. ¿Cuánto cambia el número de horas esperado con cada hijo adicional?
#definimos nuevas observaciones
<- data.frame(wage=c(20,20,20,20), educ=c(16,16,16,16), nchild=c(0,1,2,3))
nuevos
# Usamos el modelo ajustado para prediccir HRSWORK para los nuevos datos
predict(modelo_HRS,nuevos)
1 2 3 4
42.15414 41.70402 41.25390 40.80377
$postgrado <- ifelse(cps$educ > 16,1,0)
cps$colegio <- ifelse(cps$educ==16,1,0)
cps$colegio_0 <- ifelse(cps$educ < 16,ifelse(cps$educ > 12,1,0),0) cps
head(cps,20)
educ hrswork nchild wage postgrado colegio colegio_0
1 0 52 0 13.45 0 0 0
2 12 40 2 14.55 0 0 0
3 16 40 2 20.17 0 1 0
4 14 52 2 19.23 0 0 1
5 21 50 1 45.00 1 0 0
6 16 36 1 62.00 0 1 0
7 16 40 0 28.50 0 1 0
8 12 42 0 15.00 0 0 0
9 8 40 0 14.50 0 0 0
10 12 40 0 24.05 0 0 0
11 16 40 1 17.80 0 1 0
12 16 40 0 18.98 0 1 0
13 14 40 0 23.00 0 0 1
14 16 40 1 12.30 0 1 0
15 13 40 0 24.05 0 0 1
16 13 40 0 19.23 0 0 1
17 13 40 0 24.00 0 0 1
18 21 50 0 35.38 1 0 0
19 16 40 1 20.00 0 1 0
20 16 40 2 21.63 0 1 0
<- lm(hrswork ~ wage + postgrado + colegio +
modelo_HRS2 + nchild, data = cps) colegio_0
kable(tidy(modelo_HRS2), caption="Tabla 4: Modelo Horas de Trabajo - Variables Dummy")
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 40.7176491 | 0.5288993 | 76.9856360 | 0.0000000 |
wage | -0.0372971 | 0.0177205 | -2.1047387 | 0.0355226 |
postgrado | 4.0955472 | 0.6845946 | 5.9824417 | 0.0000000 |
colegio | 2.1912405 | 0.5967406 | 3.6720153 | 0.0002513 |
colegio_0 | -0.0942991 | 0.5797002 | -0.1626687 | 0.8708068 |
nchild | -0.4735237 | 0.1957458 | -2.4190751 | 0.0157087 |
\[\begin{multline} HRSWORK = 40.7176 -0.0373*WAGE + 4.0955*POSTGRADO + \\ 2.1912*COLEGIO -0.0942*COLEGIO\_0 -0.4735*NCHILD \end{multline}\]
<- data.frame(wage=c(20,20,20,20,20,20), educ=c(12,13,14,15,16,17),
nuevos2 nchild=c(0,0,0,0,0,0))
$postgrado <- ifelse(nuevos2$educ > 16,1,0)
nuevos2$colegio <- ifelse(nuevos2$educ==16,1,0)
nuevos2$colegio_0 <- ifelse(nuevos2$educ < 16,ifelse(nuevos2$educ > 12,1,0),0)
nuevos2head(nuevos2)
wage educ nchild postgrado colegio colegio_0
1 20 12 0 0 0 0
2 20 13 0 0 0 1
3 20 14 0 0 0 1
4 20 15 0 0 0 1
5 20 16 0 0 1 0
6 20 17 0 1 0 0
# Usamos el modelo ajustado para prediccir HRSWORK para los nuevos datos
$prediccion <- predict(modelo_HRS2,nuevos2)
nuevos2head(nuevos2)
wage educ nchild postgrado colegio colegio_0 prediccion
1 20 12 0 0 0 0 39.97171
2 20 13 0 0 0 1 39.87741
3 20 14 0 0 0 1 39.87741
4 20 15 0 0 0 1 39.87741
5 20 16 0 0 1 0 42.16295
6 20 17 0 1 0 0 44.06725
<- read.csv('Datos/cps_horas.csv') cps2
$unnino <- ifelse(cps2$nchild == 1,1,0)
cps2$dosninos <- ifelse(cps2$nchild== 2,1,0)
cps2$masninos <- ifelse(cps2$nchild > 2,1,0) cps2
head(cps2,30)
educ hrswork nchild wage unnino dosninos masninos
1 0 52 0 13.45 0 0 0
2 12 40 2 14.55 0 1 0
3 16 40 2 20.17 0 1 0
4 14 52 2 19.23 0 1 0
5 21 50 1 45.00 1 0 0
6 16 36 1 62.00 1 0 0
7 16 40 0 28.50 0 0 0
8 12 42 0 15.00 0 0 0
9 8 40 0 14.50 0 0 0
10 12 40 0 24.05 0 0 0
11 16 40 1 17.80 1 0 0
12 16 40 0 18.98 0 0 0
13 14 40 0 23.00 0 0 0
14 16 40 1 12.30 1 0 0
15 13 40 0 24.05 0 0 0
16 13 40 0 19.23 0 0 0
17 13 40 0 24.00 0 0 0
18 21 50 0 35.38 0 0 0
19 16 40 1 20.00 1 0 0
20 16 40 2 21.63 0 1 0
21 16 40 2 15.38 0 1 0
22 18 50 0 30.76 0 0 0
23 12 40 0 13.27 0 0 0
24 16 45 2 31.02 0 1 0
25 14 40 4 19.00 0 0 1
26 18 36 2 35.00 0 1 0
27 16 40 1 39.42 1 0 0
28 20 40 3 72.13 0 0 1
29 16 40 0 28.85 0 0 0
30 14 40 2 13.66 0 1 0
<- lm(hrswork ~ wage + educ + unnino +
modelo_HRS3 + masninos , data = cps2) dosninos
kable(tidy(modelo_HRS3), caption="Tabla 4: Modelo Horas de Trabajo - Variables Dummy 2")
term | estimate | std.error | statistic | p.value |
---|---|---|---|---|
(Intercept) | 33.3130747 | 1.2201789 | 27.3017953 | 0.0000000 |
wage | -0.0343117 | 0.0175690 | -1.9529707 | 0.0510564 |
educ | 0.6160977 | 0.0893016 | 6.8990704 | 0.0000000 |
unnino | -1.2347903 | 0.5422311 | -2.2772397 | 0.0229481 |
dosninos | -1.7956837 | 0.5343644 | -3.3604103 | 0.0008029 |
masninos | -0.6536432 | 0.7501774 | -0.8713182 | 0.3837556 |
\[\begin{multline} HRSWORK = 33.3131 - 0.0343*WAGE + 0.6161*EDUC - \\ 1.2348*UNNINO -1.7957*DOSNINOS -0.6536*MASNINOS \end{multline}\]
<- data.frame(wage=c(20,20,20,20), educ=c(16,16,16,16),
nuevos3 nchild=c(0,1,2,3))
$unnino <- ifelse(nuevos3$nchild == 1,1,0)
nuevos3$dosninos <- ifelse(nuevos3$nchild== 2,1,0)
nuevos3$masninos <- ifelse(nuevos3$nchild > 2,1,0)
nuevos3head(nuevos3)
wage educ nchild unnino dosninos masninos
1 20 16 0 0 0 0
2 20 16 1 1 0 0
3 20 16 2 0 1 0
4 20 16 3 0 0 1
# Usamos el modelo ajustado para prediccir HRSWORK para los nuevos datos
$prediccion <- predict(modelo_HRS3,nuevos3)
nuevos3head(nuevos3)
wage educ nchild unnino dosninos masninos prediccion
1 20 16 0 0 0 0 42.48440
2 20 16 1 1 0 0 41.24961
3 20 16 2 0 1 0 40.68872
4 20 16 3 0 0 1 41.83076