# Bibliotecas
library("ggplot2")
library("plotly") 

Ejercicio 1

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

b) ¿Cuánto tiempo se necesitaría para evaluar todas las combinaciones?

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

c) ¿Qué sugerencia haría desde el punto de vista computacional?

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.

Ejercicio 2

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:

a) ¿Cuál es la probabilidad de que las alas de un avión fallen antes de las 5,000 horas de vuelo?

# 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

b) ¿Cuál es la probabilidad de que las alas de un avión fallen antes de las 20,000 horas de vuelo?

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

c) ¿Cuál es la probabilidad de que las alas de un avión fallen después de las 30,000 horas de vuelo?

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

d) Indique y grafique la distribución asociada.

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)

Ejercicio 3

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:

a) ¿Cuál es la probabilidad de que un empleado resuelva un problema en exactamente 10 minutos? Argumente su respuesta.

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

b) Si seleccionamos aleatoriamente a 50 empleados, ¿cuál es la probabilidad de que el tiempo promedio que tardan en resolver un problema de soporte técnico sea menor a 12 minutos?

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

d) Indique y grafique las distribuciones asociadas.

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)

Referencias