# Bibliotecas
library("ggplot2")
library("plotly")
En el campo de la genética, se busca identificar los genes asociados a una enfermedad específica. En un estudio reciente se encontró que un conjunto de 22 genes está fuertemente relacionado con la aparición de diabetes tipo 2. El equipo de investigación ahora se pregunta ¿cuántos conjuntos de 22 genes se tendrían que evaluar para identificar todos los genes relacionados con la diabetes tipo 2? Suponga que el genoma humano consta de 25,000 genes. Además, si se propusiera un algoritmo de búsqueda basado en fuerza bruta que evalúa cada combinación de 22 genes para determinar su relación con la diabetes tipo 2 en 1 nanosegundo, ### a)¿cuántos conjuntos de 22 genes se tendrían que evaluar para identificar todos los genes relacionados con la diabetes tipo 2? Dado que 22 es un subconjunto de 25,000, estamos hablando de una combinación del tipo: \[C_{n,r} = \binom{n}{r} = \frac{n!}{r!(n-r)!}\] Por lo tanto, se tiene: \[C_{n,r} = \binom{25.000}{22} = \frac{25.000!}{22!(25.000-22)!}\]
# Utilizar lfactorial, función que permite trabajar factoriales muy grandes.
comb = function(n, r) {
exp(lfactorial(n) - lfactorial(r) - lfactorial(n-r))
}
r_comb = comb(25000, 22)
print(r_comb)
## [1] 5.010713e+75
Tomando en consideración que un Nanosegundo es igual a 10^-9 se tendría: \[C_{n,r} = \binom{25.000}{22} \cdot10^{-9}\]
tiempo_segundos = r_comb * 10^-9
tiempo_horas = tiempo_segundos/3600
tiempo_dias = tiempo_horas/24
tiempo_anos = tiempo_dias/365
cat("El calculo se tardara", tiempo_anos, "años")
## El calculo se tardara 1.588887e+59 años
Debido a la cantidad de tiempo necesario para el análisis, se sugiere trabajar con rangos de genes más reducidos, probar con aproximaciones, filtrado, etc. a fin de reducir el rango, abordando el problema desde otro ángulo y permitiendo deducir aproximaciones de probabilidades.
En el campo de la ingeniería aeroespacial, se sabe que los materiales utilizados en las alas de los aviones pueden sufrir de fatiga y eventualmente fallar. Se ha determinado que la vida útil de los materiales de las alas es de 20,000 horas de vuelo. Bajo este contexto:
# funcion para calcular probabilidad exponencial
prob_fallar = function(lambda, horas, tail) {
prob_resultado = pexp(horas, 1/lambda, lower.tail = tail)
return(prob_resultado)
}
cat("Probabilidad de fallar antes de 5,000 horas de vuelo:", prob_fallar(20000,5000, T))
## Probabilidad de fallar antes de 5,000 horas de vuelo: 0.2211992
cat("Probabilidad de fallar antes de 20,000 horas de vuelo:", prob_fallar(20000,20000, T))
## Probabilidad de fallar antes de 20,000 horas de vuelo: 0.6321206
cat("Probabilidad de fallar después de 30,000 horas de vuelo:", prob_fallar(20000,30000, F))
## Probabilidad de fallar después de 30,000 horas de vuelo: 0.2231302
rango=seq(0,40000)
lambda=20000
distribucion = dexp(rango, 1/lambda)
datos=data.frame(rango, distribucion)
#Gráfico
grafico = ggplot(data=datos,aes(x=rango,y=distribucion))
grafico = grafico + geom_line(stat="identity",color="lightblue3",linewidth = 1)
grafico = grafico + theme_bw() + ggtitle("Distribución Exponencial")
grafico = grafico + xlab("Horas de vuelo") + ylab("Probabilidad")
ggplotly(grafico)
Se sabe que el tiempo que tarda un empleado en resolver un problema de soporte técnico en una empresa sigue una distribución normal de media 15 minutos y desviación estándar de 5 minutos. Con base en esta información:
Se utiliza dnorm, ya que permite calcular la probabilidad exacta en un punto (10 minutos)
tiempo = 10
media = 15
desviacion = 5
# prob un empleado en 10 min
prob_empleado10 = dnorm(tiempo, media, desviacion)
cat(prob_empleado10)
## 0.04839414
Se utiliza la distribución normal (pnorm) para calcular la probabilidad de que un empleado resuelva un problema en menos de 12 minutos. Luego, se aplica la distribución binomial (dbinom) para contar cuántos empleados de un grupo aleatorio de 50 logran resolver problemas en menos de 12 minutos.
#prob menor a 12 min
tiempo = 12
media = 15
desviacion = 5
# prob un empleado menor a 12 min
prob_empleado12 = pnorm(tiempo, media, desviacion)
respuesta = dbinom(50, 50, prob_empleado12)
cat(respuesta)
## 8.083113e-29
Para a) Distribución Normal
rango = seq(0,30,by=0.2)
distribucion = dnorm(seq(0,30,by=0.2), 15, 5)
datos=data.frame(rango,distribucion)
#Gráfico
grafico = ggplot(data=datos,aes(x=rango,y=distribucion))
grafico = grafico + geom_bar(stat="identity",fill="lightblue3")
grafico = grafico + theme_bw() + ggtitle("Distribución de probabilidades")
grafico = grafico + xlab("Distribucion Normal") + ylab("Densidad")
ggplotly(grafico)
Para b) se utiliza Distribución Normal como variable para la Distribución Binomial.
rango = seq(0,30)
distribucion = dbinom(rango, 50, prob_empleado12)
datos=data.frame(rango,distribucion)
#Gráfico
grafico = ggplot(data=datos,aes(x=rango,y=distribucion))
grafico = grafico + geom_bar(stat="identity",fill="lightblue3")
grafico = grafico + theme_bw() + ggtitle("Distribución de probabilidades")
grafico = grafico + xlab("Rango") + ylab("Probabilidad")
ggplotly(grafico)