1 Carga de paquetes y datos

paquetes <- c("lmtest", "car", "sandwich", "tseries", "AER")
instalar <- paquetes[!paquetes %in% installed.packages()[,"Package"]]
if(length(instalar) > 0) install.packages(instalar, repos = "https://cran.rstudio.com/")

library(lmtest)
library(car)
library(sandwich)
library(tseries)
library(AER)
if (!is.null(knitr::current_input())) {
  rmd_dir <- dirname(normalizePath(knitr::current_input()))
  setwd(rmd_dir)
}

datos <- read.csv("salarios_manufactura.csv")
str(datos)
## 'data.frame':    150 obs. of  8 variables:
##  $ salario     : int  3900 2864 5343 3848 2347 3646 3452 1952 5029 3142 ...
##  $ educacion   : int  11 11 18 9 13 11 12 10 11 16 ...
##  $ experiencia : int  12 9 21 20 0 9 11 0 15 0 ...
##  $ antiguedad  : int  10 5 5 8 0 6 7 0 6 0 ...
##  $ edad        : int  33 28 42 41 21 28 34 21 34 20 ...
##  $ sexo        : int  1 0 0 1 1 1 1 0 1 1 ...
##  $ turno_noche : int  0 0 0 0 1 0 0 1 1 0 ...
##  $ horas_semana: int  44 38 40 45 46 45 38 35 45 42 ...
summary(datos)
##     salario       educacion      experiencia      antiguedad    
##  Min.   :1516   Min.   : 8.00   Min.   : 0.00   Min.   : 0.000  
##  1st Qu.:3286   1st Qu.:11.25   1st Qu.: 6.00   1st Qu.: 2.000  
##  Median :3856   Median :15.00   Median :10.00   Median : 4.000  
##  Mean   :3842   Mean   :14.27   Mean   :10.31   Mean   : 4.187  
##  3rd Qu.:4462   3rd Qu.:17.00   3rd Qu.:15.00   3rd Qu.: 6.000  
##  Max.   :5898   Max.   :20.00   Max.   :24.00   Max.   :12.000  
##       edad            sexo         turno_noche   horas_semana  
##  Min.   :18.00   Min.   :0.0000   Min.   :0.0   Min.   :30.00  
##  1st Qu.:26.00   1st Qu.:0.0000   1st Qu.:0.0   1st Qu.:39.00  
##  Median :30.50   Median :1.0000   Median :0.0   Median :42.50  
##  Mean   :30.73   Mean   :0.5067   Mean   :0.3   Mean   :42.37  
##  3rd Qu.:35.00   3rd Qu.:1.0000   3rd Qu.:1.0   3rd Qu.:45.00  
##  Max.   :45.00   Max.   :1.0000   Max.   :1.0   Max.   :59.00

Descripción de variables:

Variable Tipo Descripción
salario Continua (dependiente) Salario mensual en USD
educacion Continua Años de educación formal
experiencia Continua Años de experiencia laboral
antiguedad Continua Años en la empresa actual
edad Continua Edad en años
sexo Dummy (1=hombre, 0=mujer) Género del trabajador
turno_noche Dummy (1=turno nocturno) Turno de trabajo
horas_semana Continua Horas trabajadas por semana

2 Punto 1 — Estimación del modelo e identificación de variables significativas

modelo_completo <- lm(salario ~ educacion + experiencia + antiguedad +
                        edad + sexo + turno_noche + horas_semana,
                      data = datos)
summary(modelo_completo)
## 
## Call:
## lm(formula = salario ~ educacion + experiencia + antiguedad + 
##     edad + sexo + turno_noche + horas_semana, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1010.41  -246.60     6.98   231.76   847.99 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   855.018    459.250   1.862 0.064703 .  
## educacion     127.600      8.331  15.317  < 2e-16 ***
## experiencia    99.599     18.670   5.335 3.69e-07 ***
## antiguedad     54.476     10.640   5.120 9.78e-07 ***
## edad           -4.417     17.891  -0.247 0.805341    
## sexo          189.983     55.050   3.451 0.000736 ***
## turno_noche   165.593     60.018   2.759 0.006561 ** 
## horas_semana   -2.307      5.114  -0.451 0.652513    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 333.7 on 142 degrees of freedom
## Multiple R-squared:  0.8529, Adjusted R-squared:  0.8456 
## F-statistic: 117.6 on 7 and 142 DF,  p-value: < 2.2e-16

