# Control de lectura 1 - 2do Parcial.
# Regresión con variables Categóricas
# https://rpubs.com/xgoodyear/467254

# Importamos librerías
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.1
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.2 ──
## ✔ ggplot2 3.3.6     ✔ purrr   0.3.4
## ✔ tibble  3.1.7     ✔ dplyr   1.0.9
## ✔ tidyr   1.2.0     ✔ stringr 1.4.0
## ✔ readr   2.1.2     ✔ forcats 0.5.1
## Warning: package 'ggplot2' was built under R version 4.2.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
library(carData)
## Warning: package 'carData' was built under R version 4.2.1
library(car)
## 
## Attaching package: 'car'
## 
## The following object is masked from 'package:dplyr':
## 
##     recode
## 
## The following object is masked from 'package:purrr':
## 
##     some
# Variables categóricas con dos niveles ----------------------------------

head(Salaries)  # Set de datos Salaries. 
##        rank discipline yrs.since.phd yrs.service  sex salary
## 1      Prof          B            19          18 Male 139750
## 2      Prof          B            20          16 Male 173200
## 3  AsstProf          B             4           3 Male  79750
## 4      Prof          B            45          39 Male 115000
## 5      Prof          B            40          41 Male 141500
## 6 AssocProf          B             6           6 Male  97000
                # Observamos los datos.

# Estimar el salario en función del sexo del empleado.

model = lm(formula = salary ~ sex, data = Salaries)
summary(model)$coef
##              Estimate Std. Error   t value     Pr(>|t|)
## (Intercept) 101002.41   4809.386 21.001103 2.683482e-66
## sexMale      14088.01   5064.579  2.781674 5.667107e-03
# Notar que R realiza automáticamente la creación de las dummy variables.

contrasts(Salaries$sex)
##        Male
## Female    0
## Male      1
# En este caso por defecto tenemos que la clasificación seria:
# - 0 si sex = Female.
# - 1 si sex = Male.

# R crea la variable sexMale. 

# Si se desea recodificar:

Salaries = Salaries %>% mutate(sex = relevel(sex, ref = "Male"))
contrasts(Salaries$sex)
##        Female
## Male        0
## Female      1
# La salida de los resultados del modelo seria:

model1 = lm(formula = salary ~ sex, data = Salaries)
summary(model1)$coef
##              Estimate Std. Error   t value      Pr(>|t|)
## (Intercept) 115090.42   1587.378 72.503463 2.459122e-230
## sexFemale   -14088.01   5064.579 -2.781674  5.667107e-03
# Variables categóricas con más de dos niveles ---------------------------

# Una variable categórica con "c" categorías, estas son transformadas a "c-1" 
# variables.

# La variable rank por ejemplo tiene 3 categorías. 

res = model.matrix(~rank, data = Salaries)
head(res[,-1])
##   rankAssocProf rankProf
## 1             0        1
## 2             0        1
## 3             0        0
## 4             0        1
## 5             0        1
## 6             1        0
# Predicción más compleja ------------------------------------------------

# El ANOVA es un caso especial de modelo lineal, donde los predictores son
# variables categóricas. Es mejor usar la función Anova() de la librería car,
# ya que esta automáticamente considera diseños no balanceados.

model2 = lm(formula = salary ~ yrs.service + rank + discipline + sex, 
            data = Salaries)

Anova(model2)
## Anova Table (Type II tests)
## 
## Response: salary
##                 Sum Sq  Df  F value    Pr(>F)    
## yrs.service 3.2448e+08   1   0.6324    0.4270    
## rank        1.0288e+11   2 100.2572 < 2.2e-16 ***
## discipline  1.7373e+10   1  33.8582 1.235e-08 ***
## sex         7.7669e+08   1   1.5137    0.2193    
## Residuals   2.0062e+11 391                       
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Se puede observar que considerando las otras variables en el modelo, la
# variable sexo no es significativa asociada con la variación del salario 
# entre individuos. Las variables significativas son: rank y discipline.

summary(model2)
## 
## Call:
## lm(formula = salary ~ yrs.service + rank + discipline + sex, 
##     data = Salaries)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -64202 -14255  -1533  10571  99163 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   73122.92    3245.27  22.532  < 2e-16 ***
## yrs.service     -88.78     111.64  -0.795 0.426958    
## rankAssocProf 14560.40    4098.32   3.553 0.000428 ***
## rankProf      49159.64    3834.49  12.820  < 2e-16 ***
## disciplineB   13473.38    2315.50   5.819 1.24e-08 ***
## sexFemale     -4771.25    3878.00  -1.230 0.219311    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22650 on 391 degrees of freedom
## Multiple R-squared:  0.4478, Adjusted R-squared:  0.4407 
## F-statistic: 63.41 on 5 and 391 DF,  p-value: < 2.2e-16
# Cuando se tienen variables categóricas ordinales, se puede asociar a 
# números (de menor a mayor) y usarlas de esa forma.