Funciones en R

En R podemos trabajar con las distribuciones de probabilidad usuales, ya sean continuas o discretas. Para ello, podemos recurrir a las siguientes 4 funciones específicas de R:

\[ \begin{array}{l|l|l|c} \text{Función} & \text{Significado} & \text{Uso}& \text{Observación}\\ \hline p & \text{probability} & \text{Calcula probabilidades acumuladas (cdf)} & \text{---}\\ q & \text{quantile} & \text{Calcula cuantiles (percentiles)} & \text{---}\\ d & \text{density} & \text{Calcula probabilidades puntuales} & \text{Sólo uso gráfico en el caso continuo}\\ r & \text{random} & \text{Genera datos aleatorios según una distribución específica} & \text{---}\\ \hline \end{array} \]

 

Ejemplos

Consideremos una variable aleatoria \(X\) con distribución normal, media igual a 50 y varianza igual a 25.

 

  1. Calcular la probabilidad de que \(X\) sea menor o igual a 48. Es decir, \(P(X\leq 48)\).
pnorm(48, mean = 50, sd = sqrt(25))
## [1] 0.3445783
# o bien podemos escribir de forma mas corta:
pnorm(48, 50, sqrt(25))
## [1] 0.3445783

Notemos que necesitamos la desviación típica en vez de la varianza.

 

  1. Calcular la probabilidad de que \(X\) sea mayor a 48. Esto es \(P(X> 48)\).
pnorm(48, mean = 50, sd = sqrt(25), lower.tail = FALSE)
## [1] 0.6554217

 

  1. Calcular la probabilidad de que \(X\) sea mauor o igual a 45 y menor que 55; es decir \(P(45\leq X < 55)\).

Notemos que: \[ P(45\leq X < 55)=P(X<55)-P(X\leq 45) \]

pnorm(55, 50, sqrt(25)) - pnorm(45, 50, sqrt(25))
## [1] 0.6826895

 

  1. ¿Cuál es el valor de \(X\) que deja a un 90% bajo él? \(P(X\leq x_0)=0,90\)
qnorm(0.90, mean = 50, sd = sqrt(25))
## [1] 56.40776

 

  1. Generemos un conjunto de 10 datos que sigan una distribución normal de media 50 y varianza 25:
# set.seed(...) se usa para fijar una generación aleatoria de datos
# ej: compile este código 3 veces con el set.seed() y vea que los resultados no cambian
# compile 3 veces sin el set.seed() y vea que sucede.
# No se asuste si en su computador obtiene resultados diferentes...es normal.

set.seed(123) 
rnorm(10, mean = 50, sd = sqrt(25))
##  [1] 47.19762 48.84911 57.79354 50.35254 50.64644 58.57532 52.30458 43.67469
##  [9] 46.56574 47.77169

 

  1. La función \(d\), en este caso \(dnorm()\) no tiene mucho uso cuando nos referimos a distribuciones continuas. Es más conveniente usar la función \(p\) en estos casos. Por ejemplo, para calcular la probabilidad de que \(X\) se encuentre entre 35 y 55 usamos el código:
pnorm(55, mean = 50, sd = sqrt(25)) - pnorm(35, mean = 50, sd = sqrt(25))
## [1] 0.8399948

 

  1. Sin embargo, podemos usar \(dnorm()\) para construir el gráfico de la distribución de probabilidad de \(X\) con la ayuda del comando \(curve\):
curve(dnorm(x, mean = 50, sd = sqrt(25)), xlim = c(35,65), xlab = "Valores de X", ylab = "Densidad de X")

 

Distribuciones Disponibles

Basta con ingresar distributions en la sección de ayuda para que se despliegue la información con todas las distribuciones disponibles.

Problemas Resueltos

Problema 1 (Binomial)

