# 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.