MathJax

Correspondiente a la sesión del viernes, 13 de junio de 2025

MathJax es una biblioteca de JavaScript que permite mostrar notación matemática escrita en LaTeX, MathML o AsciiMath directamente en páginas web. Fue creada para que las expresiones matemáticas se vean bien, sean accesibles y funcionen en todos los navegadores modernos sin necesidad de software adicional.

En Quarto, MathJax se utiliza automáticamente para renderizar fórmulas matemáticas cuando el formato de salida es HTML o Reveal.js. No tienes que instalar nada extra ni importar manualmente

Formato de ecuaciones con MathJax

Para representar ecuaciones en la misma línea de texto, se deben escribir dentro de un par de signos ‘$’. Ejemplo:

Este texto contiene la siguiente ecuación: $E = mc^2$

genera:

  • Este texto contiene la siguiente ecuación: \(E = mc^2\)

Para visualizar las ecuaciones en una siguiente línea, centrado, van dos pares del signo ‘$’. Ejemplo:

$$
E = mc^2
$$

genera:

\[ E = mc^2 \]

Elementos de MathJax

Fracciones

$$
\frac{1}{2}
$$

\[ \frac{1}{2} \]

Subíndice y exponenciales

$$
Y = X_1 + X_2
$$

\[ Y = X_1 + X_2 \]

$$
a^2 + b^2 = c^2
$$

\[ a^2 + b^2 = c^2 \]

Raíz cuadrada

$$
\sqrt{p}
$$

\[ \sqrt{p} \]

$$
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
$$

\[ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \]

Sumatoria

$$
\sum_{i = 1}^{n}{(\bar{x} - x_i)^2}
$$

\[ \sum_{i = 1}^{n}{(\bar{x} - x_i)^2} \]

Modelo lineal

$$
Y \sim X\beta_0 + X\beta_1 + \epsilon
$$

\[ Y \sim X\beta_0 + X\beta_1 + \epsilon \]

y como todo en R… ya casi todo se puede automatizar

Equatiomatic

if (!require("pacman")) install.packages("pacman") # solo la primera vez
pacman::p_load(lme4,
               reghelper,
               haven,
               stargazer,
               ggplot2, # gráficos
               texreg, # tablas de regresion (screenreg)
               dplyr, # manipulacion de datos
               equatiomatic) # paquetes a cargar

mlm = read_dta("http://www.stata-press.com/data/mlmus3/hsb.dta")

mlm = mlm %>% 
  select(minority,female,ses,mathach,size,sector,pracad,disclim,himinty,mnses,schoolid) %>%
  as.data.frame()
reg_lineal<- lm(mathach~ses+female+sector+minority, data=mlm)

extract_eq(reg_lineal)

\[ \operatorname{mathach} = \alpha + \beta_{1}(\operatorname{ses}) + \beta_{2}(\operatorname{female}) + \beta_{3}(\operatorname{sector}) + \beta_{4}(\operatorname{minority}) + \epsilon \]

Sin embargo, aún no disponible para estimaciones con lmer

results_3 = lmer(mathach ~ 1 + ses + female + sector + mnses + (1 | schoolid), data = mlm)
extract_eq(results_3)

\[ \begin{aligned} \operatorname{mathach}_{i} &\sim N \left(\alpha_{j[i]} + \beta_{1}(\operatorname{ses}) + \beta_{2}(\operatorname{female}), \sigma^2 \right) \\ \alpha_{j} &\sim N \left(\gamma_{0}^{\alpha} + \gamma_{1}^{\alpha}(\operatorname{sector}) + \gamma_{2}^{\alpha}(\operatorname{mnses}), \sigma^2_{\alpha_{j}} \right) \text{, for schoolid j = 1,} \dots \text{,J} \end{aligned} \]

Por lo tanto, se deben hacer manualmente:

$$
y_{ij} = \gamma_{00} + \gamma_{01} \text{ses} + \gamma_{02} \text{female} + \gamma_{03} \text{sector} + \gamma_{04} \text{mnses} + u_{0j} + r_{ij}
$$

\[ mathach_{ij} = \gamma_{00} + \gamma_{01} \text{ses} + \gamma_{02} \text{female} + \gamma_{03} \text{sector} + \gamma_{04} \text{mnses} + u_{0j} + r_{ij} \]

un intento de solución:

lmer_to_mathjax <- function(model, response_name = "y_{ij}") {
  # Extrae los términos del modelo
  terms_fixed <- attr(terms(model), "term.labels")
  re_terms <- lme4::findbars(formula(model)[[3]])
  
  # Construye la parte fija de la ecuación
  gamma_terms <- paste0("\\gamma_{0", seq_along(terms_fixed), "} \\text{", terms_fixed, "}")
  gamma_0 <- "\\gamma_{00}"
  fixed_part <- paste(c(gamma_0, gamma_terms), collapse = " + ")
  
  # Construye la parte aleatoria
  random_parts <- c()
  for (re in re_terms) {
    var_name <- as.character(re[[2]])
    if (length(re[[2]]) == 1) {
      random_parts <- c(random_parts, paste0("u_{0j}"))
    } else {
      random_parts <- c(random_parts, paste0("u_{1j}"))
    }
  }
  random_part <- paste(unique(random_parts), collapse = " + ")
  
  # Ruido
  noise_part <- "r_{ij}"
  
  # Construcción final
  rhs <- paste(c(fixed_part, random_part, noise_part), collapse = " + ")
  equation <- paste0("$$\n", response_name, " = ", rhs, "\n$$")
  
  cat(equation)
}
# Generate MathJax
cat(lmer_to_mathjax(results_3))

\[ y_{ij} = \gamma_{00} + \gamma_{01} \text{ses} + \gamma_{02} \text{female} + \gamma_{03} \text{sector} + \gamma_{04} \text{mnses} + u_{0j} + r_{ij} \]

Foro