Propósito. Antes de escribir dnorm(), pbinom() o qexp(), hay que saber qué es lo que cada función calcula. Esta guía presenta, de forma breve, los conceptos de probabilidad que hay detrás de las funciones de R (espacio muestral, variable aleatoria, masa, densidad, acumulada, cuantil y simulación), explica el sistema de prefijos d, p, q, r y muestra para cada concepto su fundamento teórico, su llamada en R y una situación de la ingeniería agrícola.

Regla del Lápiz y el Algoritmo. En cada sección primero se plantea el concepto y el cálculo que puede hacerse a mano (con la fórmula y la calculadora); luego R lo confirma. Si R y el cuaderno no coinciden, uno de los dos tiene un error, y encontrarlo es parte del aprendizaje. Los datos numéricos de los ejemplos son ilustrativos (no provienen de un ensayo real).


1. Fundamentos: experimento, espacio muestral y probabilidad

Un experimento aleatorio es un proceso cuyo resultado no puede predecirse con certeza, aunque sí se conoce el conjunto de resultados posibles: sembrar una semilla y observar si germina, o medir la lámina de lluvia de mañana.

  • El espacio muestral \(\Omega\) es el conjunto de todos los resultados posibles.
  • Un evento \(A\) es un subconjunto de \(\Omega\) (una afirmación que puede ser verdadera o falsa después de observar el resultado).
  • La probabilidad \(P\) es una función que asigna a cada evento un número, y debe cumplir los tres axiomas de Kolmogorov (1933):

\[ P(A) \ge 0, \qquad P(\Omega) = 1, \qquad P\!\left(\bigcup_{i} A_i\right) = \sum_{i} P(A_i) \ \ \text{si los } A_i \text{ son mutuamente excluyentes.} \]

De estos tres axiomas se deducen todas las reglas que se usan a diario: \(P(\emptyset)=0\), \(0 \le P(A) \le 1\), el complemento \(P(A^c) = 1 - P(A)\) y la regla de la unión \(P(A \cup B) = P(A) + P(B) - P(A \cap B)\). Si dos eventos son independientes, \(P(A \cap B) = P(A)\,P(B)\) (la probabilidad condicional se trabajó en la guía de tablas de contingencia).

Interpretación. La lectura frecuentista dice que \(P(A)\) es el valor al que se acerca la frecuencia relativa de \(A\) cuando el experimento se repite muchas veces (Ley de los Grandes Números). Es la que usaremos en la simulación (prefijo r). Existe también la lectura subjetiva o bayesiana (grado de creencia), que se estudiará más adelante.

Ejemplo a mano y en R: tres semillas

Cada semilla germina (G) con probabilidad \(0.85\) y no germina (N) con probabilidad \(0.15\), de forma independiente. El espacio muestral de sembrar tres semillas tiene \(2^3 = 8\) resultados; la probabilidad de cada uno es el producto (independencia).

p_germ <- 0.85
S <- expand.grid(semilla1 = c("G", "N"), semilla2 = c("G", "N"), semilla3 = c("G", "N"),
                 stringsAsFactors = FALSE)
S$n_germinan   <- rowSums(S[, 1:3] == "G")
S$probabilidad <- apply(S[, 1:3], 1, function(r) prod(ifelse(r == "G", p_germ, 1 - p_germ)))
knitr::kable(S, digits = 6, align = "c")
semilla1 semilla2 semilla3 n_germinan probabilidad
G G G 3 0.614125
N G G 2 0.108375
G N G 2 0.108375
N N G 1 0.019125
G G N 2 0.108375
N G N 1 0.019125
G N N 1 0.019125
N N N 0 0.003375
sum(S$probabilidad)      # axioma 2: P(Omega) = 1
## [1] 1

Ahora sumamos las probabilidades de los resultados que comparten el mismo número de semillas germinadas. Por ejemplo, “exactamente 2” ocurre de \(\binom{3}{2}=3\) maneras, cada una con probabilidad \(0.85^2 \times 0.15\), así que \(P = 3 \times 0.7225 \times 0.15 = 0.3251\) (axioma 3: se suman eventos excluyentes).

tabla_X <- aggregate(probabilidad ~ n_germinan, data = S, FUN = sum)
tabla_X$dbinom_R <- dbinom(tabla_X$n_germinan, size = 3, prob = p_germ)
knitr::kable(tabla_X, digits = 6, align = "c")
n_germinan probabilidad dbinom_R
0 0.003375 0.003375
1 0.057375 0.057375
2 0.325125 0.325125
3 0.614125 0.614125

La columna dbinom_R coincide con la enumeración: dbinom() es este mismo cálculo hecho de forma automática, sin escribir los \(2^n\) resultados.


2. Variable aleatoria: pasar de resultados a números

Trabajar con letras (G, N) es incómodo. Una variable aleatoria \(X\) es una función \(X:\Omega \to \mathbb{R}\) que asigna un número a cada resultado. En el ejemplo, \(X\) = “número de semillas que germinan” (0, 1, 2 o 3). Todas las funciones d, p, q, r de R operan sobre \(X\), no sobre \(\Omega\).

