Espartaco

“Is that to say we are against Free Trade? No, we are for Free Trade, because by Free Trade all economical laws, with their most astounding contradictions, will act upon a larger scale, upon the territory of the whole earth; and because from the uniting of all these contradictions in a single group, where they will stand face to face, will result the struggle which will itself eventuate in the emancipation of the proletariat.”

Karl Heinrich Marx · Marx-Engels Collected Works, Vol. VI, p. 290

27,934 views since December 2020

27,934 visitas desde diciembre de 2020

EnglishEspañol

ANÁLISIS TEÓRICO DE LA FUNCIÓN CUANTIL EN R STUDIO

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

Publicado originalmente el 5 de septiembre de 2021
Versión revisada y ampliada · 29 de octubre de 2026

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.

Del valor a la probabilidad y de la probabilidad al valor
PreguntaFunción normalDevuelve
¿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:

FX(x)=P(X≤x),x∈ℝ

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 Φ:

Φ(z)=12π∫−∞ze−t2/2dt

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:

QX(p)=inf{x∈ℝ:FX(x)≥p},0<p<1

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:

F(q−)≤p≤F(q),q=Q(p)

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:

X∼N(72,15.22)

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:

QX(p)=μ+σΦ−1(p),σ>0

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.7850824

Bajo 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.2149176

La 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.

Una misma probabilidad, dos umbralesDos densidades normales. Arriba, el área a la izquierda de 84 es 0.7850824. Abajo, el área a la derecha de 60 es la misma. La media es 72 y la desviación estándar es 15.2.A · Cola inferior: P(X ≤ 84) ≈ 0.7850824244860728496120Nota xDensidad f(x) · el área representa probabilidadB · Cola superior: P(X > 60) ≈ 0.7850824244860728496120Nota xDensidad f(x) · el área representa probabilidad
Figura 1. La superficie coloreada representa aproximadamente el 78.50824 % en ambos paneles. La distribución es la misma; cambian la cola y el umbral. La curva se muestra en un rango finito para facilitar la lectura.

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.

Una misma probabilidad p = 0.7850824
Cola solicitadaUmbralProbabilidad bajo el modelo
Inferior≈ 84P(X ≤ 84) ≈ 0.7850824
Superior≈ 60P(X > 60) ≈ 0.7850824
Inferior del segundo umbral≈ 60P(X ≤ 60) ≈ 0.2149176
De la probabilidad al umbral en la distribución acumuladaLa curva F(x) es creciente. Una línea horizontal parte de p igual a 0.7850824 hasta la curva y una vertical desciende hasta x igual a 84.00,250,50,7512448728496120F(x) = P(X ≤ x)p = 0.7850824Q(p) ≈ 84Nota x
Figura 2. pnorm() recorre la relación desde el valor hacia la probabilidad; qnorm() permite recorrerla desde la probabilidad hacia el valor.
La curva de cuantiles normalesFunción Q(p) de una normal con media 72 y desviación estándar 15.2. Es creciente, pasa por p igual a 0.5 y nota 72, y por p igual a 0.7850824 y nota 84.36486072849610800,250,50,751Q(p): probabilidad → notaQ(0.5) = 72Q(0.7850824) ≈ 84Probabilidad acumulada p
Figura 4. La curva cuantil toma probabilidades en el eje horizontal y devuelve notas en el vertical. En una normal no degenerada, sus límites son −∞ y +∞ al aproximarse a los extremos 0 y 1.

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
Cómo interpretar los argumentos
ArgumentoSignificadoCuidado principal
pNivel de probabilidadUsar 0.95, no 95, para el 95 %
meanMedia del modeloNo confundir con una estimación sin indicar su origen
sdDesviación estándar del modeloNo es varianza ni error estándar
lower.tailSelecciona la cola inferior o superiorLa probabilidad suministrada se interpreta en la cola elegida
log.pIndica si la entrada es el logaritmo natural de la probabilidadNo 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  Inf

Para 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.3125

No 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].

El cuantil en una distribución con saltosDistribución acumulada de una binomial con cuatro ensayos y probabilidad 0.5. F(1) es 0.3125, F(2) es 0.6875. El nivel 0.5 cae dentro de un salto y el cuantil es 2.00,250,50,75101234X ~ Binomial(4, 0.5)F(2) = 0.6875F(1) = 0.3125p = 0.5Número de éxitos x
Figura 3. El primer valor que alcanza o supera 0.5 es 2. Los puntos llenos indican el valor incluido en cada escalón; los vacíos, el extremo excluido. Ningún resultado tiene probabilidad acumulada exactamente igual a 0.5.

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
La misma muestra, dos métodos de cuantiles
Niveltype = 1type = 7
0.256566.25
0.507071
0.758078

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:

Fn(x)=1n∑i=1n𝟙{Xi≤x}

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.00

Eliminar 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:

T=X¯−μS/n∼tn−1

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:

X¯±t1−α/2,n−1Sn

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

El objeto de interés determina el procedimiento
ObjetoPreguntaEjemplo
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 media

Para 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
# FALSE

En 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étodos

Este 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

Una guía de lectura y revisión
ConfusiónInterpretación correcta
qnorm() devuelve una probabilidadDevuelve un umbral asociado a una probabilidad
sd significa error estándarEs la desviación estándar del modelo normal
La función cuantil se usa porque la acumulada no existeLa acumulada existe; la inversión responde a otra pregunta
Todo cuantil satisface exactamente F(q) = pLos saltos pueden hacer que se supere el nivel solicitado
La cola superior es simplemente el mismo umbral con otra explicaciónAl mantener p y cambiar la cola, generalmente cambia el umbral
Un cuantil enumera los datos que quedan debajoLocaliza un valor; identificar observaciones exige los datos
Una proporción del modelo se cumple exactamente en cualquier muestraLas frecuencias observadas varían entre muestras
quantile() y qnorm() son intercambiablesTrabajan con una muestra y con un modelo especificado, respectivamente
Un par de cuantiles siempre es un intervalo de confianzaLa cobertura inferencial depende de un procedimiento y sus supuestos
x <- rnorm genera notasGuarda 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.

  1. R Core Team. Distributions in the “stats” Package. Manual oficial de R. Familias d, p, q y r.
  2. R Core Team. The Normal Distribution. Manual oficial de R. dnorm, pnorm, qnorm y rnorm.
  3. R Core Team. The Binomial Distribution. Manual oficial de R. Binomial y definición de sus cuantiles.
  4. 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.
  5. R Core Team. The Student t Distribution. Manual oficial de R. dt, pt, qt y rt.
  6. R Core Team. Student’s t-Test. Manual oficial de R. t.test e intervalos de confianza.

Volver al inicio ↑


Descubre más de Marxist Philosophy of Science

Suscríbete para recibir las últimas entradas en tu correo electrónico.

Follow the blogSeguí al blog

Comments

3 respuestas a “ANÁLISIS TEÓRICO DE LA FUNCIÓN CUANTIL EN R STUDIO”

  1. […] MaterialismUniversal HistoryStatisticsMathematicsPolitical ScienceQuantum Mechanics EnglishEspañol SubscribeSuscribirse Marxist Philosophy of Science Marxist Philosophy of Science […]

Leave a Comment/Deja un Comentario