Un gobierno local implementó un programa voluntario de capacitación laboral dirigido a personas que se encontraban buscando empleo. El programa ofrecía formación para el trabajo, orientación para la búsqueda de empleo y preparación para procesos de selección.
Con el propósito de evaluar los resultados del programa, se realizó seguimiento a 1.500 personas durante los seis meses posteriores al inicio de la intervención. Algunas participaron en el programa de capacitación y otras no.
A partir de los datos contenidos en el archivo capacitación.dta, queremos determinar si participar en el programa de capacitación aumentó la probabilidad de encontrar empleo seis meses después. La base contiene las siguientes variables:
capacitación: toma el valor 1 si la persona participó en el programa y 0 si no participó.
empleo: toma el valor 1 si la persona se encontraba empleada seis meses después y 0 en caso contrario.
educaciónn: nivel educativo alcanzado antes del inicio del programa: 1 = secundaria o menos 2 = técnico o tecnológico 3 = universitario
experiencia: años de experiencia laboral acumulados antes del inicio del programa.
Caracterización inicial (10%)
Los agrupo porque piden lo mismo: la proporción de cada categoría de una variable.
library(haven); library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
d <- read_dta("C:/Users/User/OneDrive/Imagenes1/Escritorio/univalle/9.SEMESTRE/EVALUCACION SOCIAMBIENTAL DE PROYETOS/capacitacion.dta")
# 1 y 3
prop.table(table(d$educacion)) #esta lo que hace es que cuanta cuantas veces estan repetidos los valores dentro de la columna y calcula la proporcion
##
## 1 2 3
## 0.512 0.292 0.196
prop.table(table(d$capacitacion))
##
## 0 1
## 0.6253333 0.3746667
Punto 1:De las 1.500 personas, el 51,2% cuenta con secundaria o menos (768 personas), el 29,2% tiene formación técnica o tecnológica (438 personas) y el 19,6% tiene formación universitaria (294 personas). La muestra está concentrada en niveles educativos bajos, lo cual es consistente con el perfil de una población que busca empleo activamente.
Punto 3:El 37,5% de la muestra (562 personas) participó en el programa de capacitación, mientras que el 62,5% (938 personas) no participó. Ambos grupos tienen un tamaño suficiente para realizar comparaciones estadísticas confiables.
# 2 (sd()
mean(d$experiencia); sd(d$experiencia)
## [1] 4.876
## [1] 2.231579
La media es el valor “central” de los años de experiencia.
La desviación estándar es qué tanto se alejan, en promedio, las personas de esa media. Una SD pequeña significa que todos tienen experiencia parecida.
Los individuos tienen, en promedio, 4,88 años de experiencia laboral previa al inicio del programa, con una desviación estándar de 2,23 años. Esto indica que la mayoría de las personas se concentra en un rango relativamente estrecho de experiencia (aproximadamente entre 2,6 y 7,1 años)
p <- tapply(d$empleo, d$capacitacion, mean); p
## 0 1
## 0.3592751 0.5943060
#Esta función se usa para aplicar una operación (como la media, la suma, etc.) a un vector numérico, dividiendo primero los datos en grupos.
#Recibe tres argumentos principales en tu código:
#d$empleo: Es la variable numérica a la que se le va a calcular el promedio (por ejemplo, la tasa de empleo, los ingresos o las horas trabajadas).
#d$capacitacion: Es la variable categórica o factor que define los grupos (por ejemplo: "Con capacitación" vs. "Sin capacitación", o niveles "Bajo", "Medio", "Alto").
#mean: Es la función que se va a aplicar, que en este caso es la media aritmética (promedio).
Seis meses después de iniciada la intervención, el 59,4% de quienes participaron en el programa se encontraban empleados, frente a un 35,9% entre quienes no participaron. Se observa una diferencia notable en las tasas de empleo entre ambos grupos.
delta <- p["1"] - p["0"]; delta
## 1
## 0.235031
#Esta línea de código sirve para calcular la diferencia entre los promedios de los dos grupos y mostrar el resultado en la pantalla.
La diferencia estimada es δ = 0,2350, es decir, quienes participaron en el programa presentan una probabilidad de empleo 23,5 puntos porcentuales mayor que quienes no participaron (intervalo de confianza al 95%: [0,184; 0,286], estadísticamente significativo).
Sin embargo, esta diferencia no puede interpretarse directamente como el efecto causal del programa. Al tratarse de un programa de participación voluntaria, es probable que quienes decidieron inscribirse difieran sistemáticamente de quienes no lo hicieron en características previas como el nivel educativo que también influyen en la probabilidad de encontrar empleo. En ese caso, la diferencia observada mezclaría el efecto real del programa con un sesgo de selección: parte de la brecha se explica porque los participantes ya tenían, de entrada, mayor probabilidad de emplearse, independientemente de haber tomado o no la capacitación. Por tanto, δ debe entenderse como una simple asociación estadística, y su interpretación causal solo sería válida si los grupos de tratados y no tratados fueran comparables en sus características previas relevantes, algo que se explorará en los siguientes puntos del taller.
#PUNTO_6: Regresión de participación sobre educación y experiencia
# ============================================
# Convertimos educacion en factor para que R la trate como variable categórica
# (crea automáticamente las dummies Educ2 y Educ3, usando 1=secundaria o menos como referencia)
d$educacion <- as.factor(d$educacion)
m6 <- lm(capacitacion ~ educacion + experiencia, data = d)
summary(m6)
##
## Call:
## lm(formula = capacitacion ~ educacion + experiencia, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.6873 -0.2111 -0.2093 0.3176 0.7925
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.2074859 0.0295185 7.029 3.15e-12 ***
## educacion2 0.2468566 0.0268322 9.200 < 2e-16 ***
## educacion3 0.4739732 0.0306953 15.441 < 2e-16 ***
## experiencia 0.0004512 0.0051868 0.087 0.931
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4474 on 1496 degrees of freedom
## Multiple R-squared: 0.1478, Adjusted R-squared: 0.1461
## F-statistic: 86.47 on 3 and 1496 DF, p-value: < 2.2e-16
# Esta regresión estima si la probabilidad de participar en el programa (capacitacion)
# está relacionada con el nivel educativo (tratado como categórica) y con la experiencia previa.
# El coeficiente de "educacion2" mide la diferencia de probabilidad de participar
# entre técnico/tecnológico y secundaria o menos (la categoría de referencia).
# El coeficiente de "educacion3" mide lo mismo para universitario vs. secundaria o menos.
# El coeficiente de "experiencia" mide el cambio en la probabilidad de participar
# por cada año adicional de experiencia.
# Errores estándar robustos (opcional pero recomendable en un modelo de probabilidad lineal)
library(lmtest); library(sandwich)
## Cargando paquete requerido: zoo
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
coeftest(m6, vcov = vcovHC(m6, type = "HC1"))
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.20748588 0.02888448 7.1833 1.069e-12 ***
## educacion2 0.24685659 0.02803415 8.8056 < 2.2e-16 ***
## educacion3 0.47397316 0.03089711 15.3404 < 2.2e-16 ***
## experiencia 0.00045117 0.00517618 0.0872 0.9306
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Intercepto (0,2075): es la probabilidad estimada de participar en el programa para una persona de la categoría de referencia, secundaria o menos, con 0 años de experiencia. Es decir, un 20,75% de probabilidad de partida.
educacion2 (0,2469): comparando con la referencia (secundaria o menos), tener educación técnica o tecnológica aumenta la probabilidad de participar en 24,69 puntos porcentuales. Sumando al intercepto: 0,2075 + 0,2469 = 0,4544 → 45,4% de probabilidad de participar entre los técnicos.
educacion3 (0,4740): tener educación universitaria aumenta la probabilidad de participar en 47,40 puntos porcentuales frente a secundaria o menos. Sumando: 0,2075 + 0,4740 = 0,6815 → 68,2% de probabilidad de participar entre los universitarios.
experiencia (0,00045): por cada año adicional de experiencia laboral, la probabilidad de participar cambia en apenas 0,045 puntos porcentuales un efecto prácticamente nulo.
Los coeficientes de educacion2 y educacion3 son altamente significativos (p < 0,001 en ambos, con y sin errores robustos). El resultado es prácticamente idéntico usando errores estándar convencionales o robustos (HC1), lo que indica que no hay problemas graves de heterocedasticidad que estén distorsionando las conclusiones.
El coeficiente de experiencia no es significativo en absoluto: p = 0,931 (convencional) y p = 0,9306 (robusto). No hay evidencia de ninguna relación entre experiencia y participación.
El modelo en conjunto es significativo (F = 86,47; p < 0,001), pero esto se debe casi enteramente a educación, no a experiencia. El R² = 0,148 indica que el nivel educativo y la experiencia explican en conjunto cerca del 15% de la variación en la decisión de participar — un ajuste modesto pero razonable, ya que la decisión de inscribirse también depende de factores no observados (motivación, disponibilidad de tiempo, etc.).
Se estimó una regresión de la participación en el programa de capacitación sobre el nivel educativo (tratado como variable categórica, con secundaria o menos como categoría de referencia) y los años de experiencia laboral previa. Los resultados, robustos a heterocedasticidad, muestran que la probabilidad de participar aumenta de forma marcada y significativa con el nivel educativo: las personas con formación técnica o tecnológica tienen una probabilidad de participación 24,7 puntos porcentuales mayor que quienes tienen secundaria o menos, y las personas con formación universitaria presentan una probabilidad 47,4 puntos porcentuales mayor (ambos coeficientes significativos al 1%). En contraste, la experiencia laboral previa no muestra ninguna relación significativa con la decisión de participar (coeficiente de 0,00045, p = 0,93). Esto sugiere que la inscripción al programa no fue aleatoria respecto al nivel educativo: las personas con mayor formación académica tuvieron una probabilidad considerablemente mayor de inscribirse, mientras que la experiencia laboral no incidió en dicha decisión.
library(dagitty); library(ggdag)
##
## Adjuntando el paquete: 'ggdag'
## The following object is masked from 'package:stats':
##
## filter
# Regresión auxiliar para confirmar que experiencia también afecta al empleo
# (esto sustenta la flecha exper -> empleo en el DAG)
m7_aux <- lm(empleo ~ capacitacion + educacion + experiencia, data = d)
summary(m7_aux)
##
## Call:
## lm(formula = empleo ~ capacitacion + educacion + experiencia,
## data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.7728 -0.3871 -0.2796 0.4836 0.7619
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.217313 0.032014 6.788 1.63e-11 ***
## capacitacion 0.174417 0.027588 6.322 3.40e-10 ***
## educacion2 0.086701 0.029430 2.946 0.003269 **
## educacion3 0.194120 0.035268 5.504 4.36e-08 ***
## experiencia 0.020777 0.005535 3.754 0.000181 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4774 on 1495 degrees of freedom
## Multiple R-squared: 0.08102, Adjusted R-squared: 0.07856
## F-statistic: 32.95 on 4 and 1495 DF, p-value: < 2.2e-16
# Construcción del DAG
dag <- dagitty("dag {
educacion -> capacitacion
educacion -> empleo
capacitacion -> empleo
experiencia -> empleo
}")
coordinates(dag) <- list(
x = c(educacion = 0, experiencia = 0, capacitacion = 1, empleo = 2),
y = c(educacion = 1, experiencia = -1, capacitacion = 0, empleo = 0)
)
library(ggplot2)
# Graficar el DAG
ggdag(dag) + theme_dag() + labs(title = "DAG: Capacitación y empleo")
# Identificar todos los caminos entre capacitacion y empleo
paths(dag, from = "capacitacion", to = "empleo")
## $paths
## [1] "capacitacion -> empleo" "capacitacion <- educacion -> empleo"
##
## $open
## [1] TRUE TRUE
# Debe mostrar dos caminos: el directo (capacitacion -> empleo)
# y el de puerta trasera (capacitacion <- educacion -> empleo)
# Identificar el conjunto de variables que hay que controlar para bloquear la puerta trasera
adjustmentSets(dag, exposure = "capacitacion", outcome = "empleo")
## { educacion }
# Debe devolver { educacion } como conjunto mínimo suficiente
A partir de la evidencia de los puntos 6 y 7, se construyó un DAG que representa las relaciones causales entre el nivel educativo, la experiencia laboral, la participación en el programa de capacitación y el empleo. El análisis con dagitty identificó dos caminos entre la participación y el empleo: el camino causal directo (capacitacion → empleo) y un camino de puerta trasera (capacitacion ← educacion → empleo), el cual se encuentra abierto. Esto confirma que el nivel educativo actúa como variable confusora: determina simultáneamente la probabilidad de participar en el programa (punto 6) y la probabilidad de conseguir empleo, generando una asociación espuria entre ambas variables que no refleja necesariamente un efecto causal del programa. La función adjustmentSets() confirmó que basta con controlar por el nivel educativo ({educacion}) para bloquear dicho camino y obtener una estimación causal válida del efecto del programa. Por su parte, la experiencia laboral, aunque también afecta significativamente la probabilidad de empleo (coeficiente de 0,021, p<0,001), no forma parte de ningún camino de puerta trasera, dado que no está relacionada con la decisión de participar en el programa; por lo tanto, no es indispensable controlar por ella para identificar el efecto causal, aunque su inclusión en los modelos de regresión puede mejorar la precisión de las estimaciones al explicar parte de la variabilidad del empleo.
# PUNTO_8: CATE(x) - efecto condicional por nivel educativo
# ============================================
# tapply() ahora agrupa por DOS variables a la vez: primero por
# capacitacion (D) y luego por educacion (X). El resultado es una
# tabla (matriz) con la proporcion de empleados para cada
# combinacion D x X.
p_x <- tapply(d$empleo, list(d$capacitacion, d$educacion), mean)
p_x
## 1 2 3
## 0 0.3014827 0.4201681 0.5806452
## 1 0.5465839 0.5700000 0.6567164
# Filas = capacitacion (0/1), columnas = educacion (1,2,3)
# CATE(x) = P(empleo=1|D=1,X=x) - P(empleo=1|D=0,X=x)
CATE <- p_x["1", ] - p_x["0", ]
CATE
## 1 2 3
## 0.24510115 0.14983193 0.07607126
El efecto del programa es positivo en los 3 niveles educativos,pero NO es igual: es mayor para personas con secundaria o menos (~0.245) y decrece a medida que sube el nivel educativo (~0.150 en tecnico, ~0.076 en universitario). Esto indica HETEROGENEIDAD en el efecto de tratamiento: el programa beneficia mas a quienes tienen menor nivel educativo, probablemente porque tienen menos herramientas propias (redes de contacto, habilidades certificadas) para buscar empleo por su cuenta, por lo que la orientacion laboral y la capacitacion les aportan relativamente mas.
# PUNTO_9: P(X=x) y ATE por estratificacion
# ============================================
# Proporcion de individuos en cada nivel educativo
Px <- prop.table(table(d$educacion))
Px
##
## 1 2 3
## 0.512 0.292 0.196
# ATE = suma ponderada de los CATE(x), usando P(X=x) como ponderador
ATE_estrat <- sum(CATE * Px)
ATE_estrat
## [1] 0.1841527
El ATE por estratificacion (~0.184) es un promedio ponderado de los tres CATE(x), donde el peso de cada grupo es su frecuencia en la poblacion. Es decir: no todas las personas pesan igual en el promedio, sino segun que tan comun es su nivel educativo. Este valor (0.184) representa el efecto causal promedio del programa sobre la probabilidad de empleo, YA CONTROLADO por nivel educativo (porque cada CATE(x) se calculo dentro de un mismo estrato educativo, bloqueando el camino de puerta trasera identificado en el punto 7).
# PUNTO_10: Regresion simple sin controles
# ============================================
m10 <- lm(empleo ~ capacitacion, data = d)
summary(m10)
##
## Call:
## lm(formula = empleo ~ capacitacion, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.5943 -0.3593 -0.3593 0.4057 0.6407
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.35928 0.01581 22.718 <2e-16 ***
## capacitacion 0.23503 0.02584 9.097 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4844 on 1498 degrees of freedom
## Multiple R-squared: 0.05235, Adjusted R-squared: 0.05172
## F-statistic: 82.75 on 1 and 1498 DF, p-value: < 2.2e-16
El coeficiente de ‘capacitacion’ (~0.235) es MATEMATICAMENTE IDENTICO al delta del punto 5 (diferencia simple de proporciones), porque una regresion de Y sobre una unica variable binaria D reproduce exactamente esa diferencia de medias. Al compararlo con el ATE_estrat (~0.184), vemos que el coeficiente simple SOBREESTIMA el efecto en aprox. 5 puntos porcentuales. La razon es el sesgo de confusion (confounding): la educacion afecta tanto la probabilidad de participar en el programa (punto 6) como la probabilidad de emplearse, y al no controlar por ella, el coeficiente de D absorbe parte de ese efecto educativo. Por lo tanto, delta_hat de esta regresion NO es un buen estimador del efecto causal del programa.
# PUNTO_11: Regresion con controles aditivos (sin interaccion)
# ============================================
d$educacion <- as.factor(d$educacion) # por si no quedo como factor
m11 <- lm(empleo ~ capacitacion + educacion, data = d)
summary(m11)
##
## Call:
## lm(formula = empleo ~ capacitacion + educacion, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.6879 -0.4088 -0.3162 0.4868 0.6837
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.31625 0.01825 17.326 < 2e-16 ***
## capacitacion 0.17465 0.02771 6.303 3.83e-10 ***
## educacion2 0.09258 0.02952 3.137 0.00174 **
## educacion3 0.19700 0.03541 5.563 3.14e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4795 on 1496 degrees of freedom
## Multiple R-squared: 0.07235, Adjusted R-squared: 0.07049
## F-statistic: 38.89 on 3 and 1496 DF, p-value: < 2.2e-16
Al controlar por nivel educativo (dummies educacion2 y educacion3, con secundaria o menos como referencia), el coeficiente de ‘capacitacion’ baja a ~0.175, mucho mas cercano al ATE por estratificacion (~0.184) que el de la regresion simple del punto 10 (~0.235). Esto confirma que controlar por educacion BLOQUEA el camino de puerta trasera identificado en el DAG del punto 7, acercando la estimacion al verdadero efecto causal. La pequena diferencia restante (~1 p.p.) frente al ATE de estratificacion se debe a que este modelo IMPONE un mismo efecto de D para los tres niveles educativos (no hay interaccion), mientras que el ATE del punto 9 SI permite que el efecto varie por grupo (heterogeneidad vista en el punto 8). Es decir, este modelo estima un promedio ponderado implicito, que no pondera exactamente igual que P(X=x).
# PUNTO_12: Regresion saturada (con interaccion D x educacion)
# ============================================
m12 <- lm(empleo ~ capacitacion * educacion, data = d)
summary(m12)
##
## Call:
## lm(formula = empleo ~ capacitacion * educacion, data = d)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.6567 -0.4202 -0.3015 0.4300 0.6985
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.30148 0.01944 15.509 < 2e-16 ***
## capacitacion 0.24510 0.04246 5.773 9.46e-09 ***
## educacion2 0.11869 0.03663 3.240 0.00122 **
## educacion3 0.27916 0.05333 5.234 1.89e-07 ***
## capacitacion:educacion2 -0.09527 0.06256 -1.523 0.12799
## capacitacion:educacion3 -0.16903 0.07355 -2.298 0.02170 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4789 on 1494 degrees of freedom
## Multiple R-squared: 0.0759, Adjusted R-squared: 0.07281
## F-statistic: 24.54 on 5 and 1494 DF, p-value: < 2.2e-16
# Extraemos los coeficientes para calcular cada CATE(x) a mano
coefs <- coef(m12)
coefs
## (Intercept) capacitacion educacion2
## 0.30148270 0.24510115 0.11868537
## educacion3 capacitacion:educacion2 capacitacion:educacion3
## 0.27916246 -0.09526922 -0.16902989
delta_hat <- coefs["capacitacion"] # CATE(1)
gamma1_hat <- coefs["capacitacion:educacion2"] # ajuste grupo 2
gamma2_hat <- coefs["capacitacion:educacion3"] # ajuste grupo 3
CATE_1 <- delta_hat # a. secundaria o menos
CATE_2 <- delta_hat + gamma1_hat # b. tecnico/tecnologico
CATE_3 <- delta_hat + gamma2_hat # c. universitario
CATE_1; CATE_2; CATE_3
## capacitacion
## 0.2451011
## capacitacion
## 0.1498319
## capacitacion
## 0.07607126
# Comparacion directa con el punto 8/9 (deben coincidir)
data.frame(
educacion = c(1, 2, 3),
CATE_regresion = c(CATE_1, CATE_2, CATE_3),
CATE_estratificacion = as.numeric(CATE)
)
## educacion CATE_regresion CATE_estratificacion
## 1 1 0.24510115 0.24510115
## 2 2 0.14983193 0.14983193
## 3 3 0.07607126 0.07607126
CATE(1) = delta_hat = 0.245 -> efecto para secundaria o menos
CATE(2) = delta_hat + gamma1_hat = 0.245 - 0.095 = 0.150
CATE(3) = delta_hat + gamma2_hat = 0.245 - 0.169 = 0.076
Estos tres valores son IDENTICOS a los CATE(x) calculados por estratificacion en el punto 8. Esto no es coincidencia: una regresion con la variable de control totalmente interactuada con D (modelo “saturado”) es matematicamente equivalente a estratificar “a mano”. La regresion del punto 11 (sin interaccion) es una version restringida que fuerza un unico efecto promedio; la de este punto 12 es la version flexible que SI respeta la heterogeneidad real de los datos. Los signos negativos de gamma1_hat y gamma2_hat confirman que el efecto del programa se ATENUA a medida que aumenta el nivel educativo, tal como se observo en el punto 8.