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).
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.
\[ 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.
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.
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.
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:
d: función de masa y función de
densidadLa 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.
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:
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.
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:
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.
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\).
# 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.
q: cuantiles, la operación inversaLa 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\,\} \]
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.
r: simulaciónLas 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:
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.
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).
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
| 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})\). |
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.
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
| # | 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).
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.
Calcule a mano \(P(X = 5)\).
Calcule a mano \(P(X \ge 4)\) (una suma de dos términos o un complemento).
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})\).
¿Cuál es la probabilidad de que la CE supere 1.8 dS/m? (Estandarice: \(z = (1.8 - 1.2)/0.3\).)
¿Qué valor de CE no se supera el 95% del tiempo? (Use \(z_{0.95} = 1.645\).)
¿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 | ___ | ___ |
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 |
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:
lower.tail, rate
vs. scale, \(<\)
vs. \(\le\) en discretas)?dbinom() de
dnorm()?