Discreta Continua
Valores posibles Un conjunto finito o contable (\(0, 1, 2, \dots\)) Un intervalo de números reales
Cómo se obtiene Se cuenta Se mide
Ejemplos agrícolas Semillas germinadas de \(n\); fallas de una bomba por semestre; plantas enfermas en una muestra Rendimiento (t/ha); lámina de lluvia (mm); conductividad eléctrica del agua (dS/m)
Objeto que describe la probabilidad Función de masa \(p(x)\) Función de densidad \(f(x)\)
Familias en R (ejemplos) binom, pois, geom, hyper norm, unif, exp, gamma, weibull, lnorm, beta

Nota de modelación. Ninguna medición real es perfectamente continua: un instrumento reporta “6.0 t/ha” cuando en realidad significa “entre 5.95 y 6.05”. Usamos modelos continuos porque son una aproximación cómoda y muy precisa de mediciones con muchos decimales posibles.


3. Cuatro preguntas, cuatro funciones

Toda pregunta de probabilidad sobre una variable aleatoria cae en una de estas cuatro. En R, cada una se responde anteponiendo una letra al nombre de la familia de distribución (norm, binom, exp, …):

Prefijo Significa Pregunta que responde Objeto matemático Nombre del primer argumento
d density (masa o densidad) ¿Qué tan probable es este valor? (discreta) / ¿qué tan concentrada está la probabilidad aquí? (continua) \(p(x) = P(X=x)\) · \(f(x)\) x
p probability (acumulada) ¿Cuál es la probabilidad de no superar \(x\)? \(F(x) = P(X \le x)\) q
q quantile (cuantil) ¿Qué valor deja a su izquierda una probabilidad \(p\)? (operación inversa de p) \(Q(p) = F^{-1}(p)\) p
r random (aleatorio) Genera \(n\) valores simulados de la distribución \(X_1, \dots, X_n \sim F\) n

Un truco práctico: el nombre del primer argumento te dice qué se está preguntando. dnorm(x = ...) recibe un valor, pnorm(q = ...) recibe una magnitud y devuelve una probabilidad, qnorm(p = ...) recibe una probabilidad y devuelve una magnitud, rnorm(n = ...) recibe un tamaño de muestra.

Las siguientes secciones desarrollan cada una con dos ejemplos que usaremos durante toda la guía:

  • Discreto (Binomial). De \(n = 10\) semillas sembradas en una bandeja, cada una germina con probabilidad \(0.85\); \(X\) = número de plántulas que emergen.
  • Continuo (Normal). El rendimiento de arroz bajo riego de una parcela, \(X \sim \text{Normal}(\mu = 6.0\ \text{t/ha},\ \sigma = 0.8\ \text{t/ha})\).

4. Prefijo d: función de masa y función de densidad

4.1 Variable discreta: función de masa de probabilidad (PMF)

La función de masa \(p(x) = P(X = x)\) asigna probabilidad directamente a cada valor posible. Cumple \(p(x) \ge 0\) y \(\sum_x p(x) = 1\).

Para el conteo de éxitos en \(n\) ensayos independientes, cada uno con probabilidad de éxito \(\pi\), la masa es la Binomial:

\[ P(X = k) = \binom{n}{k}\,\pi^{k}\,(1-\pi)^{\,n-k}, \qquad k = 0, 1, \dots, n \]

El término \(\pi^k(1-\pi)^{n-k}\) es la probabilidad de una secuencia con \(k\) éxitos (independencia), y \(\binom{n}{k}\) cuenta cuántas secuencias distintas hay (es el “3” que obtuvimos en la Sección 1). Su media es \(n\pi\) y su varianza \(n\pi(1-\pi)\).

A mano: \(P(X = 8) = \binom{10}{8}\,0.85^{8}\,0.15^{2} = 45 \times 0.2725 \times 0.0225 \approx 0.2759\).

n <- 10; pi_germ <- 0.85
 
dbinom(8, size = n, prob = pi_germ)                 # d: P(X = 8)
## [1] 0.2758967
choose(10, 8) * 0.85^8 * 0.15^2                     # la fórmula escrita a mano
## [1] 0.2758967
k <- 0:n
barplot(dbinom(k, size = n, prob = pi_germ), names.arg = k, col = "steelblue",
        xlab = "Plántulas emergidas k (de 10 semillas)", ylab = "P(X = k)",
        main = "Masa Binomial(n = 10, p = 0.85): la probabilidad está en cada barra")

Ingeniería agrícola: la masa responde “¿qué tan probable es que emerjan exactamente 8 plántulas?” y, por tanto, sirve para dimensionar reposiciones de plántulas o repeticiones en un ensayo.

4.2 Variable continua: función de densidad de probabilidad (PDF)

En una variable continua hay infinitos valores posibles en cualquier intervalo, así que la probabilidad de un valor exacto es cero. La probabilidad se asigna a intervalos, mediante el área bajo una curva \(f(x)\), la densidad:

\[ P(a \le X \le b) = \int_a^b f(x)\,dx, \qquad f(x) \ge 0, \qquad \int_{-\infty}^{\infty} f(x)\,dx = 1 \]