Suponga que hay 12 preguntas de selección múltiple en un test de estadística. Cada pregunta tiene 5 alternativas, y solo una de ellas es correcta. Calcular la probabilidad de obtener 4 o menos respuestas correctas si un estudiante cualquiera responde el test al azar.

Existen diversas formas de resolver este problema en R:

# Método largo
dbinom(0, size=12, prob=0.2)+
dbinom(1, size=12, prob=0.2)+
dbinom(2, size=12, prob=0.2)+
dbinom(3, size=12, prob=0.2)+ 
dbinom(4, size=12, prob=0.2)
## [1] 0.9274445
# Método menos largo
sum(dbinom(x = 0:4, size = 12, prob = 0.2))
## [1] 0.9274445
# Método inteligente: usar distribución acumulada
pbinom(4, size = 12, prob = 0.2)
## [1] 0.9274445
# la probabilidad de tener más de 4 buenas
pbinom(4, size = 12, prob = 0.2, lower.tail = FALSE )
## [1] 0.0725555

La distribución de probabilidades respectiva puede obtenerse mediante un gráfico de barras:

barplot(dbinom(x = 0:12, size = 12, prob = 0.2), names.arg = 0:12)

 

Problema 2 (Poisson)

Si en promedio hay 12 autos por minuto cruzando un determinado puente, Calcular la probabilidad de que 17 o más autos crucen el puente en un minuto cualquiera.

Nos piden calcular \(P(X\geq 17)=1-P(X<17)\).

# Usando la cola izquierda
1-ppois(16, lambda = 12)
## [1] 0.101291
# Usando la cola derecha
ppois(16, lambda = 12, lower.tail = FALSE)
## [1] 0.101291
barplot(dpois(x = 0:30, 12), names.arg = 0:30)

Problema 3 (Exponencial)

Suponga que el tiempo medio de atención en la caja de un supermercado es de 3 minutos. Encuentre la probabilidad de que un cliente al azar sea atendido en menos de 2 minutos.

Para solucionar este problema debemos considerar que R asume la siguiente forma de la distribución exponencial: \[f(x)=\lambda e^{-\lambda x},\; x\geq 0,\;\lambda>0\]

Luego, con \(\lambda=3\) tenemos que:

pexp(2, rate = 3)
## [1] 0.9975212
# La probabilidad de demorar entre 5 y 6 minutos, inclusive
# P(X<=6)-P(X<=5)
pexp(6, rate = 3)-pexp(5, rate = 3)
## [1] 2.906723e-07

La función de densidad respectiva posee la siguiente gráfica

curve(dexp(x, rate = 3), xlim = c(0,10), xlab = "Valores de X", ylab = "Densidad de Probabilidad")

 

Problema 4 (Chi-Cuadrado)

Encontrar el percentil 95 de una distribución Chi-Cuadrado con 7 grados de libertad.

qchisq(0.95, df = 7)
## [1] 14.06714

La función de densidad respectiva posee la siguiente gráfica

curve(dchisq(x, df = 7), xlim = c(0,20), xlab = "Valores de X", ylab = "Densidad de Probabilidad")

 

Problema 5 (t de Student)

Encontrar el percentil 2.5 y el percentil 97.5 de una distribución t de Student con 5 grados de libertad.

qt(c(0.025,0.975), df = 5)
## [1] -2.570582  2.570582

Podemos graficar la densidad de esta distribución en particular

curve(dt(x, df = 1000), xlim = c(-3,3), xlab = "Valores de t", ylab = "Densidad de Probabilidad")

 

Problema 6 (F de Fisher)

Encontrar el percentil 90 de una distribución F de Fisher con 5 grados de libertad en el numerador y 2 grados de libertad en el denominador.

qf(0.90, df1 = 5, df2 = 2)
## [1] 9.292626

Podemos graficar la densidad de esta distribución en particular

curve(df(x, df1 = 5, df2 = 2), xlim = c(0,10), xlab = "Valores de F", ylab = "Densidad de Probabilidad")