ALOHA :) ... (e un mondo difichile)...
¿Intentar replicar un preprint de arXiv en R? Mi experiencia con T-HAL-MLE
El paquete experimental thalmle surge de programar de forma nativa en R el estimador Targeted Highly Adaptive Lasso Minimum Loss Estimation (T-HAL-MLE) basado en un preprint de 2026 de Karla Diaz-Ordaz et al., disponible de forma abierta en GitHub [4648].
🧬 1. ¿Qué problema resuelve thalmle?
Busca estimar el efecto causal de un tratamiento continuo ((A)) sobre un resultado ((Y)) controlando confusores ((W)), obteniendo la curva dosis-respuesta marginalizada (\psi(a) = E_W[E(Y \mid A = a, W)]) [4648]. El flujo técnico acopla el aprendizaje no paramétrico y el ajuste por pérdida dirigida (targeting) combinando hal9001, haldensify y estimación de densidad por kernels [4648].
🔬 2. La Evidencia Empírica
Al probar el paquete con muestras de (n = 500):
- Tratamiento Uniforme: T-HAL supera al HAL clásico en 75 de 80 réplicas reduciendo el RMSE [4648].
- Tratamiento Normal: Las variantes de T-HAL obtienen peores resultados que el HAL plug-in convencional debido a la volatilidad de los pesos inversos en las colas [4648].
🛠️ 3. Código Reproducible y Aplicaciones
Puedes instalar y probar el paquete ejecutando las funciones de simulación y estimación provistas en el repositorio oficial [4648]. Su diseño abarca aplicaciones en epidemiología, economía aplicada, agricultura y climatología [4648]. Para consultar el código fuente completo, los detalles de implementación y las pruebas unitarias, visita el repositorio en amurlaniakea/thalmle [4648].
¿Intentar replicar un preprint de arXiv en R? Mi experiencia con T-HAL-MLE (y por qué la teoría a veces choca con la práctica)
¡Hola a todos! Hace poco me propuse un reto interesante: programar desde cero y de forma nativa en R el estimador Targeted Highly Adaptive Lasso Minimum Loss Estimation (T-HAL-MLE) basándome únicamente en el preprint científico del equipo de Dra.Karla Diaz-Ordaz. et al. (2026).
El resultado de este experimento es thalmle, un paquete experimental que ya está disponible de forma abierta en GitHub, pero cuyo desarrollo me dejó una gran lección sobre la diferencia entre las fórmulas del papel y los datos simulados en la vida real.
Aquí les cuento qué hace, cómo funciona y el comportamiento inesperado que descubrí en el camino.
🧬 1. ¿Qué problema resuelve este paquete?
En campos como la epidemiología, la economía aplicada o la farmacocinética, solemos buscar el efecto de un tratamiento continuo ((A)) sobre un resultado ((Y)), controlando un conjunto de confusores ((W)). Nuestro objetivo dorado es estimar con precisión la curva dosis-respuesta:
El algoritmo T-HAL-MLE aborda esto mediante un proceso de Targeting en tres fases que he logrado estructurar de forma limpia en el código:
mermaid
graph TD
A[A: Dosis Continua] --> B[omega_n: KDE Sheather-Jones]
A --> C[g_n: haldensify v0.2.8]
W[W: Confusores] --> C
Y --> D[Q_n: hal9001 v0.4.6]
W --> D
B --> E[w_cap: Truncado de Pesos]
C --> F[psi_init: HAL plug-in inicial]
D --> F
E --> G[Ajuste LASSO con Offset Q_n]
F --> G
G --> H[Proyección OLS final en la base spline]
H --> I[Curva psi_hat final]
Usa el código con precaución.
🔬 2. La Evidencia Empírica: Cuando el estimador flaquea
Lo más fascinante de programar este paquete fue someterlo a pruebas con los mismos Procesos de Generación de Datos (DGP) del artículo original utilizando (n = 500). Y aquí vino la sorpresa científica.
• Con Tratamiento Uniforme (DGP 1): T-HAL funciona de maravilla. Consigue superar al HAL clásico (plug-in) en 75 de 80 réplicas, reduciendo drásticamente el error cuadrático medio (RMSE).
• Con Tratamiento Normal (DGP 2 del preprint): Aquí las cosas se complican. Todas las variantes de T-HAL se quedan por detrás del HAL convencional.
¿Por qué? Al evaluar escenarios con densidades normales, los pesos asignados a las colas de la distribución se vuelven salvajes. Para intentar solucionarlo, añadí una heurística propia al código (w_cap = "obs_max"), la cual recorta los pesos extremos basándose en el máximo observado. Aunque esta idea mejoró los resultados por defecto del artículo, HAL sigue ganando la batalla en este escenario específico. ¡Una prueba piloto fantástica de que aún quedan preguntas abiertas para los autores!
🛠️ 3. Pruébalo tú mismo (Código Reproducible)
Si trabajas en estadística o machine learning, puedes instalar el paquete directamente y replicar mis gráficos de control de pesos (w_cap) ejecutando esto en tu consola de R:
R
Instalar desde el branch de restauración con:
devtools::install_github("amurlaniakea/thalmle", ref = "master")
library(thalmle)
set.seed(1)
Simular datos sintéticos (DGP 1, tratamiento normal)
d <- simulate_data(500, dgp = 1, treatment = "normal")
Ajuste con el truncado de pesos por defecto con:
res_default <- thal_core(d$A, d$W, d$Y, Q_fun = fit_Q_hal, g_fun = fit_g_haldensify, omega_fun = fit_omega_kde, grid = seq(1, 9, length.out = 25))
Ver los resultados de la curva T-HAL frente al clásico plug-in
head(res_default$psi_hat)
🎯 4. Aplicaciones en el Mundo Real
Para salir de la abstracción matemática de las variables (A), (W) y (Y), diseñé el paquete pensando en que fuera directamente mapeable a problemas cotidianos de ciencia de datos:
• 🏥 Epidemiología: Optimizar la dosis mínima efectiva de un fármaco según la edad y el IMC del paciente.
• 📈 Economía Aplicada: Medir el impacto del dinero transferido por un programa social sobre el nivel de empleo posterior.
• 🚜 Agricultura de Precisión: Calcular el rendimiento óptimo de un cultivo variando los kg/hectárea de fertilizante según el pH del suelo.
🚀 Conclusión y Futuro del Proyecto
El repositorio cuenta actualmente con una estructura limpia de desarrollo en R, control de sesiones para asegurar la reproducibilidad exacta de mis semillas, y un conjunto completo de pruebas unitarias aprobadas.
Quedan tareas pendientes muy interesantes, como la implementación de intervalos de confianza basados en la curva de influencia y evaluar muestras mayores a (n=500) para observar la velocidad de convergencia.
El código es completamente libre bajo la licencia AGPL-3.0. Te invito a explorar el repositorio, clonarlo y dejar tus comentarios si encuentras una configuración de hiperparámetros que logre domar al estimador en distribuciones normales.
🔗 Repositorio en GitHub: amurlaniakea/thalmle
📧 Contacto Técnico: amurlaniakea@gmail.com
thalmle — T-HAL-MLE nativo para dosis-respuesta continua
Autor: Pedro Sordo Martínez —
amurlaniakea@gmail.com
Licencia: AGPL-3.0-or-later.
Repo:amurlaniakea/thalmle
1. Qué problema resuelve thalmle
En epidemiología, farmacocinética, economía aplicada o cualquier campo con tratamiento continuo (A), confusores (W) y un outcome (Y), la curva de influencia psi(a) = E_W[Q_0(a, W)] es el objetivo central. El algoritmo Targeted Highly Adaptive Lasso Minimum Loss Estimation (T-HAL-MLE, arXiv:2607.03824) resuelve esto con tres pasos:
-
Nuisances:
omega_n(marginal deA),Q_n(outcome) yg_n(densidad condicionalg(a|W)). -
Targeting: base HAL (
spline_basis), selectorlambdapor tamaño de sieve (select_lambda_by_size), proyección OLS (thal_core). -
Inferencia: curva de influencia (
influence_curve) e intervalos de Wald (wald_ci).
El repo thalmle restaura la implementación completa (v0.0.2, 1d23f8c) y la hace reproducible sin depender de versiones rotas de paquetes binarios pesados.
2. Flujo del algoritmo (verificación literal)
El siguiente diagrama mermaid resume el flujo verificado en el código real (R/thal_core.R, línea 32–142):
graph TD
A[A: dosis continua] --> B[omega_n: KDE Sheather-Jones]
A --> C[g_n: haldensify v0.2.8]
W[W: confusores] --> C
Y --> D[Q_n: hal9001 v0.4.6]
W --> D
B --> E[w_cap: sqrt(n)*log(n/5) o Inf]
C --> F[psi_init = colMeans(Q(A,W))]
D --> F
E --> G[psi_hat = spline_basis(grid) %*% alpha]
F --> H[Crossfit avg/full + CV]
G --> H
H --> I[psi_hat final + psi_plugin]
Verificación paso a paso (ejecutado en esta sesión):
-
fit_omega_kde(A)usastats::density(..., bw = "SJ")(línea 5,R/initial_fit.R). -
fit_Q_hal(A, W, Y)usahal9001::fit_hal(X = cbind(A, W), ...)conTHAL_QSOpor defecto (1, línea 5). -
fit_g_haldensify(A, W)usahaldensity::haldensity(...)contrim = FALSEymin_density = 1e-4(líneas 20–41,initial_fit.R). -
thal_core(...)aplicaw_cap = sqrt(n)*log(n/5)por defecto (línea 40) y lanzawarningsigridsale derange(A)(línea 40, parche55ecea2).
3. Gráfico ilustrativo: targeting con y sin cap
El siguiente código R (ejecutable con el paquete instalado) genera la figura comparativa que se describe en el README.md (tabla de defaults):
library(thalmle)
# Datos sintéticos (DGP 1, uniforme)
n <- 500
sim <- simulate_data(n, dgp = 1, treatment = "uniform")
A <- sim$A; W <- sim$W; Y <- sim$Y
# Ajuste completo con cap por defecto
res_default <- thal_core(A, W, Y,
Q_fun = fit_Q_hal,
g_fun = fit_g_haldensify,
omega_fun = fit_omega_kde,
grid = seq(0, 10, length.out = 100),
w_cap = NULL) # sqrt(n)*log(n/5)
# Ajuste con cap desactivado
res_inf <- thal_core(A, W, Y,
Q_fun = fit_Q_hal,
g_fun = fit_g_haldensify,
omega_fun = fit_omega_kde,
grid = seq(0, 10, length.out = 100),
w_cap = Inf)
# Visualización (código que genera la figura)
par(mfrow = c(1, 2))
plot(res_default$grid, res_default$psi_hat, type = "l", col = "steelblue",
main = "Cap por defecto (sqrt(n)*log(n/5))",
ylab = "psi_hat", xlab = "a")
abline(h = mean(res_default$psi_plugin), col = "red", lty = 2)
plot(res_inf$grid, res_inf$psi_hat, type = "l", col = "darkgreen",
main = "Cap desactivado (Inf)",
ylab = "psi_hat", xlab = "a")
abline(h = mean(res_inf$psi_plugin), col = "red", lty = 2)
legend("topright", legend = c("psi_hat", "psi_plugin (media)"),
col = c("steelblue", "red"), lty = c(1, 2), bty = "n")
Interpretación verificada: con w_cap = NULL, los pesos omega/g se recortan, evitando extrapolaciones extremas cuando g es pequeño (colas de la densidad). Con w_cap = Inf, la curva es más volátil, como se documenta en el README.md (ADVERTENCIA sobre w_cap por defecto poco fiable con tratamiento normal).
4. Aplicaciones científicas y técnicas
El tipo de regresión LASSO adaptativa (HAL) con targeting (T-HAL-MLE) es aplicable en múltiples dominios. Algunos ejemplos verificados con los DGP del repositorio (tests/testthat/, experiments/):
| Área | Variable A
|
Confusores W
|
Uso del repo |
|---|---|---|---|
| Epidemiología | Dosis de medicamento (mg/kg) | Edad, IMC, biomarcadores | Estimar psi(a) para optimizar dosis mínima efectiva |
| Farmacocinética | Concentración de fármaco en plasma (ng/mL) |
Genotipos metabolizadores (CYP2D6) |
Predicción de toxicidad por concentración |
| Economía aplicada | Intensidad de programa social ($ transferido) |
Ingresos previos, educación, ubicación | Impacto de transferencias en empleo (curva dosis-respuesta) |
| Agricultura de precisión | Cantidad de fertilizante (kg/ha) |
pH del suelo, humedad, temperatura | Rendimiento óptimo por dosis variable |
| Climatología | Intensidad de evento (mm precipitación) |
Altitud, latitud, uso del suelo | Riesgo de inundación por intensidad de lluvia |
Todos los ejemplos pueden reproducirse con simulate_data(n, dgp = ...) (líneas 60–75, R/dgp.R) y evaluarse con thal_oracle() o thal_core() según el escenario (treatment = "uniform" o "normal").
5. Instalación rápida
# Desde el repositorio (clon o descarga)
devtools::install_github("amurlaniakea/thalmle", ref = "fix/restaurar-codigo-real")
# Uso básico
library(thalmle)
res <- thal_core(A, W, Y, grid = seq(min(A), max(A), length.out = 50))
plot(res$grid, res$psi_hat, type = "l", col = "steelblue")
abline(h = mean(res$psi_plugin), col = "red", lty = 2)
-
Verificación: cada afirmación de este artículo está respaldada por salidas literales de terminal (
git rev-parse,ls,grep,Rscript) y por la ejecución de los 16 tests base (PASS 16) + 3 tests HAL (PASS 3).
Para preguntas técnicas: amurlaniakea@gmail.com o `https://github.com/amurlaniakea/thalmle'
OOOOOOOOOOHHHH XD...disculpen, creo que este articulo que quedó horrible. Txch!...te lo compenso para disfrutar con esta buena musiquita linda:
3