Consecuencias que conviene interiorizar:

  1. \(P(X = x) = \int_x^x f(t)\,dt = 0\) para todo \(x\). En variables continuas solo los intervalos tienen probabilidad.
  2. \(f(x)\) no es una probabilidad: es una probabilidad por unidad de \(x\), porque \(P(x \le X \le x + dx) \approx f(x)\,dx\). Sus unidades son el inverso de las unidades de \(X\) (aquí, ha/t).
  3. Por eso \(f(x)\) puede ser mayor que 1. Solo el área está limitada a 1.

La densidad Normal es

\[ f(x) = \frac{1}{\sigma\sqrt{2\pi}}\;\exp\!\left[-\frac{(x-\mu)^2}{2\sigma^2}\right] \]

A mano: en el centro, \(f(6) = \dfrac{1}{0.8\sqrt{2\pi}} \approx 0.4987\) (ha/t). Ese valor no es la probabilidad de obtener exactamente 6 t/ha.

mu <- 6; sigma <- 0.8
 
dnorm(6, mean = mu, sd = sigma)              # d: altura de la curva en 6
## [1] 0.4986779
1 / (sigma * sqrt(2 * pi))                   # la fórmula a mano en x = mu
## [1] 0.4986779
# La densidad es "probabilidad por unidad": franja estrecha alrededor de 6, dividida por su ancho
(pnorm(6.01, mu, sigma) - pnorm(5.99, mu, sigma)) / 0.02
## [1] 0.4986649
# Una densidad puede pasar de 1: tiempo (h) de espera uniforme entre 0 y 0.5 h -> f = 1/0.5 = 2 (1/h)
dunif(0.25, min = 0, max = 0.5)
## [1] 2

La franja de 0.02 t/ha alrededor de 6 contiene solo cerca de 1% de probabilidad (\(0.4987 \times 0.02 \approx 0.00997\)): la altura de la curva multiplicada por un ancho produce una probabilidad.

Ingeniería agrícola: la densidad describe cómo se reparte el rendimiento (dónde se concentra y qué tan dispersa es la cosecha) y es la base de los ajustes de distribuciones a datos de campo.


5. Prefijo p: función de distribución acumulada (CDF)

La función de distribución acumulada responde la pregunta más frecuente en ingeniería: “¿cuál es la probabilidad de no superar un umbral?”

\[ F(x) = P(X \le x) = \begin{cases} \displaystyle\sum_{t \le x} p(t) & \text{si } X \text{ es discreta (suma de barras)} \\[2ex] \displaystyle\int_{-\infty}^{x} f(t)\,dt & \text{si } X \text{ es continua (área acumulada)} \end{cases} \]

