R.Las distribuciones de probabilidad en general son ecuaciones (pueden ser tablas también) que relacionan el resultado de un experimento o procedimiento de muestreo con la probabilidad de su ocurrencia. R tiene funciones para todas las distribuciones de probabilidad estándares, y para cada una de estas distribuciones tenemos funciones para:
Estas funciones comienzan con las letras r, d ,p y q respectivamente. Por ejemplo, para la distribución de Possion tenemos: rpois, dpois, ppois, y qpois.
En muchos casos es útil poder generar valores (muestras) de una distribución en particular. Asumimos que estos valores generadas en la computadora son una “muestra aleatoria” pero en realidad provienen de un algoritmo que produce secuencias de números que parecen aleatorias por lo que es más correcto decir que son “pseudo-aleatorios”. Un aspecto importante, sobre todo pensando en la reproducibilidad de nuestro trabajo, es que si iniciamos al generador de números aleatorios con un valor determinado, la secuencia de números pseudo-aleatorios se va a repetir y por lo tanto podemos reproducir exactamente una simulación estocástica. Existen muchos algoritmos para generar números pseudo-aleatorios, pero en general no nos metemos demasiado en estos detalles y confiamos en que R sabe lo que hace.
En R usamos set.seed(12345) para inicializar el generador de números aleatorios en \(12345\). El número que le ponemos a set.seed es arbitrario pero debe ser un número entero.
ejemplo: simulamos una muestra de \(10\) valores de una distribución de Poisson con \(\lambda = 1.2\)
set.seed(12345)
rpois(n = 10, lambda = 1.2)## [1] 2 2 2 3 1 0 1 1 2 4
Nuestros scripts pueden ser más fáciles de leer y modificar si definimos variables por fuera de las funciones. Por ejemplo:
n <- 100
lambda <- 1.2Ahora simulamos datos y vemos la frecuencia en un histograma
y <- rpois(n = n, lambda = lambda)
hist(y, xlab = "Valores", main="")Una vez que tenemos “datos” como estos, podemos ver las frecuencias relativas y compararlas con la distribución teórica usando la función dpois.
f <- factor(y, levels = 0:max(y))
obsprobs <- table(f)/n
plot(obsprobs, xlab = "Valores", ylab = "Proporción")
tprobs <- dpois(x = 0:max(y), lambda = lambda)
points(0:max(y), tprobs, pch = 16, col = 2) Otra función útil es la Función de Distribución, que nos da la probabilidad de encontrar un valor menor o igual a un valor dado. Por ejemplo, la probabilidad de obtener \(y<=3\) con \(\lambda=\) 1.2 es:
ppois(3, lambda=lambda)## [1] 0.966231
Si queremos saber la probabilidad de obtener un valor mayor a 3 hacemos
1 - ppois(3, lambda=lambda)## [1] 0.03376897
Para ver la probabilidad de un valor en particular, por ejemplo \(y = 3\):
ppois(3, lambda = lambda) - ppois(2, lambda = lambda)## [1] 0.08674393
¿Por qué tiene sentido hacer lo de arriba? Pensadlo…
Podemos corroborar este resultado usando dpois
dpois(3, lambda = lambda)## [1] 0.08674393
El equivalente empírico de la función acumulada es la función ecdf:
eF <- ecdf(y)
plot(eF, xlab = "Valores", ylab = "Función de Probabilidad Empírica", main = "")
lines( 0:6, ppois(0:6, lambda = 1), type = "s", col = 2)Acumulada empírica y teórica para Poisson con \(\lambda =\) 1.2
Por último, la función cuantil qpois es la inversa de la función de distribución y para un valor de probabilidad acumulada nos devuelve el valor de la variable aleatoria
qpois(0.95, lambda = lambda) ## [1] 3
La función qpois sirve también para calcular intervalos que contienen un porcentaje de los valores de la distribución. Por ejemplo, el 95% de los valores están entre qpois(c(0.025,0.975) , lambda). El equivalente empírico es la función quantile
qpois(c(0.025, 0.975) , lambda)## [1] 0 4
quantile(y, probs = c(0.025, 0.975))## 2.5% 97.5%
## 0.000 3.525
Podemos hacer algo parecido a lo que hicimos con la distribución de Poisson para el arquetipo de las distribuciones continuas:
set.seed(1234)
n <- 1000
mu <- 0
sigma <- 1
y <- rnorm(n, mean = mu, sd = sigma)
hist(y, breaks = 40, freq = FALSE, main="")
# podemos agregar sobre este histograma una estimación de densidades
lines(density(y), lwd = 2, lty=3, col="darkgrey")
xvec <- seq(min(y)-0.5,max(y)+0.5, by=0.1) # secuencia de valores de referencia
lines(xvec, dnorm(xvec, mean = mu, sd = sigma), lwd = 2)Histograma de datos simulados, densidad empírica (en negro) y teórica (en rojo) de una distribución Normal con \(\mu=\) 0 y \(\sigma=\) 1
¿Cuál es la probabilidad de encontrar un valor “cercano” a cero? ¿por qué “cercano” y no igual?
dnorm(0, mean = mu, sd = sigma)## [1] 0.3989423
¿Cuál es la probabilidad de \(y > 1.96\)?
pnorm(1.96, mean = mu, sd = sigma, lower.tail = FALSE)## [1] 0.0249979
Y el intervalo de \(95 \%\)?
qnorm(c(0.025, 0.975), mean = mu, sd = sigma)## [1] -1.959964 1.959964
Objetivo: Revisar los conceptos básicos de remuestreo de datos
Estimación de la media e Intervalo de Confianza de datos de una distribución Gamma. Para remuestrear datos usamos la función sample.
datos <- rgamma(50,shape = 0.8,rate=1) # simulo 50 datos
n <- length(datos) # número de observaciones
B <- 2000 # número de muestras de bootstrap
theta_b <- numeric(B) # vector donde se van a guardar los resultados
for (i in 1:B){
y <- sample(datos, size = n, replace = TRUE) # bootstrap sample
theta_b[i] <- mean(y) # en gral hacemos algo más interesante aquí...
}
mb <- mean(theta_b)
mb## [1] 0.5297026
se <- sqrt(sum((theta_b-mb)^2)/ (B-1)) # esto es el desvío estándar de un estadistico muestreal
# lo podemos calcular directamente como sd(theta_b)
se## [1] 0.07746361
ci = quantile(theta_b,probs=c(0.025,0.975)) # intervalo que contiene el 95% de los valores
ci## 2.5% 97.5%
## 0.3814185 0.6815825