#Librería para excel
library(readxl)
library(ggplot2)

1.Cargamos los datos:

mis_datos <- read_xlsx("ch8_cps.xlsx")
set.seed(3)
muestra <- sample(1:nrow(mis_datos), 1000) # Se obtiene una muestra de 100 observaciones porque la base original es muy grande y los resultados no serán tan precisos.
mis_datos_muestra <- mis_datos[muestra, ]
head(mis_datos_muestra)
  1. Observamos los datos:
ggplot(mis_datos_muestra) + 
  geom_point(aes(x = age, y = ahe, alpha = 0.1)) + # alpha le da transparencia a los puntos para ver su densidad y que se puedan observar mejor.
  geom_smooth(aes(x = age, y = ahe), method = "lm", formula = y ~ x, se =FALSE) +
  labs(x = "Edad", y = "Salario por hora")

  # En este ejemplo hay un "problema" de heterocedasticidad, es decir, las varianzas de los datos no son constantes. Esto sucede porque es natural a los datos utilizados.
  1. Modelo Lineal:
m_lineal <- lm(ahe ~ age, data = mis_datos_muestra)
summary(m_lineal)
## 
## Call:
## lm(formula = ahe ~ age, data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -23.561 -10.744  -4.415   5.931 120.591 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 17.70465    1.83653   9.640  < 2e-16 ***
## age          0.15619    0.04118   3.793 0.000158 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.51 on 998 degrees of freedom
## Multiple R-squared:  0.01421,    Adjusted R-squared:  0.01322 
## F-statistic: 14.39 on 1 and 998 DF,  p-value: 0.0001579
# t value es estadísticamente significativo si su valor absoluto es mayor a 1.96, en este caso si es (3.793).
# H0: beta1 = 0, H1: beta1 =/= 0.
# En este caso existe evidencia estadística suficiente para rechazar H0, es decir, hay evidencia para concluir que beta1 es diferente de 0.
# p-value = la probabilidad de observar los datos que acabo de observar dado que beta1 es 0.
# F estadístico explica TODAS las variables
# H0 para la prueba F --> H0: beta1 = 0, beta2 = 0, es decir, que beta1 = beta2 = 0.
# En este caso F estadístico me indica que se rechaza H0, es decir, al menos una de las betas es diferente de 0. 

Observamos el modelo lineal:

ggplot(mis_datos_muestra) + 
  geom_point(aes(x = age, y = ahe, alpha = 0.1)) +
  geom_smooth(aes(x = age, y = ahe), 
              method = "lm", 
              formula = y ~ x, 
              se = FALSE) +
  labs(x = "Edad", y = "Salario por hora")

  1. Modelo No Lineal Cuadrático:
m_cuadratico <- lm(ahe ~ age + I(age^2), data = mis_datos_muestra)
summary(m_cuadratico)
## 
## Call:
## lm(formula = ahe ~ age + I(age^2), data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -24.906 -10.494  -4.339   5.832 118.897 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) -7.564761   5.289163  -1.430    0.153    
## age          1.394651   0.246874   5.649 2.10e-08 ***
## I(age^2)    -0.013919   0.002737  -5.086 4.37e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.31 on 997 degrees of freedom
## Multiple R-squared:  0.03914,    Adjusted R-squared:  0.03721 
## F-statistic: 20.31 on 2 and 997 DF,  p-value: 2.271e-09

Graficamos el modelo cuadrático:

ggplot(mis_datos_muestra) +
  geom_point(aes(x= age, y= ahe, alpha = 0.1))+
  geom_smooth(aes(x= age, y= ahe), 
              method = "lm", 
              formula= y ~ x + I(x^2), 
              se=FALSE)+
  labs(x= "Edad", y= "Salario por hora")

  1. Modelo No Lineal Polinomial de Grado n:

Comencemos con grado 4:

m_polinomial <- lm(ahe ~ age + I(age^2) + I(age^3) + I(age^4), data = mis_datos_muestra)
summary(m_polinomial)
## 
## Call:
## lm(formula = ahe ~ age + I(age^2) + I(age^3) + I(age^4), data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -24.598 -10.709  -3.870   6.064 117.777 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.831e+01  3.507e+01  -1.093    0.275
## age          3.538e+00  3.371e+00   1.050    0.294
## I(age^2)    -5.655e-02  1.154e-01  -0.490    0.624
## I(age^3)     1.620e-04  1.672e-03   0.097    0.923
## I(age^4)     1.482e-06  8.699e-06   0.170    0.865
## 
## Residual standard error: 16.26 on 995 degrees of freedom
## Multiple R-squared:  0.04699,    Adjusted R-squared:  0.04316 
## F-statistic: 12.27 on 4 and 995 DF,  p-value: 9.711e-10

Lo graficamos:

ggplot(mis_datos_muestra) + 
  geom_point(aes(x = age, y = ahe, alpha = 0.1)) +
  geom_smooth(aes(x = age, y = ahe), 
              method = "lm",
              formula = y ~ x + I(x^2) + I(x^3) + I(x^4),
              se = FALSE) +
  labs(x = "Edad", y = "Salario por hora")

  1. Modelo logaritmico:
m_log <- lm(log(ahe) ~ age, data = mis_datos_muestra)
summary(m_log)
## 
## Call:
## lm(formula = log(ahe) ~ age, data = mis_datos_muestra)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -2.16081 -0.41149 -0.01254  0.41343  2.00558 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 2.692080   0.068806  39.126  < 2e-16 ***
## age         0.007204   0.001543   4.669 3.44e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6187 on 998 degrees of freedom
## Multiple R-squared:  0.02138,    Adjusted R-squared:  0.0204 
## F-statistic:  21.8 on 1 and 998 DF,  p-value: 3.436e-06
# Un cambio en edad se asocia con un cambio porcentual aproximado en el salario.