La CDF es el objeto unificador de la teoría: existe para cualquier variable aleatoria y la determina por completo, mientras que la masa y la densidad son derivados de ella. Toda CDF cumple:

  • es no decreciente (acumular probabilidad nunca la reduce);
  • \(F(x) \to 0\) cuando \(x \to -\infty\) y \(F(x) \to 1\) cuando \(x \to +\infty\) (nunca sale del rango \([0,1]\));
  • es continua por la derecha;
  • en una variable discreta es una escalera: cada escalón en \(k\) tiene altura \(P(X=k) = F(k) - F(k-1)\);
  • en una variable continua es una curva sin saltos, y la densidad es su pendiente: \(f(x) = F'(x)\).

Con la CDF se calcula cualquier probabilidad de intervalo:

Probabilidad buscada En términos de \(F\) Llamada en R (familia norm)
\(P(X \le a)\) \(F(a)\) pnorm(a, mu, sigma)
\(P(X > a)\) \(1 - F(a)\) pnorm(a, mu, sigma, lower.tail = FALSE)
\(P(a < X \le b)\) \(F(b) - F(a)\) pnorm(b, mu, sigma) - pnorm(a, mu, sigma)
\(P(X = k)\), solo discreta \(F(k) - F(k-1)\) dbinom(k, ...)
\(P(X < k)\), solo discreta (enteros) \(F(k-1)\) pbinom(k - 1, ...)

Trampa clásica en discretas. En una variable continua, \(P(X<a) = P(X \le a)\) (el punto no pesa). En una discreta sí pesa: \(P(X < 8) = F(7)\), no \(F(8)\). En R, pbinom(8, ...) incluye el 8.

5.1 Discreta: la escalera de las semillas

k <- 0:10
tabla_bin <- data.frame(k = k,
                        `P(X = k)`  = round(dbinom(k, n, pi_germ), 4),
                        `F(k) = P(X <= k)` = round(pbinom(k, n, pi_germ), 4),
                        check.names = FALSE)
knitr::kable(tabla_bin, align = "c")
k P(X = k) F(k) = P(X <= k)
0 0.0000 0.0000
1 0.0000 0.0000
2 0.0000 0.0000
3 0.0001 0.0001
4 0.0012 0.0014
5 0.0085 0.0099
6 0.0401 0.0500
7 0.1298 0.1798
8 0.2759 0.4557
9 0.3474 0.8031
10 0.1969 1.0000
# La CDF discreta es la suma acumulada de las barras
all.equal(pbinom(k, n, pi_germ), cumsum(dbinom(k, n, pi_germ)))
## [1] TRUE
pbinom(8, n, pi_germ)                          # P(X <= 8)
## [1] 0.4557002
pbinom(8, n, pi_germ, lower.tail = FALSE)      # P(X >= 9) = 1 - F(8)
## [1] 0.5442998
pbinom(7, n, pi_germ)                          # P(X <  8) = F(7)  (no F(8))
## [1] 0.1798035
# Escalera: se parte de x = -1 para que el gráfico arranque en F = 0
x <- -1:11
plot(x, pbinom(x, n, pi_germ), type = "s", lwd = 2, col = "steelblue4",
     xlab = "Plántulas emergidas k", ylab = "F(k) = P(X <= k)",
     main = "CDF Binomial(10, 0.85): cada escalón mide P(X = k)")
points(0:10, pbinom(0:10, n, pi_germ), pch = 19, col = "steelblue4")

A mano: \(P(X \le 8) = 1 - P(X=9) - P(X=10) = 1 - 0.3474 - 0.1969 = 0.4557\).

5.2 Continua: el área acumulada del rendimiento

# P(X < 5 t/ha), P(X > 7 t/ha), P(5 < X < 7 t/ha)
p_menor_5 <- pnorm(5, mu, sigma)
p_mayor_7 <- pnorm(7, mu, sigma, lower.tail = FALSE)
p_entre   <- pnorm(7, mu, sigma) - pnorm(5, mu, sigma)
round(c("P(X<5)" = p_menor_5, "P(X>7)" = p_mayor_7, "P(5<X<7)" = p_entre), 4)
##   P(X<5)   P(X>7) P(5<X<7) 
##   0.1056   0.1056   0.7887
par(mfrow = c(1, 2))
x  <- seq(3, 9, length.out = 400)
xs <- seq(3, 5, length.out = 100)
 
plot(x, dnorm(x, mu, sigma), type = "l", lwd = 2, col = "steelblue4",
     xlab = "Rendimiento (t/ha)", ylab = "Densidad f(x)",
     main = "PDF: la probabilidad es un ÁREA")
polygon(c(xs, rev(xs)), c(dnorm(xs, mu, sigma), rep(0, length(xs))),
        col = adjustcolor("steelblue", 0.5), border = NA)
text(6.7, 0.15, sprintf("Área sombreada\nP(X < 5) = %.4f", p_menor_5), adj = 0)
 
plot(x, pnorm(x, mu, sigma), type = "l", lwd = 2, col = "steelblue4",
     xlab = "Rendimiento (t/ha)", ylab = "F(x) = P(X <= x)",
     main = "CDF: el área acumulada")
segments(3, p_menor_5, 5, p_menor_5, lty = 2, col = "red")
segments(5, 0, 5, p_menor_5, lty = 2, col = "red")

par(mfrow = c(1, 1))

A mano (estandarización): \(z = \dfrac{5 - 6}{0.8} = -1.25\) y en la tabla \(\Phi(-1.25) = 0.1056\). Por simetría, \(P(X>7) = P(Z > 1.25) = 0.1056\) también, y \(P(5<X<7) = 1 - 2(0.1056) = 0.7887\).

Ingeniería agrícola: con una probabilidad de 10.56% el rendimiento cae por debajo de 5 t/ha: es una medida de riesgo de no alcanzar un umbral de rentabilidad.


6. Prefijo q: cuantiles, la operación inversa

La CDF traduce magnitud → probabilidad. El cuantil hace lo contrario, probabilidad → magnitud: dado \(p\), busca el valor \(x_p\) que deja a su izquierda una probabilidad \(p\).

\[ Q(p) = \inf\{\,x : F(x) \ge p\,\} \]

  • En una variable continua con \(F\) estrictamente creciente, esa definición es simplemente la inversa \(Q(p) = F^{-1}(p)\), es decir, se resuelve \(F(x_p) = p\) (en la Normal: \(x_p = \mu + z_p\,\sigma\)).
  • En una variable discreta, \(F\) es una escalera y casi nunca toma exactamente el valor \(p\); por eso el cuantil es el menor valor \(x\) cuya acumulada alcanza o supera \(p\). Consecuencia: \(F(Q(p)) \ge p\), con “sobrante” de probabilidad.

Casos particulares con nombre propio: la mediana (\(p = 0.5\)), los cuartiles (\(0.25, 0.5, 0.75\)), los percentiles (\(p\) en porcentaje) y los valores críticos de la inferencia estadística (por ejemplo \(z_{0.975} = 1.96\)).

Ingeniería agrícola: el cuantil convierte un nivel de confianza en una magnitud de diseño: ¿qué caudal debe evacuar el canal para que se desborde solo 1 de cada 100 veces? ¿qué rendimiento se supera en el 90% de las campañas?

# Continua: rendimiento superado en el 90% de las campañas (10% por debajo)
qnorm(0.10, mu, sigma)                           # valor con 10% a su izquierda
## [1] 4.974759
qnorm(0.90, mu, sigma, lower.tail = FALSE)       # lo mismo, pidiendo el 90% a la DERECHA
## [1] 4.974759
qnorm(c(0.025, 0.50, 0.975), mu, sigma)          # límites del 95% central y la mediana
## [1] 4.432029 6.000000 7.567971
mu + qnorm(0.10) * sigma                         # fórmula a mano: x_p = mu + z_p * sigma
## [1] 4.974759
# Discreta: ¿cuál es el menor k con F(k) >= 0.05?
qbinom(0.05, n, pi_germ)
## [1] 7
pbinom(c(6, 7), n, pi_germ)                      # F(6) = 0.04997 < 0.05 <= F(7) = 0.1798
## [1] 0.0499698 0.1798035
pbinom(6, n, pi_germ, lower.tail = FALSE)        # P(X >= 7) = 0.9500: al menos 7 plántulas en 95% de las bandejas
## [1] 0.9500302
# Ida y vuelta: en continuas es exacto; en discretas p(q(p)) >= p
pnorm(qnorm(0.10, mu, sigma), mu, sigma)
## [1] 0.1
pbinom(qbinom(0.05, n, pi_germ), n, pi_germ)
## [1] 0.1798035
par(mfrow = c(1, 2))
xb <- -1:11
plot(xb, pbinom(xb, n, pi_germ), type = "s", lwd = 2, col = "steelblue4",
     xlab = "Plántulas emergidas k", ylab = "F(k)", main = "Cuantil discreto p = 0.05")
abline(h = 0.05, lty = 2, col = "red"); abline(v = qbinom(0.05, n, pi_germ), lty = 2, col = "red")
 
q10 <- qnorm(0.10, mu, sigma)
plot(x, pnorm(x, mu, sigma), type = "l", lwd = 2, col = "steelblue4",
     xlab = "Rendimiento (t/ha)", ylab = "F(x)", main = "Cuantil continuo p = 0.10")
segments(3, 0.10, q10, 0.10, lty = 2, col = "red"); segments(q10, 0, q10, 0.10, lty = 2, col = "red")

par(mfrow = c(1, 1))

Interpretación: en el 90% de las campañas el rendimiento supera 4.97 t/ha; y en el 95% de las bandejas emergen al menos 7 de las 10 plántulas.


7. Prefijo r: simulación

Las funciones r generan valores pseudoaleatorios: los produce un algoritmo determinista, pero se comportan estadísticamente como una muestra genuina de la distribución. Fundamentan el método de Monte Carlo: cuando una probabilidad es difícil de calcular, se simula muchas veces y se cuenta la fracción de veces que ocurre el evento.

Dos ideas teóricas sostienen la simulación:

  1. Ley de los Grandes Números. La frecuencia relativa de un evento en \(n\) repeticiones converge a \(P(A)\) cuando \(n \to \infty\).
  2. Transformada inversa. Si \(U \sim \text{Uniforme}(0,1)\), entonces \(Q(U)\) tiene exactamente la distribución \(F\). (R usa algoritmos especializados para cada familia por eficiencia, pero el resultado es la misma distribución.) Esto explica por qué la operación q y la operación r están emparentadas.

set.seed() fija la semilla del generador para que los resultados sean reproducibles (tu resultado y el de tu compañero coinciden si usan la misma semilla).

set.seed(2026)
 
# Ley de los Grandes Números: frecuencia relativa de "X < 5" vs probabilidad teórica
n_sim <- c(10, 100, 1000, 100000)
frec  <- sapply(n_sim, function(m) mean(rnorm(m, mu, sigma) < 5))
data.frame(n_simulaciones = n_sim, frecuencia_relativa = frec,
           probabilidad_teorica = round(pnorm(5, mu, sigma), 4))
# Transformada inversa: qnorm(runif(.)) produce una muestra Normal(6, 0.8)
u     <- runif(100000)
x_inv <- qnorm(u, mean = mu, sd = sigma)
round(c(media = mean(x_inv), desv_est = sd(x_inv), `P(X<5)` = mean(x_inv < 5)), 3)
##    media desv_est   P(X<5) 
##    5.996    0.800    0.106
hist(x_inv, breaks = 60, freq = FALSE, col = "grey85", border = "white",
     xlab = "Rendimiento simulado (t/ha)", main = "Histograma de qnorm(runif(.)) y densidad teórica")
curve(dnorm(x, mu, sigma), add = TRUE, col = "steelblue4", lwd = 2)

Los valores simulados quedan cerca de los teóricos, no idénticos: toda muestra tiene ruido, y con más simulaciones el acuerdo mejora.


8. El sistema de prefijos en R: familias, argumentos y trampas

8.1 Las familias

El nombre de cada función es prefijo + familia. Cambiar de distribución solo cambia el sufijo y los parámetros; la lógica de d, p, q, r es idéntica.

Sufijo Distribución Parámetros en R Tipo Ejemplo en ingeniería agrícola
binom Binomial size, prob discreta Semillas que germinan de \(n\) sembradas
pois Poisson lambda discreta Fallas de una bomba por semestre; insectos por trampa
geom Geométrica prob discreta Plantas sanas revisadas antes de encontrar la primera enferma (R cuenta los fracasos previos al primer éxito)
hyper Hipergeométrica m, n, k discreta Muestreo sin reposición en un lote finito
unif Uniforme min, max continua Punto de muestreo al azar dentro de una parcela
norm Normal mean, sd continua Rendimiento, peso de frutos, temperatura
lnorm Lognormal meanlog, sdlog continua Conductividad hidráulica del suelo (asimétrica, positiva)
exp Exponencial rate continua Tiempo entre eventos; lámina de un día lluvioso
gamma Gamma shape, rate o scale continua Precipitación acumulada; tiempo hasta \(\alpha\) eventos
weibull Weibull shape, scale continua Velocidad del viento; vida útil de emisores
beta Beta shape1, shape2 continua en \([0,1]\) Proporciones: cobertura vegetal, fracción de área afectada
t, chisq, f \(t\), \(\chi^2\), \(F\) df (y df1, df2) continua Inferencia: intervalos de confianza, pruebas y ANOVA

Las tres últimas familias son las protagonistas de Diseño Experimental: el valor crítico de un intervalo de confianza es qt(0.975, df) y el \(p\)-valor de una prueba F del ANOVA es pf(F_obs, df1, df2, lower.tail = FALSE).

8.2 Anatomía de las cuatro funciones

Para una familia genérica xxx:

dxxx(x, <parámetros>, log = FALSE)                       # masa o densidad
pxxx(q, <parámetros>, lower.tail = TRUE, log.p = FALSE)  # acumulada P(X <= q)
qxxx(p, <parámetros>, lower.tail = TRUE, log.p = FALSE)  # cuantil
rxxx(n, <parámetros>)                                    # simulación de n valores

Los argumentos opcionales:

  • lower.tail = FALSE devuelve \(P(X > q)\) en vez de \(P(X \le q)\); en q invierte el sentido del cuantil. Es más preciso numéricamente que 1 - pxxx(...) en las colas (probabilidades muy pequeñas).
  • log = TRUE / log.p = TRUE devuelven el logaritmo de la densidad o de la probabilidad. Se usa al multiplicar muchas densidades (la verosimilitud de una muestra): sumar logaritmos evita que el producto se redondee a 0.

Y todas las funciones están vectorizadas: reciben un vector y devuelven un vector.

# La MISMA familia con los cuatro prefijos
dnorm(6, mean = 6, sd = 0.8)                 # d: altura de la curva en 6
## [1] 0.4986779
pnorm(5, mean = 6, sd = 0.8)                 # p: P(X <= 5)
## [1] 0.1056498
qnorm(0.10, mean = 6, sd = 0.8)              # q: valor con 10% a su izquierda
## [1] 4.974759
set.seed(1); rnorm(5, mean = 6, sd = 0.8)    # r: 5 rendimientos simulados
## [1] 5.498837 6.146915 5.331497 7.276225 6.263606
# Vectorización: una tabla completa en una sola llamada
umbral <- c(4, 5, 6, 7, 8)
knitr::kable(data.frame(umbral_t_ha = umbral,
                        `P(X <= umbral)` = round(pnorm(umbral, mu, sigma), 4),
                        `P(X > umbral)`  = round(pnorm(umbral, mu, sigma, lower.tail = FALSE), 4),
                        check.names = FALSE), align = "c")
umbral_t_ha P(X <= umbral) P(X > umbral)
4 0.0062 0.9938
5 0.1056 0.8944
6 0.5000 0.5000
7 0.8944 0.1056
8 0.9938 0.0062
# log = TRUE: verosimilitud de una muestra pequeña de rendimientos
muestra <- c(5.2, 6.1, 5.8, 6.6, 7.0)
prod(dnorm(muestra, mu, sigma))                          # producto de densidades
## [1] 0.006216567
exp(sum(dnorm(muestra, mu, sigma, log = TRUE)))          # mismo valor, calculado con logaritmos
## [1] 0.006216567

8.3 Trampas con los parámetros

Trampa Qué ocurre Cómo evitarla
Desviación vs. varianza dnorm, pnorm, … reciben sd, no \(\sigma^2\). Si el enunciado da la varianza, usar sd = sqrt(varianza).
rate vs. scale La Exponencial y la Gamma usan rate \(= 1/\text{escala}\). Una Exponencial de media 20 es rate = 1/20. En scipy se usa scale = 20. Nombrar siempre el argumento: pgamma(100, shape = 2.5, scale = 20).
Discreta: \(<\) vs. \(\le\) pbinom(8, ...) incluye el 8. Para \(P(X<8)\) usar pbinom(7, ...).
Argumento sin nombre Un tercer valor “suelto” se lee en el orden de la ayuda, no en el que uno supone. Nombrar los parámetros; consultar ?pnorm.
Lognormal meanlog y sdlog son la media y desviación del logaritmo, no de la variable. Recordar que \(\ln X \sim \text{Normal}(\text{meanlog},\text{sdlog})\).

8.4 Piedra Rosetta: R frente a scipy.stats

Concepto R Python (scipy.stats)
Masa (discretas) dbinom(k, size, prob) binom.pmf(k, n, p)
Densidad (continuas) dnorm(x, mean, sd) norm.pdf(x, loc, scale)
Acumulada pnorm(q, mean, sd) norm.cdf(x, loc, scale)
Cola superior pnorm(q, ..., lower.tail = FALSE) norm.sf(x, loc, scale)
Cuantil qnorm(p, mean, sd) norm.ppf(p, loc, scale)
Simulación rnorm(n, mean, sd) norm.rvs(loc, scale, size=n)

Nótese que scipy no usa prefijos: cada distribución es un objeto y pmf, pdf, cdf, sf, ppf y rvs son sus métodos.


9. Cómo se conectan las cuatro funciones

Las cuatro funciones son cuatro vistas de una misma distribución. Las relaciones se resumen así:

Relación Enunciado Comprobación numérica en R
Densidad → acumulada \(F(b) - F(a) = \int_a^b f(x)\,dx\) pnorm(7) - pnorm(5) frente a integrate(dnorm, 5, 7)
Acumulada → densidad \(f(x) = F'(x)\) pendiente numérica de pnorm frente a dnorm
Acumulada ↔︎ cuantil \(F(Q(p)) = p\) y \(Q(F(x)) = x\) (continuas) pnorm(qnorm(p))
Masa → acumulada (discreta) \(P(X=k) = F(k) - F(k-1)\) pbinom(8) - pbinom(7) frente a dbinom(8)
Cuantil → simulación \(Q(U) \sim F\) con \(U \sim \text{Unif}(0,1)\) qnorm(runif(n)) frente a rnorm(n)
h <- 1e-6
 
# (1) Densidad -> acumulada
c(por_F = pnorm(7, mu, sigma) - pnorm(5, mu, sigma),
  por_integral = integrate(dnorm, lower = 5, upper = 7, mean = mu, sd = sigma)$value)
##        por_F por_integral 
##    0.7887005    0.7887005
# (2) Acumulada -> densidad: derivada numérica de F en x = 5
c(derivada_de_F = (pnorm(5 + h, mu, sigma) - pnorm(5 - h, mu, sigma)) / (2 * h),
  densidad = dnorm(5, mu, sigma))
## derivada_de_F      densidad 
##     0.2283114     0.2283114
# (3) Acumulada <-> cuantil
c(p_de_q = pnorm(qnorm(0.10, mu, sigma), mu, sigma),
  q_de_p = qnorm(pnorm(5, mu, sigma), mu, sigma))
## p_de_q q_de_p 
##    0.1    5.0
# (4) Masa = salto de la acumulada (discreta)
c(salto_de_F = pbinom(8, n, pi_germ) - pbinom(7, n, pi_germ),
  masa = dbinom(8, n, pi_germ))
## salto_de_F       masa 
##  0.2758967  0.2758967

10. Guía de decisión: de la pregunta de ingeniería a la llamada en R

# Pregunta de ingeniería Prefijo Llamada en R
1 ¿Probabilidad de que emerjan exactamente 8 de 10 plántulas? d dbinom(8, size = 10, prob = 0.85)
2 ¿Probabilidad de que emerjan a lo sumo 8? p pbinom(8, size = 10, prob = 0.85)
3 ¿Probabilidad de que emerjan 9 o más? p pbinom(8, 10, 0.85, lower.tail = FALSE)
4 ¿Número mínimo de plántulas que se alcanza o supera en el 95% de las bandejas? q qbinom(0.05, 10, 0.85)
5 ¿Probabilidad de que el rendimiento sea menor de 5 t/ha? p pnorm(5, mean = 6, sd = 0.8)
6 ¿Probabilidad de que el rendimiento supere 7 t/ha? p pnorm(7, 6, 0.8, lower.tail = FALSE)
7 ¿Rendimiento que se supera en el 90% de las campañas? q qnorm(0.10, 6, 0.8)
8 Simular 1000 campañas de rendimiento r rnorm(1000, mean = 6, sd = 0.8)
9 ¿Lámina de diseño de un canal que cubre el 90% de los días lluviosos (media 20 mm)? q qexp(0.90, rate = 1/20)
10 \(p\)-valor de un ANOVA con \(F_{obs}\), df1 y df2 grados de libertad p pf(F_obs, df1, df2, lower.tail = FALSE)
11 Valor crítico \(t\) para un intervalo de confianza del 95% con df grados de libertad q qt(0.975, df)

Cómo decidir en tres pasos: (1) ¿la variable se cuenta o se mide? (elige la familia); (2) ¿la pregunta es por un valor, por un umbral o por un percentil, o hay que simular? (elige el prefijo d, p, q o r); (3) ¿la probabilidad pedida es hacia la izquierda o hacia la derecha del umbral? (elige lower.tail).


11. Ejercicio de práctica: Lápiz y Algoritmo

Parte 1 — Germinación (Binomial). Se siembran 5 semillas por hoyo y cada una germina con probabilidad 0.90 (independientes). Sea \(X\) el número de semillas germinadas.

  1. Calcule a mano \(P(X = 5)\).

  2. Calcule a mano \(P(X \ge 4)\) (una suma de dos términos o un complemento).

  3. Si se quiere que la probabilidad de que al menos una semilla germine por hoyo sea \(\ge 0.999\), ¿cuántas semillas por hoyo se necesitan? (Pista: use el complemento y \(P(X=0) = 0.1^n\).)

Parte 2 — Salinidad del agua de riego (Normal). La conductividad eléctrica (CE) del agua de un pozo varía según \(X \sim \text{Normal}(\mu = 1.2\ \text{dS/m},\ \sigma = 0.3\ \text{dS/m})\).

  1. ¿Cuál es la probabilidad de que la CE supere 1.8 dS/m? (Estandarice: \(z = (1.8 - 1.2)/0.3\).)

  2. ¿Qué valor de CE no se supera el 95% del tiempo? (Use \(z_{0.95} = 1.645\).)

  3. ¿Cuál es la probabilidad de que la CE esté entre 0.9 y 1.5 dS/m? (Observe que es \(\mu \pm 1\sigma\).)

Predicción. Antes de abrir R, escriba el prefijo y la llamada completa para cada inciso:

Inciso Prefijo Llamada en R
a ___ ___
b ___ ___
c ___ ___
d ___ ___
e ___ ___
f ___ ___
Solución de referencia (docente)

a) \(P(X=5) = 0.9^5 = \mathbf{0.5905}\). b) \(P(X \ge 4) = P(4) + P(5) = 5(0.9^4)(0.1) + 0.5905 = 0.3281 + 0.5905 = \mathbf{0.9185}\). c) \(1 - 0.1^n \ge 0.999 \Rightarrow 0.1^n \le 0.001 \Rightarrow n \ge 3\); se necesitan 3 semillas por hoyo.