Las variables educacion, experiencia, antiguedad, sexo y turno_noche son estadísticamente significativas (p < 0.05). Las variables edad y horas_semana no son significativas: edad presenta multicolinealidad con experiencia (ambas capturan trayectoria laboral), y horas_semana no explica variación adicional en el salario una vez controladas las demás variables. Se estima el modelo reducido sin ellas.

modelo_reducido <- lm(salario ~ educacion + experiencia + antiguedad +
                        sexo + turno_noche, data = datos)
summary(modelo_reducido)
## 
## Call:
## lm(formula = salario ~ educacion + experiencia + antiguedad + 
##     sexo + turno_noche, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1010.55  -250.71    -3.97   236.38   848.05 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  670.104    132.881   5.043 1.36e-06 ***
## educacion    127.407      8.251  15.441  < 2e-16 ***
## experiencia   94.970      5.002  18.986  < 2e-16 ***
## antiguedad    54.810     10.554   5.193 6.92e-07 ***
## sexo         191.731     54.531   3.516 0.000586 ***
## turno_noche  164.234     59.356   2.767 0.006402 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 331.7 on 144 degrees of freedom
## Multiple R-squared:  0.8526, Adjusted R-squared:  0.8475 
## F-statistic: 166.6 on 5 and 144 DF,  p-value: < 2.2e-16

Interpretación de coeficientes:

  • educacion: Un año adicional de educación aumenta el salario en promedio 127.41 USD, ceteris paribus.
  • experiencia: Un año más de experiencia laboral incrementa el salario en 94.97 USD, ceteris paribus.
  • antiguedad: Un año más en la empresa se asocia con 54.81 USD adicionales en el salario mensual.
  • sexo: Los hombres ganan en promedio 191.73 USD más que las mujeres, controlando por las demás variables.
  • turno_noche: Trabajar en turno nocturno se asocia con 164.23 USD adicionales respecto al turno diurno.

3 Punto 2 — Diagnóstico del modelo reducido

3.0.1 Normalidad

# Gráfico Q-Q
plot(modelo_reducido, which = 2)

