← Catálogo
· Capítulo 8
T08_CP02_mECO_Ordenado_Satisfaccion.R
# =============================================================================
# TEMA 08 — CP2: Satisfacción Laboral (Probit/Logit Ordenado)
# =============================================================================
# Manual de Microeconometría — Carlos de Anta Puig
# https://github.com/carlanta/MicroEconometrics Versión 1.0 — 2026
# INSTRUCCIONES: Session > Set Working Directory > To Source File Location
# =============================================================================
pausa <- function(msg="\n>>> Pulsa ENTER para continuar...") {
if (interactive()) readline(msg) else Sys.sleep(0.5)
}
if (!requireNamespace("MASS", quietly=TRUE)) install.packages("MASS", quiet=TRUE)
suppressPackageStartupMessages(library(MASS))
.get_script_dir <- function() {
args <- commandArgs(trailingOnly = FALSE)
for (a in args) {
if (startsWith(a, "--file=")) return(dirname(normalizePath(substring(a, 8))))
}
for (i in seq_len(sys.nframe())) {
ofile <- tryCatch(sys.frame(i)$ofile, error = function(e) NULL)
if (!is.null(ofile)) return(dirname(normalizePath(ofile)))
}
return(normalizePath("."))
}
.sdir <- .get_script_dir()
DATA_DIR <- normalizePath(file.path(.sdir, "..", "data"), mustWork=FALSE)
OUTPUT_DIR <- normalizePath(file.path(.sdir, "..", "output"), mustWork=FALSE)
if (!dir.exists(OUTPUT_DIR)) dir.create(OUTPUT_DIR, recursive=TRUE)
cat("\n================================================================\n")
cat(" CP02 — Satisfacción Laboral (Probit/Logit Ordenado)\n")
cat("================================================================\n\n")
load(file.path(DATA_DIR, "T08_CP02_satisfaccion_laboral.RData"))
satisf_lab$satisfaccion <- factor(satisf_lab$satisfaccion, ordered=TRUE)
cat("Dataset:", nrow(satisf_lab), "trabajadores\n")
print(table(satisf_lab$satisfaccion))
cat("\n")
# --- DESCRIPTIVOS ---
cat("--- ESTADÍSTICOS DESCRIPTIVOS ---\n\n")
vars <- c("salario","horas_semanales","autonomia","antiguedad")
labs <- c("Salario (miles)","Horas semanales","Autonomía (1-10)","Antigüedad")
cat(sprintf(" %-16s %8s %8s %8s %8s\n", "Variable","Media","D.E.","Mín.","Máx."))
cat(sprintf(" %s\n", paste(rep("-",54), collapse="")))
for (i in seq_along(vars)) {
x <- satisf_lab[[vars[i]]]
cat(sprintf(" %-16s %8.2f %8.2f %8.1f %8.1f\n", labs[i],
mean(x), sd(x), min(x), max(x)))
}
pausa()
# --- EDA ---
png(file.path(OUTPUT_DIR, "T08_CP02_eda.png"), width=1400, height=700, res=150)
par(mfrow=c(1,2), mar=c(4.5,4.5,2.5,0.5), cex.main=0.88)
barplot(table(satisf_lab$satisfaccion), col=gray(seq(0.2,0.8,length.out=5)),
border="white", main="Distribución satisfacción",
ylab="Frecuencia", names.arg=1:5)
boxplot(salario ~ satisfaccion, data=satisf_lab,
col=gray(seq(0.2,0.8,length.out=5)), border=gray(0.2),
main="Salario por nivel", ylab="Salario", xlab="Satisfacción")
dev.off()
cat("\n Gráfico: output/T08_CP02_eda.png\n")
cat(" Mayor satisfacción se asocia con mayor salario.\n")
pausa()
# --- PROBIT ORDENADO ---
cat("\n--- PROBIT ORDENADO ---\n\n")
op <- polr(satisfaccion ~ salario + horas_semanales + autonomia + antiguedad,
data=satisf_lab, method="probit")
s_op <- summary(op)
ct <- s_op$coefficients
cat(sprintf(" %-16s %9s %8s %8s %10s\n", "Variable","Coef.","EE","t","p-valor"))
cat(sprintf(" %s\n", paste(rep("-",56), collapse="")))
for (i in seq_len(nrow(ct))) {
pv <- 2*pnorm(-abs(ct[i,"t value"]))
sig <- ifelse(pv<0.001,"***",ifelse(pv<0.01,"**",ifelse(pv<0.05,"*"," ")))
cat(sprintf(" %-16s %9.4f %8.4f %8.2f %10.6f %s\n",
rownames(ct)[i], ct[i,1], ct[i,2], ct[i,3], pv, sig))
}
cat(sprintf("\n Umbrales: %s\n", paste(sprintf("%.3f", op$zeta), collapse=" | ")))
cat("\n INTERPRETACIÓN:\n")
cat(" Salario (+) y autonomía (+) aumentan la satisfacción.\n")
cat(" Horas (-) la reduce. Antigüedad tiene efecto menor.\n")
pausa()
# --- LOGIT ORDENADO ---
cat("\n--- LOGIT ORDENADO ---\n\n")
ol <- polr(satisfaccion ~ salario + horas_semanales + autonomia + antiguedad,
data=satisf_lab, method="logistic")
ct2 <- summary(ol)$coefficients
cat(sprintf(" %-16s %9s %8s %10s\n", "Variable","Coef.","EE","p-valor"))
cat(sprintf(" %s\n", paste(rep("-",48), collapse="")))
for (i in seq_len(nrow(ct2))) {
pv <- 2*pnorm(-abs(ct2[i,"t value"]))
cat(sprintf(" %-16s %9.4f %8.4f %10.6f\n",
rownames(ct2)[i], ct2[i,1], ct2[i,2], pv))
}
cat("\n Los coefs. Logit son ~1.7× los del Probit (ratio teórico ~1.8).\n")
cat(" Ambos modelos dan conclusiones cualitativas idénticas.\n")
pausa()
# --- CLASIFICACIÓN ---
cat("\n--- BONDAD DEL AJUSTE ---\n\n")
pred_op <- predict(op)
tab_op <- table(Obs=satisf_lab$satisfaccion, Pred=pred_op)
cat(" Tabla de clasificación (Probit):\n")
print(tab_op)
cat(sprintf("\n %% correcto: %.1f%%\n", 100*sum(diag(tab_op))/sum(tab_op)))
cat("\n================================================================\n")
cat(" RESUMEN CP02\n")
cat("================================================================\n")
cat(" Salario y autonomía son los predictores más fuertes.\n")
cat(" El signo de beta no siempre coincide con el AME en cat. intermedias.\n")
cat("================================================================\n")