d) \(z = 2.0\), \(P(Z>2) = \mathbf{0.0228}\). e) \(x_{0.95} = 1.2 + 1.645 \times 0.3 = \mathbf{1.693}\) dS/m. f) \(P(-1 < Z < 1) = \mathbf{0.6827}\).

Inciso Prefijo Llamada en R
a d dbinom(5, size = 5, prob = 0.9)
b p pbinom(3, size = 5, prob = 0.9, lower.tail = FALSE)
c p 1 - dbinom(0, size = 3, prob = 0.9) (o pbinom(0, 3, 0.9, lower.tail = FALSE))
d p pnorm(1.8, mean = 1.2, sd = 0.3, lower.tail = FALSE)
e q qnorm(0.95, mean = 1.2, sd = 0.3)
f p pnorm(1.5, 1.2, 0.3) - pnorm(0.9, 1.2, 0.3)

Verificación: escriba en A_mano los resultados de su cuaderno y ejecute el chunk; una diferencia distinta de cero indica dónde revisar.

comparacion <- data.frame(
  Inciso = c("a) P(X = 5)", "b) P(X >= 4)", "c) n mínimo", "d) P(CE > 1.8)",
             "e) cuantil 0.95 (dS/m)", "f) P(0.9 < CE < 1.5)"),
  A_mano = rep(NA_real_, 6),     # <- ESCRIBA AQUÍ sus 6 resultados, p. ej. c(0.5905, 0.9185, 3, ...)
  R = round(c(dbinom(5, 5, 0.9),
              pbinom(3, 5, 0.9, lower.tail = FALSE),
              min(which(1 - dbinom(0, size = 1:10, prob = 0.9) >= 0.999 - 1e-9)),   # tolerancia por redondeo
              pnorm(1.8, 1.2, 0.3, lower.tail = FALSE),
              qnorm(0.95, 1.2, 0.3),
              pnorm(1.5, 1.2, 0.3) - pnorm(0.9, 1.2, 0.3)), 4)
)
comparacion$Diferencia <- round(comparacion$A_mano - comparacion$R, 4)
knitr::kable(comparacion, align = "lccc")
Inciso A_mano R Diferencia
a) P(X = 5) NA 0.5905 NA
b) P(X >= 4) NA 0.9185 NA
c) n mínimo NA 3.0000 NA
d) P(CE > 1.8) NA 0.0228 NA
e) cuantil 0.95 (dS/m) NA 1.6935 NA
f) P(0.9 < CE < 1.5) NA 0.6827 NA