# Prueba Jarque-Bera
jarque.bera.test(modelo_reducido$residuals)
## 
##  Jarque Bera Test
## 
## data:  modelo_reducido$residuals
## X-squared = 0.016003, df = 2, p-value = 0.992
# Prueba Shapiro-Wilk
shapiro.test(modelo_reducido$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_reducido$residuals
## W = 0.99432, p-value = 0.8261

Si p > 0.05 en Shapiro-Wilk y Jarque-Bera no se rechaza la hipótesis nula de normalidad, indicando que los residuos se distribuyen aproximadamente normal. El Q-Q plot permite confirmarlo visualmente: los puntos deben seguir la línea diagonal.

3.0.2 No multicolinealidad

# Factor de inflación de varianza (VIF)
vif(modelo_reducido)
##   educacion experiencia  antiguedad        sexo turno_noche 
##    1.024327    1.219042    1.237997    1.013378    1.008749

VIF < 5 indica ausencia de multicolinealidad problemática. Valores entre 5 y 10 son moderados; superiores a 10 son severos. Al haber excluido edad del modelo, se espera que experiencia y antiguedad presenten VIF aceptables.

3.0.3 Homocedasticidad

# Gráfico residuos vs valores ajustados
plot(modelo_reducido, which = 1)

# Prueba Breusch-Pagan
bptest(modelo_reducido)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_reducido
## BP = 5.9795, df = 5, p-value = 0.3082

Si p > 0.05 en Breusch-Pagan no se rechaza la homocedasticidad. El gráfico no debe mostrar patrones en forma de cono o embudo; los residuos deben dispersarse aleatoriamente alrededor de cero.

3.0.4 Especificación del modelo

# Prueba RESET de Ramsey
resettest(modelo_reducido)
## 
##  RESET test
## 
## data:  modelo_reducido
## RESET = 3.5333, df1 = 2, df2 = 142, p-value = 0.0318

Si p > 0.05 no se rechaza la correcta especificación funcional del modelo, indicando que no se omitieron términos no lineales relevantes.


4 Punto 3 — Modelo log-log y diagnóstico

# Crear variables en logaritmo
datos$ln_salario     <- log(datos$salario)
datos$ln_educacion   <- log(datos$educacion)
datos$ln_experiencia <- log(datos$experiencia + 1)
datos$ln_antiguedad  <- log(datos$antiguedad + 1)

# Estimar modelo log-log
modelo_loglog <- lm(ln_salario ~ ln_educacion + ln_experiencia + ln_antiguedad +
                      sexo + turno_noche, data = datos)
summary(modelo_loglog)
## 
## Call:
## lm(formula = ln_salario ~ ln_educacion + ln_experiencia + ln_antiguedad + 
##     sexo + turno_noche, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.42428 -0.06578  0.00565  0.07285  0.23921 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     6.37054    0.10048  63.398  < 2e-16 ***
## ln_educacion    0.50204    0.03664  13.702  < 2e-16 ***
## ln_experiencia  0.19763    0.01402  14.094  < 2e-16 ***
## ln_antiguedad   0.04112    0.01618   2.541  0.01210 *  
## sexo            0.05735    0.01817   3.156  0.00195 ** 
## turno_noche     0.04539    0.01977   2.296  0.02313 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1103 on 144 degrees of freedom
## Multiple R-squared:  0.7997, Adjusted R-squared:  0.7928 
## F-statistic:   115 on 5 and 144 DF,  p-value: < 2.2e-16

En el modelo log-log los coeficientes de las variables continuas transformadas son elasticidades: un incremento del 1% en educacion genera un cambio de 0.502% en el salario, ceteris paribus. Las variables dummy sexo y turno_noche se mantienen en niveles e indican el cambio porcentual aproximado en el salario.

# Gráfico Q-Q
plot(modelo_loglog, which = 2)

# Shapiro-Wilk
shapiro.test(modelo_loglog$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_loglog$residuals
## W = 0.98245, p-value = 0.0527
# Gráfico residuos vs fitted
plot(modelo_loglog, which = 1)

# Breusch-Pagan
bptest(modelo_loglog)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_loglog
## BP = 19.942, df = 5, p-value = 0.001282
# RESET
resettest(modelo_loglog)
## 
##  RESET test
## 
## data:  modelo_loglog
## RESET = 0.28555, df1 = 2, df2 = 142, p-value = 0.752
# VIF
vif(modelo_loglog)
##   ln_educacion ln_experiencia  ln_antiguedad           sexo    turno_noche 
##       1.028445       1.543526       1.556205       1.017476       1.011525
# AIC
AIC(modelo_loglog)
## [1] -227.737

5 Punto 4 — Modelo log-lin y diagnóstico

# En este modelo solo se transforma la variable dependiente
modelo_loglin <- lm(ln_salario ~ educacion + experiencia + antiguedad +
                      sexo + turno_noche, data = datos)
summary(modelo_loglin)
## 
## Call:
## lm(formula = ln_salario ~ educacion + experiencia + antiguedad + 
##     sexo + turno_noche, data = datos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.44219 -0.06352  0.00680  0.07466  0.22540 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 7.333949   0.041836 175.304  < 2e-16 ***
## educacion   0.036122   0.002598  13.905  < 2e-16 ***
## experiencia 0.026255   0.001575  16.671  < 2e-16 ***
## antiguedad  0.015810   0.003323   4.758  4.7e-06 ***
## sexo        0.054461   0.017168   3.172  0.00185 ** 
## turno_noche 0.043542   0.018687   2.330  0.02119 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1044 on 144 degrees of freedom
## Multiple R-squared:  0.8206, Adjusted R-squared:  0.8144 
## F-statistic: 131.7 on 5 and 144 DF,  p-value: < 2.2e-16

En el modelo log-lin los coeficientes representan semi-elasticidades: un año adicional de educación aumenta el salario en aproximadamente 3.61%, ceteris paribus.

# Gráfico Q-Q
plot(modelo_loglin, which = 2)

# Shapiro-Wilk
shapiro.test(modelo_loglin$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_loglin$residuals
## W = 0.97101, p-value = 0.002922
# Gráfico residuos vs fitted
plot(modelo_loglin, which = 1)

# Breusch-Pagan
bptest(modelo_loglin)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_loglin
## BP = 8.7012, df = 5, p-value = 0.1216
# RESET
resettest(modelo_loglin)
## 
##  RESET test
## 
## data:  modelo_loglin
## RESET = 27.817, df1 = 2, df2 = 142, p-value = 6.404e-11
# VIF
vif(modelo_loglin)
##   educacion experiencia  antiguedad        sexo turno_noche 
##    1.024327    1.219042    1.237997    1.013378    1.008749
# AIC
AIC(modelo_loglin)
## [1] -244.2212

6 Punto 5 — Modelo lin-log con interacciones y diagnóstico

# En este modelo se transforman las variables independientes continuas
modelo_linlog <- lm(salario ~ ln_educacion + ln_experiencia + ln_antiguedad +
                      sexo + turno_noche +
                      ln_educacion:ln_experiencia,
                    data = datos)
summary(modelo_linlog)
## 
## Call:
## lm(formula = salario ~ ln_educacion + ln_experiencia + ln_antiguedad + 
##     sexo + turno_noche + ln_educacion:ln_experiencia, data = datos)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -873.61 -270.98    3.88  261.70  877.17 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                 -4217.32    1119.37  -3.768  0.00024 ***
## ln_educacion                 2350.13     420.62   5.587 1.13e-07 ***
## ln_experiencia               1397.32     473.08   2.954  0.00367 ** 
## ln_antiguedad                 141.95      58.14   2.442  0.01584 *  
## sexo                          200.60      65.22   3.076  0.00252 ** 
## turno_noche                   164.31      71.00   2.314  0.02208 *  
## ln_educacion:ln_experiencia  -267.97     178.16  -1.504  0.13478    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 395.8 on 143 degrees of freedom
## Multiple R-squared:  0.7915, Adjusted R-squared:  0.7828 
## F-statistic:  90.5 on 6 and 143 DF,  p-value: < 2.2e-16

En el modelo lin-log los coeficientes de las variables logarítmicas indican el cambio absoluto en el salario (USD) ante un cambio del 1% en el regresor. La interacción ln_educacion:ln_experiencia captura si el efecto conjunto de educación y experiencia sobre el salario difiere del efecto individual de cada una.

# Gráfico Q-Q
plot(modelo_linlog, which = 2)

# Shapiro-Wilk
shapiro.test(modelo_linlog$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_linlog$residuals
## W = 0.98626, p-value = 0.1438
# Gráfico residuos vs fitted
plot(modelo_linlog, which = 1)

# Breusch-Pagan
bptest(modelo_linlog)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_linlog
## BP = 5.5716, df = 6, p-value = 0.4728
# RESET
resettest(modelo_linlog)
## 
##  RESET test
## 
## data:  modelo_linlog
## RESET = 17.182, df1 = 2, df2 = 141, p-value = 2.1e-07
# VIF
vif(modelo_linlog)
##                ln_educacion              ln_experiencia 
##                   10.529994                  136.475540 
##               ln_antiguedad                        sexo 
##                    1.560935                    1.017981 
##                 turno_noche ln_educacion:ln_experiencia 
##                    1.013581                  142.473215
# AIC
AIC(modelo_linlog)
## [1] 2228.803

7 Punto 6 — Comparación de modelos

# R² ajustado de cada modelo
r2_linlin <- summary(modelo_reducido)$adj.r.squared
r2_loglog <- summary(modelo_loglog)$adj.r.squared
r2_loglin <- summary(modelo_loglin)$adj.r.squared
r2_linlog <- summary(modelo_linlog)$adj.r.squared

# AIC de cada modelo
aic_loglog <- AIC(modelo_loglog)
aic_loglin <- AIC(modelo_loglin)
aic_linlog <- AIC(modelo_linlog)

# Tabla comparativa
comparacion <- data.frame(
  Modelo      = c("Lin-Lin", "Log-Log", "Log-Lin", "Lin-Log"),
  R2_ajustado = round(c(r2_linlin, r2_loglog, r2_loglin, r2_linlog), 4),
  AIC         = round(c(NA, aic_loglog, aic_loglin, aic_linlog), 4)
)
print(comparacion)
##    Modelo R2_ajustado       AIC
## 1 Lin-Lin      0.8475        NA
## 2 Log-Log      0.7928 -227.7370
## 3 Log-Lin      0.8144 -244.2212
## 4 Lin-Log      0.7828 2228.8033

Interpretación: El modelo con mayor R² ajustado es el preferido en términos de ajuste. El AIC es comparable únicamente entre modelos con la misma variable dependiente: Log-Log, Log-Lin (comparten ln_salario) y Lin-Lin con Lin-Log (comparten salario). El mejor modelo es aquel que combina mayor R² ajustado y menor AIC dentro de su grupo. Se selecciona el modelo Log-Lin como punto de partida para el siguiente punto, dado que suele corregir heteroscedasticidad y mejorar la normalidad en datos salariales.


8 Punto 7 — Término de interacción sobre el mejor modelo

# Agregar término de interacción al modelo log-lin (mejor modelo seleccionado)
modelo_loglog_int <- lm(ln_salario ~ ln_educacion + ln_experiencia + ln_antiguedad +
                          sexo + turno_noche +
                          ln_educacion:ln_experiencia, data = datos)
summary(modelo_loglog_int)
## 
## Call:
## lm(formula = ln_salario ~ ln_educacion + ln_experiencia + ln_antiguedad + 
##     sexo + turno_noche + ln_educacion:ln_experiencia, data = datos)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.299900 -0.058587  0.004452  0.074438  0.192572 
## 
## Coefficients:
##                             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                  5.00545    0.28893  17.324  < 2e-16 ***
## ln_educacion                 1.01673    0.10857   9.365  < 2e-16 ***
## ln_experiencia               0.80358    0.12211   6.581 8.25e-10 ***
## ln_antiguedad                0.04524    0.01501   3.015  0.00304 ** 
## sexo                         0.05548    0.01684   3.296  0.00124 ** 
## turno_noche                  0.04127    0.01833   2.252  0.02587 *  
## ln_educacion:ln_experiencia -0.22951    0.04599  -4.991 1.72e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1022 on 143 degrees of freedom
## Multiple R-squared:  0.8294, Adjusted R-squared:  0.8223 
## F-statistic: 115.9 on 6 and 143 DF,  p-value: < 2.2e-16

El coeficiente de ln_educacion:ln_experiencia indica si el efecto de la educación sobre el salario (en logaritmos) varía según el nivel de experiencia. Si es positivo y significativo, mayores niveles de experiencia amplifican el retorno salarial a la educación.

# Comparar modelo log-lin sin y con interacción
aic_sin <- AIC(modelo_loglin)
aic_con <- AIC(modelo_loglog_int)
cat("AIC sin interacción:", round(aic_sin, 4), "\n")
## AIC sin interacción: -244.2212
cat("AIC con interacción:", round(aic_con, 4), "\n")
## AIC con interacción: -249.8204
r2_sin <- summary(modelo_loglin)$adj.r.squared
r2_con <- summary(modelo_loglog_int)$adj.r.squared
cat("R² ajustado sin interacción:", round(r2_sin, 4), "\n")
## R² ajustado sin interacción: 0.8144
cat("R² ajustado con interacción:", round(r2_con, 4), "\n")
## R² ajustado con interacción: 0.8223
plot(modelo_loglog_int, which = 2)

shapiro.test(modelo_loglog_int$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_loglog_int$residuals
## W = 0.98412, p-value = 0.08188
plot(modelo_loglog_int, which = 1)

bptest(modelo_loglog_int)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_loglog_int
## BP = 13.74, df = 6, p-value = 0.03268
resettest(modelo_loglog_int)
## 
##  RESET test
## 
## data:  modelo_loglog_int
## RESET = 5.0348, df1 = 2, df2 = 141, p-value = 0.007726

Si el término de interacción reduce el AIC y aumenta el R² ajustado, se conserva en el modelo final. En caso contrario, se mantiene el modelo log-lin sin interacción.


9 Punto 8 — Errores estándar robustos a heteroscedasticidad

library(sandwich)
library(lmtest)

# Errores estándar normales
cat("=== Errores estándar normales ===\n")
## === Errores estándar normales ===
coeftest(modelo_loglin)
## 
## t test of coefficients:
## 
##              Estimate Std. Error  t value  Pr(>|t|)    
## (Intercept) 7.3339491  0.0418356 175.3042 < 2.2e-16 ***
## educacion   0.0361217  0.0025977  13.9052 < 2.2e-16 ***
## experiencia 0.0262551  0.0015749  16.6713 < 2.2e-16 ***
## antiguedad  0.0158101  0.0033228   4.7581 4.702e-06 ***
## sexo        0.0544612  0.0171681   3.1722  0.001849 ** 
## turno_noche 0.0435425  0.0186874   2.3300  0.021193 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Errores estándar robustos HC3
cat("=== Errores estándar robustos (HC3) ===\n")
## === Errores estándar robustos (HC3) ===
coeftest(modelo_loglin, vcov = vcovHC(modelo_loglin, type = "HC3"))
## 
## t test of coefficients:
## 
##              Estimate Std. Error  t value  Pr(>|t|)    
## (Intercept) 7.3339491  0.0594874 123.2858 < 2.2e-16 ***
## educacion   0.0361217  0.0031428  11.4936 < 2.2e-16 ***
## experiencia 0.0262551  0.0016359  16.0493 < 2.2e-16 ***
## antiguedad  0.0158101  0.0032919   4.8027 3.884e-06 ***
## sexo        0.0544612  0.0180717   3.0136  0.003051 ** 
## turno_noche 0.0435425  0.0190308   2.2880  0.023593 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Si la prueba Breusch-Pagan del punto 4 rechazó homocedasticidad (p < 0.05), los errores estándar robustos HC3 son necesarios para una inferencia válida. Se comparan los errores estándar OLS con los robustos: diferencias notables en los errores confirman la presencia de heteroscedasticidad.


10 Punto 9 — Interpretación detallada de coeficientes del modelo final

# Mostrar coeficientes del modelo Log-Lin
coef(modelo_loglin)
## (Intercept)   educacion experiencia  antiguedad        sexo turno_noche 
##  7.33394911  0.03612167  0.02625514  0.01581013  0.05446118  0.04354249
# Efectos marginales (en modelo log-lin los coeficientes son semi-elasticidades)
cat("=== Interpretación de coeficientes (semi-elasticidades) ===\n\n")
## === Interpretación de coeficientes (semi-elasticidades) ===
cat("Intercepto:", round(coef(modelo_loglin)[1], 4), "\n")
## Intercepto: 7.3339
cat("Cuando todos los regresores son cero, ln_salario =",
    round(coef(modelo_loglin)[1], 4), "\n\n")
## Cuando todos los regresores son cero, ln_salario = 7.3339
cat("Semi-elasticidad educacion:", round(coef(modelo_loglin)["educacion"], 4), "\n")
## Semi-elasticidad educacion: 0.0361
cat("Un año adicional de educación aumenta el salario en",
    round(coef(modelo_loglin)["educacion"]*100, 2), "%\n\n")
## Un año adicional de educación aumenta el salario en 3.61 %
cat("Semi-elasticidad experiencia:", round(coef(modelo_loglin)["experiencia"], 4), "\n")
## Semi-elasticidad experiencia: 0.0263
cat("Un año adicional de experiencia aumenta el salario en",
    round(coef(modelo_loglin)["experiencia"]*100, 2), "%\n\n")
## Un año adicional de experiencia aumenta el salario en 2.63 %
cat("Semi-elasticidad antiguedad:", round(coef(modelo_loglin)["antiguedad"], 4), "\n")
## Semi-elasticidad antiguedad: 0.0158
cat("Un año más en la empresa aumenta el salario en",
    round(coef(modelo_loglin)["antiguedad"]*100, 2), "%\n\n")
## Un año más en la empresa aumenta el salario en 1.58 %
cat("Coeficiente sexo:", round(coef(modelo_loglin)["sexo"], 4), "\n")
## Coeficiente sexo: 0.0545
cat("Los hombres ganan aproximadamente",
    round(coef(modelo_loglin)["sexo"]*100, 2), "% más que las mujeres\n\n")
## Los hombres ganan aproximadamente 5.45 % más que las mujeres
cat("Coeficiente turno_noche:", round(coef(modelo_loglin)["turno_noche"], 4), "\n")
## Coeficiente turno_noche: 0.0435
cat("El turno nocturno se asocia con un salario",
    round(coef(modelo_loglin)["turno_noche"]*100, 2), "% mayor al turno diurno\n")
## El turno nocturno se asocia con un salario 4.35 % mayor al turno diurno

11 Punto 10 — Intervalos de confianza al 5% y al 10%

# Intervalos de confianza al 95% (significancia 5%)
cat("=== Intervalos de confianza al 95% (alpha = 5%) ===\n")
## === Intervalos de confianza al 95% (alpha = 5%) ===
confint(modelo_loglin, level = 0.95)
##                   2.5 %     97.5 %
## (Intercept) 7.251257978 7.41664024
## educacion   0.030987108 0.04125624
## experiencia 0.023142284 0.02936799
## antiguedad  0.009242426 0.02237784
## sexo        0.020527132 0.08839523
## turno_noche 0.006605344 0.08047964
# Intervalos de confianza al 90% (significancia 10%)
cat("\n=== Intervalos de confianza al 90% (alpha = 10%) ===\n")
## 
## === Intervalos de confianza al 90% (alpha = 10%) ===
confint(modelo_loglin, level = 0.90)
##                    5 %       95 %
## (Intercept) 7.26469016 7.40320806
## educacion   0.03182116 0.04042219
## experiencia 0.02364793 0.02886234
## antiguedad  0.01030927 0.02131100
## sexo        0.02603931 0.08288305
## turno_noche 0.01260534 0.07447964
# Intervalos de confianza con errores robustos al 95%
cat("=== Intervalos robustos al 95% ===\n")
## === Intervalos robustos al 95% ===
coefci(modelo_loglin, vcov = vcovHC(modelo_loglin, type = "HC3"), level = 0.95)
##                   2.5 %     97.5 %
## (Intercept) 7.216367793 7.45153042
## educacion   0.029909780 0.04233357
## experiencia 0.023021647 0.02948862
## antiguedad  0.009303375 0.02231689
## sexo        0.018741020 0.09018134
## turno_noche 0.005926780 0.08115820
# Intervalos de confianza con errores robustos al 90%
cat("\n=== Intervalos robustos al 90% ===\n")
## 
## === Intervalos robustos al 90% ===
coefci(modelo_loglin, vcov = vcovHC(modelo_loglin, type = "HC3"), level = 0.90)
##                    5 %       95 %
## (Intercept) 7.23546747 7.43243075
## educacion   0.03091883 0.04132452
## experiencia 0.02354689 0.02896338
## antiguedad  0.01036032 0.02125995
## sexo        0.02454333 0.08437903
## turno_noche 0.01203700 0.07504798

Interpretación: Al 95% de confianza (alpha = 5%), el verdadero valor del parámetro poblacional se encuentra dentro del intervalo con alta probabilidad; es el criterio estándar en econometría. Al 90% (alpha = 10%) el intervalo es más estrecho y el criterio más permisivo. Un coeficiente cuyo intervalo no contenga el cero es estadísticamente significativo al nivel correspondiente. Los intervalos robustos son preferibles si se detectó heteroscedasticidad en el diagnóstico.


Taller elaborado con R Markdown. Base de datos: salarios_manufactura.csv (n = 150 observaciones, empresa manufacturera).