29 mar 2019

Tidyverse y minería de datos en R: estimar regresiones por grupos

La siguiente entrada utiliza la potente librería tidyverse, de R, para estimar regresiones por grupo. Para el siguiente ejemplo se utiliza la base  bwght del libro de wooldridge.

library(tidyverse); library(purrr)
library(wooldridge)
attach(bwght)

En primer lugar, indicamos la base de datos con la que deseamos trabajar (bwght %>%); posteriormente, le indicamos para cuales grupos específicos requerimos estimar nuestra regresiones (split(.$white) %>%). En este caso, se desea repetir la estimación para cada grupo, según color de la piel; finalmente, especificamos la regresión que deseamos estimar (map(~ lm(lbwght ~ cigprice+faminc, data = .)) %>%) ayudados por la funciones map y lm; y llamamos la tradicional salida de la regresión de R (map(summary)). Note, que la regresión propuesta se estima para cada una de las categorías indicadas en la variable White.

bwght %>%
  split(.$white) %>%
  map(~ lm(lbwght ~ cigprice+faminc, data = .)) %>%
  map(summary)

$`0`

Call:
lm(formula = lbwght ~ cigprice + faminc, data = .)

Residuals:
     Min       1Q   Median       3Q      Max
-1.57471 -0.11323  0.02753  0.15088  0.48549

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 4.522e+00  1.706e-01  26.503   <2e-16 ***
cigprice    1.483e-03  1.327e-03   1.117    0.265   
faminc      2.742e-05  8.369e-04   0.033    0.974   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.2212 on 296 degrees of freedom
Multiple R-squared:  0.004233, Adjusted R-squared:  -0.002495
F-statistic: 0.6292 on 2 and 296 DF,  p-value: 0.5337


$`1`

Call:
lm(formula = lbwght ~ cigprice + faminc, data = .)

Residuals:
     Min       1Q   Median       3Q      Max
-1.21048 -0.08434  0.01967  0.11253  0.81989

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) 4.7104582  0.0692942  67.978  < 2e-16 ***
cigprice    0.0002696  0.0005266   0.512  0.60876   
faminc      0.0008468  0.0002940   2.880  0.00406 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1789 on 1086 degrees of freedom
Multiple R-squared:  0.00803,  Adjusted R-squared:  0.006204
F-statistic: 4.396 on 2 and 1086 DF,  p-value: 0.01255

En el segundo ejemplo, únicamente se agrega la función map_dbl, para llamar un estadístico específico de los calculados por R de forma automática. En este ejemplo se llama el R cuadrado (map_dbl("r.squared")).  

# Ejemplo: obtiene el R2 para cada grupo
bwght %>%
  split(.$white) %>%
  map(~ lm(lbwght ~ cigprice+faminc, data = .)) %>%
  map(summary) %>%
  map_dbl("r.squared")

En caso de desear ver cómo saber cuáles estadísticos podemos llamar:

models1<-lm(lbwght ~ cigprice+faminc)
summary(models1)
ames(summary(models1))

> names( summary(models1))
 [1] "call"          "terms"         "residuals"     "coefficients"  "aliased"       "sigma"        

 [7] "df"            "r.squared"     "adj.r.squared" "fstatistic"    "cov.unscaled" 

20 ejemplos de Indexación de un vector en R

Entenderemos indexación acceder a una parte de un objeto. Recordemos que, en R, tenemos objetos atómicos (de un solo tipo de clases, por eje...