12. Bitácora de IA (entrega)

Un asistente de IA puede generar código en R, pero usted es quien verifica: entender qué calcula cada función es lo que permite detectar cuándo el código corre pero responde otra pregunta (por ejemplo, un lower.tail invertido o un rate en lugar de un scale). Un prompt sugerido:

“Actúa como profesor de estadística aplicada a la ingeniería agrícola. Resolví a mano dos ejercicios: una Binomial (5 semillas, p = 0.90) y una Normal (CE del agua de riego con media 1.2 y desviación 0.3 dS/m). Explícame para cada pregunta si corresponde el prefijo d, p, q o r, y dame el código en R para verificar mis resultados. No me des respuestas numéricas sin mostrar la llamada a R.”

Responda en 5 a 8 líneas:

  1. ¿Coincidieron todos sus resultados manuscritos con R? Si alguno no coincidió, ¿dónde estaba el error: en el cuaderno, en el código de la IA o en un argumento (lower.tail, rate vs. scale, \(<\) vs. \(\le\) en discretas)?
  2. Con sus palabras: ¿por qué en una variable continua se pregunta por un umbral o un cuantil y no por un valor exacto? ¿En qué se diferencia dbinom() de dnorm()?
  3. Dé un ejemplo de su propia carrera (Ingeniería Agrícola) donde usaría cada uno de los cuatro prefijos.
  4. Declare qué parte del código fue generada por IA y cómo comprobó que era correcta.