Modelo lin-log:

m_linlog <- lm(ahe ~ log(age), data = mis_datos_muestra)
summary(m_linlog)
## 
## Call:
## lm(formula = ahe ~ log(age), data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -23.571 -10.537  -4.299   5.979 120.414 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   -4.953      6.238  -0.794    0.427    
## log(age)       7.909      1.676   4.719 2.71e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.45 on 998 degrees of freedom
## Multiple R-squared:  0.02183,    Adjusted R-squared:  0.02085 
## F-statistic: 22.27 on 1 and 998 DF,  p-value: 2.708e-06
# Un cambio porcentual en la edad se asocia con un cambio en unidades de salario.
  1. Modelo con variable binaria:
m_binaria <- lm(ahe ~ age + female, data = mis_datos_muestra)
summary(m_binaria)
## 
## Call:
## lm(formula = ahe ~ age + female, data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -26.610 -10.764  -3.801   5.727 117.850 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  20.0796     1.8466  10.874  < 2e-16 ***
## age           0.1658     0.0405   4.095 4.57e-05 ***
## female       -6.2612     1.0332  -6.060 1.93e-09 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.22 on 997 degrees of freedom
## Multiple R-squared:  0.04923,    Adjusted R-squared:  0.04732 
## F-statistic: 25.81 on 2 and 997 DF,  p-value: 1.177e-11
# female = 1 si es mujer, 0 si es hombre
# El coeficiente mide la diferencia promedio en salario entre mujeres y hombres, manteniendo constante la edad.
  1. Modelo con interacción de variable binaria:
m_interaccion <- lm(ahe ~ age + female + age:female, data = mis_datos_muestra)
summary(m_interaccion)
## 
## Call:
## lm(formula = ahe ~ age + female + age:female, data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -27.729 -10.760  -3.691   5.762 118.025 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 18.36920    2.44117   7.525 1.18e-13 ***
## age          0.20624    0.05535   3.726 0.000206 ***
## female      -2.53555    3.62856  -0.699 0.484856    
## age:female  -0.08696    0.08118  -1.071 0.284387    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.22 on 996 degrees of freedom
## Multiple R-squared:  0.05032,    Adjusted R-squared:  0.04746 
## F-statistic: 17.59 on 3 and 996 DF,  p-value: 3.917e-11
# El efecto de la edad sobre el salario cambia dependiendo si es mujer o no.

Veamos si afecta que sea mujer de noreste:

m_mujer_noreste <- lm(ahe ~ age + female + northeast + female:northeast, data = mis_datos_muestra)
summary(m_mujer_noreste)
## 
## Call:
## lm(formula = ahe ~ age + female + northeast + female:northeast, 
##     data = mis_datos_muestra)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -29.270 -10.758  -4.043   5.890 114.260 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      19.82797    1.84107  10.770  < 2e-16 ***
## age               0.15781    0.04015   3.931 9.06e-05 ***
## female           -6.92271    1.10293  -6.277 5.16e-10 ***
## northeast         4.14581    1.95355   2.122   0.0341 *  
## female:northeast  5.04327    2.95203   1.708   0.0879 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16.07 on 995 degrees of freedom
## Multiple R-squared:  0.06951,    Adjusted R-squared:  0.06577 
## F-statistic: 18.58 on 4 and 995 DF,  p-value: 9.653e-15
# Aquí analizamos si el efecto de ser mujer cambia específicamente en la región noreste.

Interpretación final:

El modelo lineal muestra que la edad tiene un efecto positivo y estadísticamente significativo sobre el salario, es decir, un año adicional incrementa el salario en aproximadamente 0.156 unidades (p<0.001). Sin embargo, el modelo presenta un bajo poder explicativo (R^2=0.014), lo que indica que explica solo el 1.4% de la variación en los salarios.

Al introducir un término cuadrático, se observa una relación no lineal: el coeficiente de edad es positivo (1.395) y el de age^2 es negativo (-0.0139), ambos significativos (p<0.001), lo que sugiere una forma de U invertida. Además, el ajuste mejora (R^2=0.039), aunque sigue siendo limitado.

El modelo polinomial de grado 4 incrementa el ajuste (R^2 = 0.047). Aunque los coeficientes individuales de los términos polinomiales no son significativos por separado, la prueba F conjunta frente al modelo lineal sí es significativa, lo que sugiere que la especificación no lineal mejora el modelo en conjunto.

En el modelo logarítmico, la edad tiene un efecto positivo y significativo (0.0072, p<0.001), lo que implica un aumento porcentual en el salario. De forma consistente, el modelo lin-log, el coeficiente de log(age) es 7.91 y es significativo. Esto implica que un aumento de 1% en la edad se asocia con un incremento aproximado de 0.079 unidades en el salario.

Al incluir género, se observa una brecha salarial: ser mujer reduce el salario en aproximadamente 6.26 unidades (p<0.001), manteniendo constante la edad. En el modelo con interacción edad-género, los términos de interacción no son significativos, lo que sugiere que el efecto de la edad es similar entre hombres y mujeres.

Finalmente, al considerar la interacción entre género y región (noreste), se encuentra que el coeficiente de female es -6.92 (p<0.001), mientras que la interacción female:noreste es positiva (5.04) y marginalmente significativa (p<0.1), lo que indica que la brecha salarial de género es menor en esa región.

En conjunto, los resultados muestran una relación positiva pero no lineal entre edad y salario, con bajo poder explicativo, y evidencian la existencia de diferencias salariales importantes asociadas al género y la región.