Para el proyecto final hay puntaje por formato de gráficos, tablas, regresiones, entre otros. A continuación se les muestra algunos paquetes y funciones que les serán de ayuda para el informe y presentación.
library(data.table)
library(htmltools)
library(stargazer)
library(texreg)
Utilizaremos la base de la CASEN 2020 de Valparaíso como ejemplo. Supongamos que queremos estudiar el mercado laboral en chile:
casen <- fread('Clase 11/CASEn 2020 Valpo.csv')
casen <- casen[activ == 1 & edad >= 15 & ocup_inf != 9 & inmigrante != 9,
.(ytrabajocor,sexo,edad,esc2,inmigrante,ocup_inf)]
casen[,sexo := factor(sexo,levels = 1:2, labels = c('Hombre','Mujer'))]
casen[,ocup_inf := factor(ocup_inf, levels = 1:2, labels = c('Formal','Informal'))]
casen[,inmigrante := factor(inmigrante,levels = 0:1,c('Chileno','Inmigrante'))]
Veamos primero como hacer resumenes estadísticos. El paquete “stargazer” les puede ser util para esto. Aquí un pequeño ejemplo.
resumen <- stargazer(casen,type = 'html',summary = T,digits = 0)
##
## <table style="text-align:center"><tr><td colspan="8" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Statistic</td><td>N</td><td>Mean</td><td>St. Dev.</td><td>Min</td><td>Pctl(25)</td><td>Pctl(75)</td><td>Max</td></tr>
## <tr><td colspan="8" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">ytrabajocor</td><td>5,824</td><td>589,796</td><td>702,532</td><td>250</td><td>279,500</td><td>663,333</td><td>17,000,000</td></tr>
## <tr><td style="text-align:left">edad</td><td>6,412</td><td>44</td><td>14</td><td>15</td><td>32</td><td>55</td><td>99</td></tr>
## <tr><td style="text-align:left">esc2</td><td>6,305</td><td>13</td><td>4</td><td>0</td><td>12</td><td>16</td><td>27</td></tr>
## <tr><td colspan="8" style="border-bottom: 1px solid black"></td></tr></table>
HTML(resumen)
| Statistic | N | Mean | St. Dev. | Min | Pctl(25) | Pctl(75) | Max |
| ytrabajocor | 5,824 | 589,796 | 702,532 | 250 | 279,500 | 663,333 | 17,000,000 |
| edad | 6,412 | 44 | 14 | 15 | 32 | 55 | 99 |
| esc2 | 6,305 | 13 | 4 | 0 | 12 | 16 | 27 |
Si desean mejorar el aspecto de la tabla:
resumen2 <- stargazer(casen,type = 'html',summary = T,digits = 0,
title = 'Resumen estadístico principales variables',
covariate.labels = c('Ingreso total<br>del trabajo',
'Edad','Años de<br>educación'),
flip = T,
header=FALSE,single.row = TRUE,no.space = TRUE,
column.sep.width = "20pt",font.size = "small")
##
## <table style="text-align:center"><caption><strong>Resumen estadístico principales variables</strong></caption>
## <tr><td colspan="4" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Statistic</td><td>Ingreso total<br>del trabajo</td><td>Edad</td><td>Años de<br>educación</td></tr>
## <tr><td colspan="4" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">N</td><td>5,824</td><td>6,412</td><td>6,305</td></tr>
## <tr><td style="text-align:left">Mean</td><td>589,796</td><td>44</td><td>13</td></tr>
## <tr><td style="text-align:left">St. Dev.</td><td>702,532</td><td>14</td><td>4</td></tr>
## <tr><td style="text-align:left">Min</td><td>250</td><td>15</td><td>0</td></tr>
## <tr><td style="text-align:left">Pctl(25)</td><td>279,500</td><td>32</td><td>12</td></tr>
## <tr><td style="text-align:left">Pctl(75)</td><td>663,333</td><td>55</td><td>16</td></tr>
## <tr><td style="text-align:left">Max</td><td>17,000,000</td><td>99</td><td>27</td></tr>
## <tr><td colspan="4" style="border-bottom: 1px solid black"></td></tr></table>
HTML(resumen2)
| Statistic | Ingreso total del trabajo | Edad | Años de educación |
| N | 5,824 | 6,412 | 6,305 |
| Mean | 589,796 | 44 | 13 |
| St. Dev. | 702,532 | 14 | 4 |
| Min | 250 | 15 | 0 |
| Pctl(25) | 279,500 | 32 | 12 |
| Pctl(75) | 663,333 | 55 | 16 |
| Max | 17,000,000 | 99 | 27 |
Lo importante es que mejoren lo más posible el formato de la tabla. Les recomiendo ver el resto de argumentos de la función. Si luego desea exportar la tabla, utiliza el argumento “out” de la función de stargazer y el formato al cua desea exportar.
stargazer(casen,type = 'html',summary = T,digits = 0,title = 'Resumen estadístico principales variables',
covariate.labels = c('Ingreso total<br>del trabajo','Edad','Años de<br>educación'),flip = T,
out = 'Resumen estadístico.html')
##
## <table style="text-align:center"><caption><strong>Resumen estadístico principales variables</strong></caption>
## <tr><td colspan="4" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">Statistic</td><td>Ingreso total<br>del trabajo</td><td>Edad</td><td>Años de<br>educación</td></tr>
## <tr><td colspan="4" style="border-bottom: 1px solid black"></td></tr><tr><td style="text-align:left">N</td><td>5,824</td><td>6,412</td><td>6,305</td></tr>
## <tr><td style="text-align:left">Mean</td><td>589,796</td><td>44</td><td>13</td></tr>
## <tr><td style="text-align:left">St. Dev.</td><td>702,532</td><td>14</td><td>4</td></tr>
## <tr><td style="text-align:left">Min</td><td>250</td><td>15</td><td>0</td></tr>
## <tr><td style="text-align:left">Pctl(25)</td><td>279,500</td><td>32</td><td>12</td></tr>
## <tr><td style="text-align:left">Pctl(75)</td><td>663,333</td><td>55</td><td>16</td></tr>
## <tr><td style="text-align:left">Max</td><td>17,000,000</td><td>99</td><td>27</td></tr>
## <tr><td colspan="4" style="border-bottom: 1px solid black"></td></tr></table>
Supongamos que deseamos hacer una regresión de las variables independientes incluidas en la base sobre el nivel de ingreso del trabajo.
f1 <- formula(ytrabajocor ~ edad + esc2)
reg01 <- lm(formula = f1, data = casen)
summary(reg01)
##
## Call:
## lm(formula = f1, data = casen)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1269438 -303748 -95691 133851 15545056
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -931845.6 48512.3 -19.21 <2e-16 ***
## edad 8893.8 636.9 13.96 <2e-16 ***
## esc2 86975.2 2417.0 35.98 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 631000 on 5724 degrees of freedom
## (685 observations deleted due to missingness)
## Multiple R-squared: 0.1859, Adjusted R-squared: 0.1856
## F-statistic: 653.6 on 2 and 5724 DF, p-value: < 2.2e-16
La idea es que no muestren este tipo de output, sino algo mas estilizado. El paquete texreg puede serles de ayuda.
regresion1 <- htmlreg(reg01)
HTML(regresion1)
| Model 1 | |
|---|---|
| (Intercept) | -931845.62*** |
| (48512.32) | |
| edad | 8893.81*** |
| (636.94) | |
| esc2 | 86975.21*** |
| (2417.02) | |
| R2 | 0.19 |
| Adj. R2 | 0.19 |
| Num. obs. | 5727 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | |
Como les comenté en las reuniones, sería bueno que tengan más de una especificación del modelo para ver que tan robustos son sus resultados (¿cambia la magnitud y senntido de sus variables independientes de interés si incluyen más variables de control?).
f2 <- formula(ytrabajocor ~ edad + esc2 + sexo + ocup_inf + inmigrante)
reg02 <- lm(formula = f2, data = casen)
regresion2 <- htmlreg(list(reg01,reg02))
HTML(regresion2)
| Model 1 | Model 2 | |
|---|---|---|
| (Intercept) | -931845.62*** | -693161.14*** |
| (48512.32) | (49123.28) | |
| edad | 8893.81*** | 8608.28*** |
| (636.94) | (621.51) | |
| esc2 | 86975.21*** | 82794.43*** |
| (2417.02) | (2437.88) | |
| sexoMujer | -210514.64*** | |
| (16384.36) | ||
| ocup_infInformal | -230666.28*** | |
| (18436.57) | ||
| inmigranteInmigrante | -120098.62** | |
| (39153.76) | ||
| R2 | 0.19 | 0.23 |
| Adj. R2 | 0.19 | 0.23 |
| Num. obs. | 5727 | 5727 |
| ***p < 0.001; **p < 0.01; *p < 0.05 | ||
No se olviden que no solo importa tener las regresiones, sino también interpretar los coeficientes y explicar los mecanismos por los cuales creen que sus variables de interés afectan su variable dependiente. Nuevamente, se recomienda ver el resto de argumentos de la función “htmlreg” para ver que cosas se pueden mejorar en la tabla (título, nombre de coeficientes, nombre de los modelos, etc). Para exportar, mismo procedimiento que para el resumen estadístico.
htmlreg(list(reg01,reg02),file = 'regresion01.html')