Estadística matemática · Teoría y práctica en R
La Función Cuantil en R
Fundamentos teóricos, interpretación probabilística y aplicaciones
Conocer una probabilidad y conocer el valor al que corresponde son problemas relacionados, pero distintos. Podemos preguntar qué proporción de una distribución queda por debajo de una nota determinada; también podemos preguntar qué nota delimita una proporción previamente elegida. La función de distribución acumulada responde la primera pregunta. La función cuantil permite responder la segunda.
Este artículo desarrolla esa relación desde su definición matemática hasta su uso en R. El ejemplo conductor conserva una distribución normal de calificaciones con media 72 y desviación estándar 15.2, y muestra por qué una probabilidad de 0.7850824 conduce aproximadamente a 84 al considerar la cola inferior y a 60 al considerar la superior. A partir de él se estudian los cuantiles discretos, los cuantiles muestrales y el papel de los valores críticos en la inferencia.
1. Dos preguntas distintas
Supongamos que una calificación se representa mediante una variable aleatoria X. Si fijamos una nota x, podemos calcular la probabilidad de que X sea menor o igual que ella. Si fijamos una probabilidad p, podemos buscar la nota que alcanza ese nivel acumulado. En un caso conocemos el umbral; en el otro, el nivel probabilístico.
| Pregunta | Función normal | Devuelve |
|---|---|---|
| ¿Qué probabilidad queda a la izquierda de x? | pnorm(x, ...) | Una probabilidad |
| ¿Qué valor corresponde a la probabilidad acumulada p? | qnorm(p, ...) | Un umbral |
| ¿Cuál es la densidad en x? | dnorm(x, ...) | Una altura de densidad |
| ¿Cómo generar observaciones de ese modelo? | rnorm(n, ...) | n realizaciones pseudoaleatorias |
Los prefijos d, p, q y r organizan muchas de las familias probabilísticas disponibles en R. Para variables discretas, las funciones d…() devuelven masas de probabilidad; para variables continuas, densidades. Una altura de densidad no es la probabilidad de observar exactamente ese valor: en el caso continuo, las probabilidades se obtienen sobre intervalos. Véanse las referencias [1] y [2].
2. La función de distribución acumulada
Para toda variable aleatoria real X, su función de distribución acumulada se define como:
Esta función es no decreciente y continua por la derecha; sus límites son 0 cuando x tiende a −∞ y 1 cuando tiende a +∞. Puede ser continua, presentar saltos o combinar ambas características. Su existencia no depende de que conozcamos una expresión elemental que permita evaluarla a mano.
Para una normal estándar, la distribución acumulada se denota por Φ:
La integral está bien definida, aunque no posee una expresión mediante funciones elementales. En R, pnorm() permite evaluarla numéricamente y qnorm() permite obtener sus cuantiles. La utilidad de estos últimos se explica por la pregunta que resuelven, no por una supuesta ausencia de la función acumulada.
La distribución acumulada parte de un valor y mide probabilidad; el cuantil parte de una probabilidad y localiza un valor.
3. La función cuantil como inversa generalizada
Para cubrir también distribuciones con saltos o tramos constantes, definimos el cuantil inferior mediante:
El símbolo inf indica el ínfimo: la mayor cota inferior del conjunto de valores cuya probabilidad acumulada alcanza o supera p. Para una variable aleatoria real y un nivel estrictamente entre 0 y 1, esta definición selecciona el primer umbral que satisface la condición.
Si F es continua y estrictamente creciente, la función cuantil coincide con su inversa ordinaria y se cumple F(Q(p)) = p. Si hay saltos, esa igualdad puede fallar. La relación general relevante es:
Aquí, F(q−) = P(X < q) es el límite por la izquierda, mientras que F(q) = P(X ≤ q) incluye la masa que pueda concentrarse en el umbral. Por ello, en general el cuantil no deja exactamente una proporción p por debajo: asegura que el nivel acumulado se alcanza o se supera.
Propiedades que ayudan a interpretar
- Orden: si aumenta el nivel p, el cuantil no disminuye.
- Unidades: si X mide notas, ingresos o tiempos, el cuantil conserva esas unidades.
- Posición: Q(0.5) es una elección de mediana; Q(0.25) y Q(0.75) son los cuantiles asociados a los cuartiles primero y tercero.
- Convención: cuando una distribución admite varias medianas, la definición anterior selecciona una de ellas. Conviene declarar la convención utilizada.
También se utilizan los nombres función de punto porcentual e inversa de la distribución acumulada. Un percentil corresponde a expresar el nivel p en una escala de cien: el percentil 95 se asocia a p = 0.95. En muestras finitas, su cálculo requiere además especificar un método.
4. El ejemplo de las notas: una probabilidad y dos colas
Supongamos que las calificaciones siguen, como modelo de trabajo, una distribución normal con media μ = 72 y desviación estándar σ = 15.2:
El segundo parámetro de esta notación es la varianza, σ². En cambio, el argumento sd de R recibe directamente la desviación estándar. Para esta familia se cumple:
Esta identidad muestra que un cuantil normal estándar se transforma a la escala original multiplicándolo por σ y sumándole μ. La expresión qnorm(p) usa por defecto μ = 0 y σ = 1; al proporcionar otros parámetros, estamos trabajando con otra distribución normal, no con la normal estándar.
4.1. Cola inferior: el umbral es aproximadamente 84
Buscamos una nota cuya probabilidad acumulada inferior sea 0.7850824. La llamada y su verificación son:
R · Cola inferior y comprobación
p_objetivo <- 0.7850824
mu_notas <- 72
sigma_notas <- 15.2
q_inferior <- qnorm(p_objetivo, mean = mu_notas,
sd = sigma_notas)
q_inferior
# Aproximadamente 84.00000012
pnorm(q_inferior, mean = mu_notas, sd = sigma_notas)
# Aproximadamente 0.7850824Bajo el modelo, aproximadamente el 78.50824 % de las calificaciones es menor o igual a 84. El valor devuelto está muy cerca de 84, pero no es idéntico en aritmética exacta: se ha proporcionado una probabilidad decimal redondeada.
4.2. Cola superior: el umbral es aproximadamente 60
Ahora buscamos un valor por encima del cual quede esa misma probabilidad. Se cambia la cola y se conserva el nivel solicitado:
R · Cola superior y comprobación
q_superior <- qnorm(p_objetivo, mean = mu_notas,
sd = sigma_notas, lower.tail = FALSE)
q_superior
# Aproximadamente 59.99999988
pnorm(q_superior, mean = mu_notas,
sd = sigma_notas, lower.tail = FALSE)
# Aproximadamente 0.7850824
pnorm(q_superior, mean = mu_notas, sd = sigma_notas)
# Aproximadamente 0.2149176La lectura es: aproximadamente el 78.50824 % de la distribución está por encima de 60. Su probabilidad acumulada inferior es aproximadamente 0.2149176. Para esta distribución continua, incluir o excluir exactamente el umbral no altera la probabilidad, porque la masa de cualquier punto individual es cero.
En una normal, la simetría explica que ambos umbrales estén a la misma distancia de la media: 84 − 72 = 72 − 60 = 12, salvo el redondeo numérico. Esa simetría es una propiedad de este modelo; no debe suponerse para toda distribución.
| Cola solicitada | Umbral | Probabilidad bajo el modelo |
|---|---|---|
| Inferior | ≈ 84 | P(X ≤ 84) ≈ 0.7850824 |
| Superior | ≈ 60 | P(X > 60) ≈ 0.7850824 |
| Inferior del segundo umbral | ≈ 60 | P(X ≤ 60) ≈ 0.2149176 |
pnorm() recorre la relación desde el valor hacia la probabilidad; qnorm() permite recorrerla desde la probabilidad hacia el valor.4.3. ¿Es apropiada una normal para las notas?
La normal tiene soporte en toda la recta real. Si las calificaciones están acotadas entre 0 y 100, el modelo asigna alguna probabilidad a valores imposibles. Con estos parámetros, la probabilidad por encima de 100 es aproximadamente 3.27 %: una discrepancia que merece examinarse, especialmente si interesan los percentiles altos.
R · Probabilidad fuera de la escala 0–100
p_menor_0 <- pnorm(0, mean = mu_notas, sd = sigma_notas)
p_mayor_100 <- pnorm(100, mean = mu_notas,
sd = sigma_notas, lower.tail = FALSE)
c(p_menor_0 = p_menor_0, p_mayor_100 = p_mayor_100)Su uso exige estudiar la forma de los datos y el propósito del análisis. Según el caso, puede ser más apropiado trabajar con cuantiles empíricos, una distribución truncada o un modelo sobre soporte acotado. El ejemplo ilustra el mecanismo de inversión; no valida automáticamente la normalidad de las calificaciones.
5. Sintaxis, argumentos y precisión numérica en R
Una llamada válida, con todos los argumentos principales explícitos, es:
R · Llamada completa
qnorm(p = 0.95, mean = 0, sd = 1,
lower.tail = TRUE, log.p = FALSE)
# Aproximadamente 1.644854| Argumento | Significado | Cuidado principal |
|---|---|---|
p | Nivel de probabilidad | Usar 0.95, no 95, para el 95 % |
mean | Media del modelo | No confundir con una estimación sin indicar su origen |
sd | Desviación estándar del modelo | No es varianza ni error estándar |
lower.tail | Selecciona la cola inferior o superior | La probabilidad suministrada se interpreta en la cola elegida |
log.p | Indica si la entrada es el logaritmo natural de la probabilidad | No pide devolver el logaritmo del cuantil |
La escritura explicativa «TRUE o FALSE» no se copia literalmente como argumento: en una llamada se escoge un valor lógico concreto. Es preferible escribir TRUE y FALSE completos. Los nombres abreviados T y F pueden reasignarse y resultar ambiguos en una sesión de trabajo.
5.1. Colas complementarias
En el caso normal, para un nivel interior p, el umbral superior corresponde al cuantil inferior de nivel 1 − p. Pero cambiar lower.tail devuelve otro valor, no la probabilidad complementaria como resultado. En colas extremas conviene proporcionar directamente la probabilidad de la cola de interés.
R · Logaritmos y colas extremas
qnorm(log(0.95), log.p = TRUE)
# El mismo cuantil que qnorm(0.95)
qnorm(1 - 1e-20)
# Inf: la resta se redondea a 1
qnorm(1e-20, lower.tail = FALSE)
# Aproximadamente 9.26234
qnorm(-1000, lower.tail = FALSE, log.p = TRUE)
# Cuantil finito para una probabilidad superior exp(-1000)Restar una probabilidad diminuta de 1 puede producir 1 exactamente en la representación de punto flotante. Por eso qnorm(1 - 1e-20) puede devolver Inf, mientras que la llamada de cola superior conserva un umbral finito. Con log.p = TRUE se puede representar una probabilidad mediante su logaritmo aun cuando la probabilidad ordinaria sea demasiado pequeña para almacenarse con precisión útil.
5.2. Vectorización y casos límite
R · Varios niveles y extremos
qnorm(c(0.025, 0.5, 0.975), mean = 72, sd = 15.2)
# Aproximadamente: 42.20855 72.00000 101.79145
qnorm(c(0, 1))
# -Inf InfPara la interpretación normal no degenerada asumimos sd > 0. R también contempla sd = 0 como una masa puntual y señala los valores negativos de sd como inválidos. Un nivel probabilístico fuera de [0, 1] tampoco es válido cuando log.p = FALSE. Las opciones y los detalles numéricos se documentan en [2].
6. Cuando la distribución tiene saltos
Consideremos el número de éxitos en cuatro ensayos de Bernoulli independientes, cada uno con probabilidad de éxito 0.5. Para X ~ Binomial(4, 0.5), se obtiene:
R · Cuantil binomial y probabilidades alcanzadas
q_discreto <- qbinom(0.5, size = 4, prob = 0.5)
q_discreto
# 2
pbinom(q_discreto - 1, size = 4, prob = 0.5)
# 0.3125
pbinom(q_discreto, size = 4, prob = 0.5)
# 0.6875
qbinom(0.5, size = 4, prob = 0.5, lower.tail = FALSE)
# 2
pbinom(2, size = 4, prob = 0.5, lower.tail = FALSE)
# 0.3125No existe ningún valor con probabilidad acumulada exactamente igual a 0.5. Hasta 1 éxito se acumula 0.3125; al llegar a 2 se acumula 0.6875. Por eso el cuantil de nivel 0.5 es 2: se trata del menor valor que alcanza o supera el nivel solicitado. Esta es la definición operativa de qbinom(), descrita en [3].
En este ejemplo, P(X < 2) = 0.3125, P(X ≤ 2) = 0.6875, P(X > 2) = 0.3125 y P(X ≥ 2) = 0.6875. Incluir el umbral cambia la probabilidad porque P(X = 2) = 0.375.
7. Cuantiles teóricos y cuantiles muestrales
qnorm() calcula cuantiles de una distribución normal especificada. quantile() trabaja con una muestra y un método de cálculo. Incluso si los datos parecen normales, ambas operaciones responden a construcciones diferentes: una depende del modelo y sus parámetros; la otra, de los datos ordenados y la convención elegida.
Consideremos seis notas ilustrativas, creadas únicamente para mostrar los métodos de cálculo:
R · Comparar dos métodos muestrales
notas <- c(58, 65, 70, 72, 80, 91)
niveles <- c(0.25, 0.5, 0.75)
quantile(notas, probs = niveles, type = 1)
# 25% 50% 75%
# 65 70 80
quantile(notas, probs = niveles, type = 7)
# 25% 50% 75%
# 66.25 71.00 78.00
acumulada_empirica <- ecdf(notas)
acumulada_empirica(70)
# 0.5| Nivel | type = 1 | type = 7 |
|---|---|---|
| 0.25 | 65 | 66.25 |
| 0.50 | 70 | 71 |
| 0.75 | 80 | 78 |
7.1. La distribución empírica y su inversa
La distribución acumulada empírica asigna a cada umbral la proporción observada de datos menores o iguales que él:
La expresión 𝟙 representa una función indicadora: vale 1 cuando la condición se cumple y 0 cuando no se cumple. Para 0 < p ≤ 1, la inversa generalizada de esta función corresponde a type = 1. Si las observaciones ordenadas se denotan por x(1), …, x(n), devuelve x(⌈np⌉). Por ejemplo, con seis notas y p = 0.5, el índice es 3 y se obtiene 70.
7.2. La interpolación predeterminada
El método predeterminado de R es type = 7. Para una muestra finita de tamaño al menos dos, sitúa el nivel p en la posición h = 1 + (n − 1)p e interpola linealmente entre las observaciones adyacentes cuando esa posición no es entera. Así, para p = 0.25 se obtiene h = 2.25 y el resultado es 65 + 0.25(70 − 65) = 66.25.
Para el nivel 0.5, la interpolación se sitúa entre 70 y 72 y devuelve 71. Ambos métodos siguen convenciones legítimas; no están resolviendo una discrepancia aritmética. El resultado interpolado tampoco tiene que coincidir con una nota observada.
R ofrece nueve métodos de cuantiles muestrales. No es necesario desarrollar aquí todos sus algoritmos, pero sí declarar el elegido, especialmente al comparar resultados entre programas. La documentación oficial presenta las nueve definiciones y su relación con los estadísticos de orden; véase [4].
7.3. Valores ausentes y trazabilidad
R · Valores ausentes
notas_con_na <- c(notas, NA_real_)
sum(is.na(notas_con_na))
# 1
quantile(notas_con_na, probs = niveles,
type = 7, na.rm = TRUE)
# 66.25 71.00 78.00Eliminar valores ausentes permite efectuar el cálculo, pero no resuelve el problema de por qué faltan. En una investigación se deben informar el tamaño muestral utilizado, la política de tratamiento de ausencias, el nivel solicitado y el método de cuantiles. Si hay pesos de muestreo o un diseño complejo, el procedimiento también debe reflejarlos.
8. Cuantiles, valores críticos e intervalos de confianza
Las funciones de cuantiles intervienen en muchos procedimientos inferenciales porque permiten localizar valores críticos de una distribución de referencia. Sin embargo, llamar a qnorm() o qt() no construye por sí mismo un intervalo de confianza. Es necesario especificar qué parámetro se estima, qué estadístico se utiliza y bajo qué supuestos se conoce o aproxima su distribución.
8.1. Un intervalo para la media
Si X1, …, Xn son observaciones independientes de una misma distribución normal con media μ y varianza positiva desconocida, el pivote:
sigue una distribución t de Student con n − 1 grados de libertad. Al invertir la desigualdad probabilística del pivote se obtiene el intervalo bilateral de confianza:
En esta fórmula, la media muestral es el estimador; S/√n es su error estándar estimado; y el cuantil t1−α/2,n−1 es el valor crítico calculado mediante qt(). Véanse [5] y [6].
R · Intervalo t para la media
notas <- c(58, 65, 70, 72, 80, 91)
n <- length(notas)
confianza <- 0.95
alpha <- 1 - confianza
media_muestral <- mean(notas)
desviacion_muestral <- sd(notas)
error_estandar <- desviacion_muestral / sqrt(n)
critico_t <- qt(1 - alpha / 2, df = n - 1)
ic_media <- media_muestral + c(-1, 1) *
critico_t * error_estandar
ic_media
# Aproximadamente: 60.50649 84.82684
ic_automatico <- t.test(notas, conf.level = confianza)$conf.int
unname(ic_automatico)
stopifnot(isTRUE(all.equal(
as.numeric(ic_media), as.numeric(ic_automatico),
tolerance = 1e-10
)))Con estas seis notas ilustrativas, el intervalo al 95 % es aproximadamente [60.50649, 84.82684]. El cálculo se presenta para mostrar el procedimiento; una muestra tan pequeña exige examinar cuidadosamente la plausibilidad del supuesto normal. Para poblaciones no normales, el uso aproximado de este intervalo necesita justificación y puede ser problemático con asimetría intensa, colas pesadas, dependencia o valores atípicos influyentes.
8.2. Tres objetos que no deben confundirse
| Objeto | Pregunta | Ejemplo |
|---|---|---|
| Intervalo central de una distribución | ¿Entre qué valores queda una proporción del modelo? | Dos cuantiles normales de niveles 0.025 y 0.975 |
| Intervalo de confianza | ¿Cómo estimar un parámetro con cobertura especificada? | Intervalo t para la media |
| Intervalo de predicción | ¿Cómo acotar una observación futura con cobertura especificada? | Procedimiento que incorpora la variación individual y la incertidumbre de estimación |
R · Intervalo central del modelo normal
qnorm(c(0.025, 0.975), mean = 72, sd = 15.2)
# Aproximadamente: 42.20855 101.79145
# Intervalo central del modelo, no intervalo para su mediaPara una normal conocida con estos parámetros, el intervalo central del 95 % es aproximadamente [42.20855, 101.79145]. No es un intervalo de confianza para μ. El límite superior también recuerda la cautela necesaria cuando se aplica una normal a notas cuyo máximo real es 100.
8.3. Valores críticos y valores p
En una prueba bilateral sobre una media, el valor crítico se obtiene fijando un nivel α antes de evaluar el estadístico. El valor p se calcula a partir del estadístico observado y la distribución bajo la hipótesis nula. La letra p del argumento de qnorm() o qt() designa una probabilidad de entrada; no significa automáticamente «valor p de una prueba».
R · Cuantil crítico y valor p bilateral
mu_nula <- 72
t_observado <- (media_muestral - mu_nula) / error_estandar
p_bilateral <- 2 * pt(abs(t_observado), df = n - 1,
lower.tail = FALSE)
c(t_observado = t_observado,
critico_t = critico_t, p_bilateral = p_bilateral)
abs(t_observado) > critico_t
# FALSE
p_bilateral < alpha
# FALSEEn el ejemplo, ambas decisiones coinciden: no se rechaza μ = 72 al nivel 0.05. Esto no demuestra que la hipótesis nula sea verdadera ni que sea imposible una diferencia sustantiva. El cálculo usa una distribución de referencia simétrica; para otros contrastes deben establecerse la cola, el estadístico y la distribución correspondientes.
9. Simulación mediante la función cuantil
La función cuantil también permite construir realizaciones de una distribución a partir de una variable uniforme. Si U tiene distribución uniforme en (0, 1), entonces QX(U) tiene la distribución acumulada FX. La definición mediante inversa generalizada permite aplicar este principio también a distribuciones discretas.
R · Transformación inversa
set.seed(2021)
uniformes <- runif(1000)
notas_simuladas <- qnorm(uniformes, mean = 72, sd = 15.2)
mean(notas_simuladas)
sd(notas_simuladas)
# Aproximaciones muestrales a 72 y 15.2
# Generación normal mediante la función específica:
set.seed(2021)
notas_directas <- rnorm(1000, mean = 72, sd = 15.2)
# No se espera igualdad elemento a elemento entre ambos métodosEste es el principio de transformación inversa. La semilla hace reproducible la secuencia dentro de una configuración compatible del generador; no elimina la variación muestral ni convierte la media observada en el parámetro exacto. rnorm() ofrece generación normal directa desde la perspectiva del usuario, pero este ejemplo no pretende describir todos los algoritmos internos con los que R puede producirla.
La aplicación vuelve visible el vínculo central del artículo: una colección de niveles probabilísticos se transforma en valores de una variable. Además de la simulación, esta relación aparece en percentiles descriptivos, umbrales de decisión y diagnósticos que comparan cuantiles empíricos con cuantiles teóricos.
10. Reproducir los gráficos en R
Los gráficos integrados en este artículo representan las funciones matemáticas de los ejemplos. El siguiente bloque produce sus equivalentes con herramientas de R base: dos áreas de densidad, una curva acumulada, una curva cuantil y una acumulada discreta. No requiere instalar paquetes.
R · Figuras con R base
graficar_cuantiles <- function() {
parametros_previos <- par(no.readonly = TRUE)
on.exit(par(parametros_previos))
papel <- "#fffdf7"
tinta <- "#2c2418"
cobre <- "#8b4513"
area <- "#e4d1bb"
mu <- 72
sigma <- 15.2
p <- 0.7850824
q_izq <- qnorm(p, mean = mu, sd = sigma)
q_der <- qnorm(p, mean = mu, sd = sigma,
lower.tail = FALSE)
rejilla <- seq(12, 132, length.out = 1201)
densidad <- dnorm(rejilla, mean = mu, sd = sigma)
par(mfrow = c(2, 1), mar = c(4, 4, 3, 1),
bg = papel, fg = tinta, col.axis = tinta,
col.lab = tinta, col.main = tinta)
for (cola in c("inferior", "superior")) {
corte <- if (cola == "inferior") q_izq else q_der
rango <- if (cola == "inferior") {
c(12, corte)
} else {
c(corte, 132)
}
xs <- seq(rango[1], rango[2], length.out = 600)
ys <- dnorm(xs, mean = mu, sd = sigma)
plot(rejilla, densidad, type = "n",
xlab = "Nota", ylab = "Densidad",
main = paste("Cola", cola, "- probabilidad", p))
polygon(c(xs[1], xs, tail(xs, 1)), c(0, ys, 0),
col = area, border = NA)
lines(rejilla, densidad, col = cobre, lwd = 2)
segments(corte, 0, corte,
dnorm(corte, mean = mu, sd = sigma), col = cobre)
abline(v = mu, col = "#c4956a", lty = 3)
mtext(sprintf("Umbral: %.2f", corte), side = 3,
line = 0.2, cex = 0.8)
}
par(mfrow = c(1, 1))
plot(rejilla, pnorm(rejilla, mean = mu, sd = sigma),
type = "l", col = cobre, lwd = 2, ylim = c(0, 1),
xlab = "Nota", ylab = "Probabilidad acumulada",
main = "De p al umbral: distribucion acumulada")
segments(12, p, q_izq, p, lty = 2, col = cobre)
segments(q_izq, 0, q_izq, p, lty = 2, col = cobre)
points(q_izq, p, pch = 19, col = cobre)
niveles_grafico <- seq(0.005, 0.995, length.out = 1000)
plot(niveles_grafico,
qnorm(niveles_grafico, mean = mu, sd = sigma),
type = "l", col = cobre, lwd = 2,
xlab = "Probabilidad acumulada p", ylab = "Cuantil",
main = "Funcion cuantil normal")
points(c(0.5, p), c(mu, q_izq), pch = 19, col = cobre)
plot(NA_real_, NA_real_, type = "n", xlim = c(-0.5, 4.5),
ylim = c(0, 1), xlab = "Numero de exitos",
ylab = "Probabilidad acumulada",
main = "Binomial(4, 0.5): acumulada con saltos")
abline(h = 0.5, lty = 2, col = "#c4956a")
segments(-0.5, 0, 0, 0, col = cobre, lwd = 2)
for (k in 0:4) {
acumulada <- pbinom(k, size = 4, prob = 0.5)
extremo <- min(k + 1, 4.5)
segments(k, acumulada, extremo, acumulada,
col = cobre, lwd = 2)
points(k, acumulada, pch = 19, col = cobre)
if (k < 4) {
points(k + 1, acumulada, pch = 21,
col = cobre, bg = papel)
}
}
segments(2, 0, 2, pbinom(2, 4, 0.5), lty = 2, col = cobre)
invisible(NULL)
}
graficar_cuantiles()
# En RStudio, usar las flechas del panel Plots para ver las figuras.
# Para conservar todas las paginas en un PDF desde R:
# pdf("graficos_cuantiles.pdf", width = 8, height = 7)
# graficar_cuantiles()
# dev.off()Las regiones coloreadas en las densidades corresponden a probabilidades; las alturas son densidades. En la acumulada, la altura sí representa una probabilidad acumulada. En la curva cuantil se intercambian las funciones de los ejes: el nivel probabilístico pasa a ser la entrada y el valor de la variable, la salida.
11. Errores que conviene evitar
| Confusión | Interpretación correcta |
|---|---|
qnorm() devuelve una probabilidad | Devuelve un umbral asociado a una probabilidad |
sd significa error estándar | Es la desviación estándar del modelo normal |
| La función cuantil se usa porque la acumulada no existe | La acumulada existe; la inversión responde a otra pregunta |
| Todo cuantil satisface exactamente F(q) = p | Los saltos pueden hacer que se supere el nivel solicitado |
| La cola superior es simplemente el mismo umbral con otra explicación | Al mantener p y cambiar la cola, generalmente cambia el umbral |
| Un cuantil enumera los datos que quedan debajo | Localiza un valor; identificar observaciones exige los datos |
| Una proporción del modelo se cumple exactamente en cualquier muestra | Las frecuencias observadas varían entre muestras |
quantile() y qnorm() son intercambiables | Trabajan con una muestra y con un modelo especificado, respectivamente |
| Un par de cuantiles siempre es un intervalo de confianza | La cobertura inferencial depende de un procedimiento y sus supuestos |
x <- rnorm genera notas | Guarda una función; hay que llamarla con argumentos |
Para interpretar cualquier resultado conviene registrar cuatro elementos: la variable y sus unidades, la distribución o muestra utilizada, el nivel probabilístico solicitado y la convención de cálculo. Si el resultado se emplea en inferencia, también deben explicitarse el parámetro, el estadístico y los supuestos que sostienen el procedimiento.
Un cuantil convierte una proporción en una posición dentro de una distribución. Su interpretación depende de qué distribución se estudia y de cómo se define esa posición.
12. Script completo y comprobaciones
El apartado desplegable reúne, en orden de ejecución, los ejemplos y las figuras. Puede copiarse a un archivo .R y ejecutarse desde una sesión nueva. Los datos de seis notas son ilustrativos; no proceden de un estudio empírico. Las cifras impresas pueden variar en sus últimos decimales según la versión y la plataforma.
Desplegar el script completo de R
R · Archivo completo
# LA FUNCION CUANTIL EN R
# JOSÉ MAURICIO GÓMEZ JULIÁN
# Datos ilustrativos; funciones de R base y stats.
# COLA INFERIOR Y COMPROBACIÓN
p_objetivo <- 0.7850824
mu_notas <- 72
sigma_notas <- 15.2
q_inferior <- qnorm(p_objetivo, mean = mu_notas,
sd = sigma_notas)
q_inferior
# Aproximadamente 84.00000012
pnorm(q_inferior, mean = mu_notas, sd = sigma_notas)
# Aproximadamente 0.7850824
# COLA SUPERIOR Y COMPROBACIÓN
q_superior <- qnorm(p_objetivo, mean = mu_notas,
sd = sigma_notas, lower.tail = FALSE)
q_superior
# Aproximadamente 59.99999988
pnorm(q_superior, mean = mu_notas,
sd = sigma_notas, lower.tail = FALSE)
# Aproximadamente 0.7850824
pnorm(q_superior, mean = mu_notas, sd = sigma_notas)
# Aproximadamente 0.2149176
# PROBABILIDAD FUERA DE LA ESCALA 0–100
p_menor_0 <- pnorm(0, mean = mu_notas, sd = sigma_notas)
p_mayor_100 <- pnorm(100, mean = mu_notas,
sd = sigma_notas, lower.tail = FALSE)
c(p_menor_0 = p_menor_0, p_mayor_100 = p_mayor_100)
# LLAMADA COMPLETA
qnorm(p = 0.95, mean = 0, sd = 1,
lower.tail = TRUE, log.p = FALSE)
# Aproximadamente 1.644854
# LOGARITMOS Y COLAS EXTREMAS
qnorm(log(0.95), log.p = TRUE)
# El mismo cuantil que qnorm(0.95)
qnorm(1 - 1e-20)
# Inf: la resta se redondea a 1
qnorm(1e-20, lower.tail = FALSE)
# Aproximadamente 9.26234
qnorm(-1000, lower.tail = FALSE, log.p = TRUE)
# Cuantil finito para una probabilidad superior exp(-1000)
# VARIOS NIVELES Y EXTREMOS
qnorm(c(0.025, 0.5, 0.975), mean = 72, sd = 15.2)
# Aproximadamente: 42.20855 72.00000 101.79145
qnorm(c(0, 1))
# -Inf Inf
# CUANTIL BINOMIAL Y PROBABILIDADES ALCANZADAS
q_discreto <- qbinom(0.5, size = 4, prob = 0.5)
q_discreto
# 2
pbinom(q_discreto - 1, size = 4, prob = 0.5)
# 0.3125
pbinom(q_discreto, size = 4, prob = 0.5)
# 0.6875
qbinom(0.5, size = 4, prob = 0.5, lower.tail = FALSE)
# 2
pbinom(2, size = 4, prob = 0.5, lower.tail = FALSE)
# 0.3125
# COMPARAR DOS MÉTODOS MUESTRALES
notas <- c(58, 65, 70, 72, 80, 91)
niveles <- c(0.25, 0.5, 0.75)
quantile(notas, probs = niveles, type = 1)
# 25% 50% 75%
# 65 70 80
quantile(notas, probs = niveles, type = 7)
# 25% 50% 75%
# 66.25 71.00 78.00
acumulada_empirica <- ecdf(notas)
acumulada_empirica(70)
# 0.5
# VALORES AUSENTES
notas_con_na <- c(notas, NA_real_)
sum(is.na(notas_con_na))
# 1
quantile(notas_con_na, probs = niveles,
type = 7, na.rm = TRUE)
# 66.25 71.00 78.00
# INTERVALO T PARA LA MEDIA
notas <- c(58, 65, 70, 72, 80, 91)
n <- length(notas)
confianza <- 0.95
alpha <- 1 - confianza
media_muestral <- mean(notas)
desviacion_muestral <- sd(notas)
error_estandar <- desviacion_muestral / sqrt(n)
critico_t <- qt(1 - alpha / 2, df = n - 1)
ic_media <- media_muestral + c(-1, 1) *
critico_t * error_estandar
ic_media
# Aproximadamente: 60.50649 84.82684
ic_automatico <- t.test(notas, conf.level = confianza)$conf.int
unname(ic_automatico)
stopifnot(isTRUE(all.equal(
as.numeric(ic_media), as.numeric(ic_automatico),
tolerance = 1e-10
)))
# INTERVALO CENTRAL DEL MODELO NORMAL
qnorm(c(0.025, 0.975), mean = 72, sd = 15.2)
# Aproximadamente: 42.20855 101.79145
# Intervalo central del modelo, no intervalo para su media
# CUANTIL CRÍTICO Y VALOR P BILATERAL
mu_nula <- 72
t_observado <- (media_muestral - mu_nula) / error_estandar
p_bilateral <- 2 * pt(abs(t_observado), df = n - 1,
lower.tail = FALSE)
c(t_observado = t_observado,
critico_t = critico_t, p_bilateral = p_bilateral)
abs(t_observado) > critico_t
# FALSE
p_bilateral < alpha
# FALSE
# TRANSFORMACIÓN INVERSA
set.seed(2021)
uniformes <- runif(1000)
notas_simuladas <- qnorm(uniformes, mean = 72, sd = 15.2)
mean(notas_simuladas)
sd(notas_simuladas)
# Aproximaciones muestrales a 72 y 15.2
# Generación normal mediante la función específica:
set.seed(2021)
notas_directas <- rnorm(1000, mean = 72, sd = 15.2)
# No se espera igualdad elemento a elemento entre ambos métodos
# FIGURAS CON R BASE
graficar_cuantiles <- function() {
parametros_previos <- par(no.readonly = TRUE)
on.exit(par(parametros_previos))
papel <- "#fffdf7"
tinta <- "#2c2418"
cobre <- "#8b4513"
area <- "#e4d1bb"
mu <- 72
sigma <- 15.2
p <- 0.7850824
q_izq <- qnorm(p, mean = mu, sd = sigma)
q_der <- qnorm(p, mean = mu, sd = sigma,
lower.tail = FALSE)
rejilla <- seq(12, 132, length.out = 1201)
densidad <- dnorm(rejilla, mean = mu, sd = sigma)
par(mfrow = c(2, 1), mar = c(4, 4, 3, 1),
bg = papel, fg = tinta, col.axis = tinta,
col.lab = tinta, col.main = tinta)
for (cola in c("inferior", "superior")) {
corte <- if (cola == "inferior") q_izq else q_der
rango <- if (cola == "inferior") {
c(12, corte)
} else {
c(corte, 132)
}
xs <- seq(rango[1], rango[2], length.out = 600)
ys <- dnorm(xs, mean = mu, sd = sigma)
plot(rejilla, densidad, type = "n",
xlab = "Nota", ylab = "Densidad",
main = paste("Cola", cola, "- probabilidad", p))
polygon(c(xs[1], xs, tail(xs, 1)), c(0, ys, 0),
col = area, border = NA)
lines(rejilla, densidad, col = cobre, lwd = 2)
segments(corte, 0, corte,
dnorm(corte, mean = mu, sd = sigma), col = cobre)
abline(v = mu, col = "#c4956a", lty = 3)
mtext(sprintf("Umbral: %.2f", corte), side = 3,
line = 0.2, cex = 0.8)
}
par(mfrow = c(1, 1))
plot(rejilla, pnorm(rejilla, mean = mu, sd = sigma),
type = "l", col = cobre, lwd = 2, ylim = c(0, 1),
xlab = "Nota", ylab = "Probabilidad acumulada",
main = "De p al umbral: distribucion acumulada")
segments(12, p, q_izq, p, lty = 2, col = cobre)
segments(q_izq, 0, q_izq, p, lty = 2, col = cobre)
points(q_izq, p, pch = 19, col = cobre)
niveles_grafico <- seq(0.005, 0.995, length.out = 1000)
plot(niveles_grafico,
qnorm(niveles_grafico, mean = mu, sd = sigma),
type = "l", col = cobre, lwd = 2,
xlab = "Probabilidad acumulada p", ylab = "Cuantil",
main = "Funcion cuantil normal")
points(c(0.5, p), c(mu, q_izq), pch = 19, col = cobre)
plot(NA_real_, NA_real_, type = "n", xlim = c(-0.5, 4.5),
ylim = c(0, 1), xlab = "Numero de exitos",
ylab = "Probabilidad acumulada",
main = "Binomial(4, 0.5): acumulada con saltos")
abline(h = 0.5, lty = 2, col = "#c4956a")
segments(-0.5, 0, 0, 0, col = cobre, lwd = 2)
for (k in 0:4) {
acumulada <- pbinom(k, size = 4, prob = 0.5)
extremo <- min(k + 1, 4.5)
segments(k, acumulada, extremo, acumulada,
col = cobre, lwd = 2)
points(k, acumulada, pch = 19, col = cobre)
if (k < 4) {
points(k + 1, acumulada, pch = 21,
col = cobre, bg = papel)
}
}
segments(2, 0, 2, pbinom(2, 4, 0.5), lty = 2, col = cobre)
invisible(NULL)
}
graficar_cuantiles()
# En RStudio, usar las flechas del panel Plots para ver las figuras.
# Para conservar todas las paginas en un PDF desde R:
# pdf("graficos_cuantiles.pdf", width = 8, height = 7)
# graficar_cuantiles()
# dev.off()
# Comprobaciones numericas con tolerancia
stopifnot(
abs(q_inferior - 84) < 1e-5,
abs(q_superior - 60) < 1e-5,
abs(pnorm(q_inferior, mu_notas, sigma_notas) -
p_objetivo) < 1e-10,
abs(pnorm(q_superior, mu_notas, sigma_notas,
lower.tail = FALSE) - p_objetivo) < 1e-10,
q_discreto == 2,
pbinom(q_discreto - 1, 4, 0.5) < 0.5,
pbinom(q_discreto, 4, 0.5) >= 0.5,
isTRUE(all.equal(
as.numeric(quantile(notas, niveles, type = 1)),
c(65, 70, 80))),
isTRUE(all.equal(
as.numeric(quantile(notas, niveles, type = 7)),
c(66.25, 71, 78)))
)
sessionInfo()
13. Referencias y documentación
Las siguientes fuentes documentan las funciones, convenciones y procedimientos utilizados. Las explicaciones matemáticas y los ejemplos se presentan desarrollados en el cuerpo del artículo; estos enlaces permiten consultar los detalles de implementación.
- R Core Team. Distributions in the “stats” Package. Manual oficial de R. Familias d, p, q y r.
- R Core Team. The Normal Distribution. Manual oficial de R. dnorm, pnorm, qnorm y rnorm.
- R Core Team. The Binomial Distribution. Manual oficial de R. Binomial y definición de sus cuantiles.
- R Core Team. Sample Quantiles. Manual oficial de R. quantile y sus nueve métodos. La documentación remite a Hyndman, R. J. y Fan, Y. (1996), Sample Quantiles in Statistical Packages, como referencia de la clasificación.
- R Core Team. The Student t Distribution. Manual oficial de R. dt, pt, qt y rt.
- R Core Team. Student’s t-Test. Manual oficial de R. t.test e intervalos de confianza.


Leave a Comment/Deja un Comentario