library("plyr")
source("cargar_datos.R")
library("ggplot2")
nombre1 = "FRANCISCO JAVIER SALFATE GARCÉS"
nombre2 = "FRANCISCO JAVIER SALFATE GARCÉS"
datos = cargar_datos(nombre1, nombre2)
knitr::kable(head(datos[,2:ncol(datos)]))
diagnostico comorbilidad sexo prom_edad ds_edad egreso DE freq
3rd Degree Sideburns Alien DNA Femenino 43 1.68 Alta 130 25
3rd Degree Sideburns Alien DNA Femenino 66 4.83 Fallecido(a) 167 15
3rd Degree Sideburns Alien DNA Masculino 49 2.21 Alta 3 34
3rd Degree Sideburns Alien DNA Masculino 56 3.26 Fallecido(a) 162 11
3rd Degree Sideburns Alien DNA Otro 25 0.44 Alta 90 7
3rd Degree Sideburns Alien DNA Otro 89 0.88 Fallecido(a) 132 2

Actividades

Describa cada una de las variables del conjunto de datos indicando su clasificación según tipo: medición y precisión.

Diagnóstico

Corresponde a la enfermedad diagnosticada al paciente. Es cualitativa, nominal y politómica.

Comorbilidad

Corresponde a (Según el centro de Políticas de Salud de Manitoba en 2003) aquellas condiciones médicas que aumentan el riesgo de muerte de un paciente (Aparte de la razón principal por la que se encuentra en el hospital). Es cualitativa, nominal y politómica.

Sexo biológico

Corresponde al sexo biológico de un paciente. Es cualitativa, nominal y politómica.

Promedio edad (prom_edad)

Corresponde al promedio de edad de los pacientes, Es cuantitativa, ratio y discreta.

Desviación estándar edad (ds_edad)

Corresponde a la desviación estándar de la edad. Es cuantitativa, ratio y continua.

Condición de egreso

Corresponde a la clasificación del egreso de un paciente del hospital. Es cualitativa, nominal y dicotómica.

Días de estadía en el hospital (DE)

Corresponde al total de días de estadía de un paciente en el hospital. Es cuantitativa, ratio y discreta.

Frecuencia de pacientes (freq)

Corresponde a la frecuencia (o ocurrencia) de una cierta condición de paciente. Es cuantitativa, ratio y discreta.

Considerando la letalidad de los/las pacientes atendidos/atendidas en su establecimiento hospitalario:

¿Cuál es la probabilidad que tiene un/una paciente de fallecer en su establecimiento hospitalario? Indique la tasa de mortalidad hospitalaria de su establecimiento.

total = 0
total_fallecidos = 0
i = 1
while (i < nrow(datos)){
  if(datos[i, 7] == "Fallecido(a)"){
    total_fallecidos = total_fallecidos + datos[i, 9]
  }
  i = i + 1
}

i = 1
while (i < nrow(datos)){
  total = total + datos[i, 9]
  i = i + 1
}

probabilidadFallecimiento = total_fallecidos/total

total_alta = 0
i = 1
while (i < nrow(datos)){
  if(datos[i, 7] == "Alta"){
    total_alta = total_alta + datos[i, 9]
  }
  i = i + 1
}

tasa_mortalidad = (total_fallecidos*100) / total_alta

cat("La probabilidad  de fallecimiento en el establecimiento hospitalario es", probabilidadFallecimiento)
## La probabilidad  de fallecimiento en el establecimiento hospitalario es 0.2957296
cat("\nLa tasa de mortalidad del establecimiento hospitalario es", tasa_mortalidad)
## 
## La tasa de mortalidad del establecimiento hospitalario es 41.99091

¿Cuál es el diagnóstico principal que tienen mayor probabilidad de fallecimiento (letalidad) en su hospital según cada sexo biológico?

diagnosticos = unique(datos[2])
lista_diagnosticos = c()

# Se genera un vector con todos los diagnosticos
for (i in 1:nrow(diagnosticos)){
  lista_diagnosticos <- append(lista_diagnosticos, diagnosticos[i,1])
}

hombres_por_diagnostico = c()
mujeres_por_diagnostico = c()
otros_por_diagnostico = c()

hombres_fallecidos_por_diagnostico = 0
mujeres_fallecidas_por_diagnostico = 0
otros_fallecidos_por_diagnostico = 0

hombres_atendidos = c()
mujeres_atendidas = c()
otros_atendidos = c()

hombres_atendidos_por_diagnostico = 0
mujeres_atentidas_por_diagnostico = 0
otros_atendidos_por_diagnostico = 0

# Se calculan los atendidos por cada sexo
for (i in 1:length(lista_diagnosticos)){
  for(j in 1:nrow(datos)){
    if ((datos[j, 4] == "Masculino") && (datos[j, 7] == "Alta") && (datos[j, 2] == lista_diagnosticos[i])){
      hombres_atendidos_por_diagnostico = hombres_atendidos_por_diagnostico + datos[j, 9]
    }
    if ((datos[j, 4] == "Femenino") && (datos[j, 7] == "Alta") && (datos[j, 2] == lista_diagnosticos[i])){
      mujeres_atentidas_por_diagnostico = mujeres_atentidas_por_diagnostico + datos[j, 9]
    }
    if ((datos[j, 4] == "Otro") && (datos[j, 7] == "Alta") && (datos[j, 2] == lista_diagnosticos[i])){
      otros_atendidos_por_diagnostico = otros_atendidos_por_diagnostico + datos[j, 9]
    }
  }
  hombres_atendidos = append(hombres_atendidos, hombres_atendidos_por_diagnostico)
  mujeres_atendidas = append(mujeres_atendidas, mujeres_atentidas_por_diagnostico)
  otros_atendidos = append(otros_atendidos, otros_atendidos_por_diagnostico)
  hombres_atendidos_por_diagnostico = 0
  mujeres_atentidas_por_diagnostico = 0
  otros_atendidos_por_diagnostico = 0
}

# Se calculan los fallecidos por cada sexo
for (i in 1:length(lista_diagnosticos)){
  for (j in 1:nrow(datos)){
    if ((datos[j, 4] == "Masculino") && (datos[j, 7] == "Fallecido(a)") && (datos[j, 2] == lista_diagnosticos[i])){
      hombres_fallecidos_por_diagnostico = hombres_fallecidos_por_diagnostico + datos[j, 9]
    }
    if ((datos[j, 4] == "Femenino") && (datos[j, 7] == "Fallecido(a)") && (datos[j, 2] == lista_diagnosticos[i])){
      mujeres_fallecidas_por_diagnostico = mujeres_fallecidas_por_diagnostico + datos[j, 9]
    }
    if ((datos[j,4] == "Otro") && (datos[j, 7] == "Fallecido(a)") && (datos[j, 2] == lista_diagnosticos[i])){
      otros_fallecidos_por_diagnostico = otros_fallecidos_por_diagnostico + datos[j, 9]
    }
  }
  hombres_por_diagnostico = append(hombres_por_diagnostico, hombres_fallecidos_por_diagnostico)
  mujeres_por_diagnostico = append(mujeres_por_diagnostico, mujeres_fallecidas_por_diagnostico)
  otros_por_diagnostico = append(otros_por_diagnostico, otros_fallecidos_por_diagnostico)
  otros_fallecidos_por_diagnostico = 0
  mujeres_fallecidas_por_diagnostico = 0
  hombres_fallecidos_por_diagnostico = 0
}

diagnostico_letal_hombre = lista_diagnosticos[which.max(hombres_por_diagnostico)]
diagnostico_letal_mujer = lista_diagnosticos[which.max(mujeres_por_diagnostico)]
diagnostico_letal_otro = lista_diagnosticos[which.max(otros_por_diagnostico)]

prob_hombre = hombres_por_diagnostico[which.max(hombres_por_diagnostico)]/hombres_atendidos[which.max(hombres_por_diagnostico)]

prob_mujer = mujeres_por_diagnostico[which.max(mujeres_por_diagnostico)]/mujeres_atendidas[which.max(mujeres_por_diagnostico)]

prob_otros = otros_por_diagnostico[which.max(otros_por_diagnostico)]/otros_atendidos[which.max(otros_por_diagnostico)]


cat("El diagnóstico más letal para los hombres es:", diagnostico_letal_hombre, "con una cantidad de fallecidos de", hombres_por_diagnostico[which.max(hombres_por_diagnostico)], "y una probabilidad de fallecimiento de", prob_hombre, "\n")
## El diagnóstico más letal para los hombres es: Golf Stones con una cantidad de fallecidos de 132 y una probabilidad de fallecimiento de 0.5789474
cat("El diagnóstico más letal para las mujeres es:", diagnostico_letal_mujer, "con una cantidad de fallecidos de", mujeres_por_diagnostico[which.max(mujeres_por_diagnostico)], "y una probabilidad de fallecimiento de", prob_mujer, "\n")
## El diagnóstico más letal para las mujeres es: The Squits con una cantidad de fallecidos de 125 y una probabilidad de fallecimiento de 0.4882812
cat("El diagnóstico más letal para otros es:", diagnostico_letal_otro, "con una cantidad de fallecidos de", otros_por_diagnostico[which.max(otros_por_diagnostico)], "y una probabilidad de fallecimiento de", prob_otros)
## El diagnóstico más letal para otros es: Sweaty Palms con una cantidad de fallecidos de 37 y una probabilidad de fallecimiento de 0.6491228
# Se crean abreviaciones para los diagnósticos, esto sacrifica un poco la facilidad de entender lo que trata de decir el gráfico, pero es la mejor manera ya que utilizar directamente los nombres de los diagnósticos lo hace ilegible

simbolos_str = c("3DS", "BH", "BW", "CN", "CA", "DI", "FB", "GE", "GS", "GR", "HP", "IL", "I", "ILS", "KB", "KC", "RN", "SI", "SR", "SP", "TS", "T", "TP", "UC", "US")


# Gráfico de muertes por diagnóstico de hombres
data_graph = data.frame(lista_diagnosticos, hombres_por_diagnostico)
graph = ggplot(data = data_graph, aes(x = simbolos_str, y = hombres_por_diagnostico))
graph = graph + geom_bar(stat = "identity", fill = "red")
graph = graph + theme_bw() + ggtitle("Gráfico de fallecimientos por diagnóstico en hombres")
graph = graph + xlab("Diagnósticos") + ylab("Cantidad de fallecimientos")
plot(graph)

# Gráfico de muertes por diagnóstico de mujeres
data_graph = data.frame(lista_diagnosticos, mujeres_por_diagnostico)
graph = ggplot(data = data_graph, aes(x = simbolos_str, y = mujeres_por_diagnostico))
graph = graph + geom_bar(stat = "identity", fill = "red")
graph = graph + theme_bw() + ggtitle("Gráfico de fallecimientos por diagnóstico en mujeres")
graph = graph + xlab("Diagnósticos") + ylab("Cantidad de fallecimientos")
plot(graph)

# Gráfico de muertes por diagnóstico de otros
data_graph = data.frame(lista_diagnosticos, otros_por_diagnostico)
graph = ggplot(data = data_graph, aes(x = simbolos_str, y = otros_por_diagnostico))
graph = graph + geom_bar(stat = "identity", fill = "red")
graph = graph + theme_bw() + ggtitle("Gráfico de fallecimientos por diagnóstico en otros")
graph = graph + xlab("Diagnósticos") + ylab("Cantidad de fallecimientos")
plot(graph)

¿Cuál es la comorbilidad que presenta mayor probabilidad de aparición en personas adultas fallecidas en su establecimiento hospitalario?

comorbilidad = unique(datos[3])
lista_comorbilidad = c()

# Se genera un vector con todas las comorbilidades
for (i in 1:nrow(comorbilidad)){
  lista_comorbilidad <- append(lista_comorbilidad, comorbilidad[i,1])
}

adultos_fallecidos_por_comorbilidad = c()
adultos_totales_por_comorbilidad = c()
letalidades_por_comorbilidad = c()

cantidad_adultos_fallecidos = 0
cantidad_adultos_totales = 0
letalidad = 0

# Se calculan los pacientes y fallecidos por cada comorbilidad
for (i in 1:length(lista_comorbilidad)){
  for (j in 1:nrow(datos)){
    if ((datos[j, 5] > 18) && (datos[j, 7] == "Fallecido(a)") && (datos[j, 3] == lista_comorbilidad[i])){
      cantidad_adultos_fallecidos = cantidad_adultos_fallecidos + datos[j, 9]
    }
    if ((datos[j, 5] > 18) && (datos[j, 3] == lista_comorbilidad[i])){
      cantidad_adultos_totales = cantidad_adultos_totales + datos[j, 9]
    }
  }
  adultos_fallecidos_por_comorbilidad = append(adultos_fallecidos_por_comorbilidad, cantidad_adultos_fallecidos)
  adultos_totales_por_comorbilidad = append(adultos_totales_por_comorbilidad, cantidad_adultos_totales)
  cantidad_adultos_totales = 0
  cantidad_adultos_fallecidos = 0
}

for (i in 1:length(lista_comorbilidad)){
  letalidad = (adultos_fallecidos_por_comorbilidad[i]/adultos_totales_por_comorbilidad[i])
  letalidades_por_comorbilidad = append(letalidades_por_comorbilidad, letalidad)
  letalidad = 0
}

comorbilidad_mas_letal = lista_comorbilidad[which.max(letalidades_por_comorbilidad)]

cat("La comorbilidad con mayor probabilidad de aparición en adultos fallecidos es:", comorbilidad_mas_letal, "\n")
## La comorbilidad con mayor probabilidad de aparición en adultos fallecidos es: Jellyitis
cat("Con una probabilidad de aparición de:", letalidades_por_comorbilidad[which.max(letalidades_por_comorbilidad)])
## Con una probabilidad de aparición de: 0.3119748
data_graph = data.frame(lista_comorbilidad, letalidades_por_comorbilidad)
graph = ggplot(data = data_graph, aes(x = lista_comorbilidad, y = letalidades_por_comorbilidad))
graph = graph + geom_bar(stat = "identity", fill = "red")
graph = graph + theme_bw() + ggtitle("Gráfico de probabilidades de fallecimiento por comorbilidad en adultos")
graph = graph + xlab("Comorbilidades") + ylab("Probabilidad de fallecimiento")
plot(graph)

Usando como base el diagnóstico principal con mayor probabilidad de fallecimiento (letalidad) en su hospital: ¿cuál es la probabilidad de que si el próximo año se hospitalizan 100 personas con esa patología, N de ellas fallezcan?

muertes_por_diagnostico = c()
pacientes_por_diagnostico = c()
cantidad_muertos_por_diagnostico = 0
cantidad_pacientes_por_diagnostico = 0
letalidades_por_diagnostico = c()

# Se calculan los fallecidos y pacientes por cada diagnostico
for (i in 1:length(lista_diagnosticos)){
  for (j in 1:nrow(datos)){
    if ((datos[j, 7] == "Fallecido(a)") && (datos[j, 2] == lista_diagnosticos[i])){
      cantidad_muertos_por_diagnostico = cantidad_muertos_por_diagnostico + datos[j, 9]
    }
    if ((datos[j, 2] == lista_diagnosticos[i])){
      cantidad_pacientes_por_diagnostico = cantidad_pacientes_por_diagnostico + datos[j, 9]
    }
    
  }
  muertes_por_diagnostico = append(muertes_por_diagnostico, cantidad_muertos_por_diagnostico)
  pacientes_por_diagnostico = append(pacientes_por_diagnostico, cantidad_pacientes_por_diagnostico)
  cantidad_muertos_por_diagnostico = 0
  cantidad_pacientes_por_diagnostico = 0
}

letalidad = 0

# Se calculan las letalidades
for (i in 1:length(lista_diagnosticos)){
  letalidad = (muertes_por_diagnostico[i]/pacientes_por_diagnostico[i]) * 100
  letalidades_por_diagnostico = append(letalidades_por_diagnostico, letalidad)
  letalidad = 0
}

N=sample(seq(5,50),1)
m = sum(muertes_por_diagnostico)
n = sum(pacientes_por_diagnostico) - sum(muertes_por_diagnostico)
k = 100

# Corresponde a una distribución hipergeometrica
probabilidad = dhyper(N, m, n, k)
cat("La probabilidad de que si el próximo año se hospitalizan 100 personas con esa patología, N de ellas fallezcan es:", probabilidad)
## La probabilidad de que si el próximo año se hospitalizan 100 personas con esa patología, N de ellas fallezcan es: 0.001395229

¿Qué puede concluir de los resultados con relación a las características y gestión de su establecimiento hospitalario?

Se puede concluir que el establecimiento hospitalario va por un camino un poco “turbulento”, ya que se pueden notar que las tasas de letalidad se ven un poco altas si consideramos una tasa de letalidad “moderada” entre 15% y 30%, pero al menos es sabido que la probabilidad de que fallezcan 100 personas con la patología más letal es considerablemente baja.

letalidades_por_diagnostico
##  [1] 30.10883 28.43792 28.22086 30.40712 29.64427 29.55607 29.50617 32.65565
##  [9] 32.42925 29.18239 26.44110 29.00552 29.86842 28.79377 30.61224 28.51852
## [17] 30.61481 28.57143 28.59008 28.69148 29.44712 28.66162 31.97452 31.28019
## [25] 28.17746

Considerando la estancia de los/las pacientes atendidos/atendidas en su establecimiento hospitalario:

¿Cuál es el promedio de día de estadas (DE) de su establecimiento hospitalario?

pacientes_totales = 0
estadia_todos = 0

for (i in 1:nrow(datos)){
  estadia_todos = estadia_todos + (datos[i, 8] * datos[i, 9]) # Ya que una frecuencia de datos[i, 9] pacientes se quedó datos[i, 8} días
  pacientes_totales = pacientes_totales + datos[i, 9]
}

promedio = estadia_todos/pacientes_totales
cat("El promedio de DE del establecimiento hospitalario es:", promedio)
## El promedio de DE del establecimiento hospitalario es: 99.099

¿Cuál es la probabilidad de que un paciente pediátrico (menor a 18 años) sea dado de alta de la patología más frecuente después de 30 días de estada? Asuma en ambos casos una distribución normal y una desviación estándar típica de 0.2 para los DE

# Se busca la patología más frecuente
patologia_mas_frecuente = lista_diagnosticos[which.max(pacientes_por_diagnostico)]

# Se busca a aquellos menores de 18 años que padecen esta patologia
child = datos[(datos$diagnostico == patologia_mas_frecuente & datos$prom_edad+datos$ds_edad < 18 & datos$DE > 30 & datos$egreso == "Alta"),]

estadia_child = 0
for (i in 1:nrow(child)){
  estadia_child = estadia_child + child[i,8]*child[i,9]
}

# Se promedia la estadía de los pacientes con el total de pacientes
prom = estadia_child/sum(child[,9])

# Se calcula finalmente 1 - P(X <= 30)
prob = 1 - pnorm(30, mean = prom, sd = 0.2)
cat("La probabilidad de que un paciente pediátrico sea dado de alta de la patología más frecuente después de 30 días de estada es:", prob)
## La probabilidad de que un paciente pediátrico sea dado de alta de la patología más frecuente después de 30 días de estada es: 1

¿Cuál es la probabilidad de que si usted es o ustedes son hospitalizados en su establecimiento hospitalario sean dados de alta antes de los 10 días? Al igual que el ejercicio anterior, asuma una distribución normal y una desviación estándar típica de 0.2 para los DE.

Entre las patologías y comorbilidades presentes, no poseo ninguna, pero asumiendo que poseo alguna se tiene lo siguiente:

Entonces de la siguiente manera, eligiré un diagnóstico al azar y supondremos que lo padezco

# Se elige un diagnóstico al azar
diagnostico_random = sample(lista_diagnosticos, 1)

# Se busca a aquellos pacientes que posean este diagnóstico, que hayan pasado menos de 10 días en el hospital y que hayan sido dados de alta
pacientes_diag_random = datos[(datos$diagnostico == diagnostico_random & datos$DE < 10 && datos$egreso == "Alta"),]

estadia_total = 0
for (i in 1:nrow(pacientes_diag_random)){
  estadia_total = estadia_total + pacientes_diag_random[i,8]*pacientes_diag_random[i,9]
}

# Se hace uso de un pequeño control de errores para evitar el caso donde pacientes_diag_random tenga 0 resultados y por ende se retorne numeric(0), lo cual no nos entrega un resultado que tenga alguna interpretación.
probabilidad = 0
if(nrow(pacientes_diag_random) != 0){
  prom = estadia_total/sum(pacientes_diag_random[,9])
  # Se calcula P(X < 10)
  probabilidad = pnorm(10, mean = prom, sd = 0.2)
}

cat("Al ser diagnosticado con", diagnostico_random)
## Al ser diagnosticado con Chronic Nosehair
cat("\nSe tiene la siguiente probabilidad de ser dado de alta antes de 10 días de estadía:", probabilidad)
## 
## Se tiene la siguiente probabilidad de ser dado de alta antes de 10 días de estadía: 0

¿Qué puede concluir de los resultados con relación a las características y gestión de su establecimiento hospitalario?

Teniendo en cuenta estudios realizados sobre establecimientos hospitalarios en Chile, se debe notar que el promedio de días de estada para hospitales de 6.8 y para clínicas es de 4.1, estas dos cifras se encuentran distantes de lo que se puede extraer de este hospital en particular (Pero se debe tener en cuenta que estos estudios se realizaron en Chile y puede darse otro caso distinto para otras localidades), ya que se puede observar un promedio de estada mucho menor a los anteriormente mencionados. Pero también se puede notar que para la patología más frecuente, hay un 100% de pacientes dados de alta tras 30 días, esto demostrando que teniendo el suficiente tiempo, el establecimiento hospitalario es capaz de manejar el caso más común de patologías de forma totalmente efectiva (Aunque en el contexto de una situación médica, el tiempo no es ilimitado).

Si usted ve/ustedes ven salir de su hospital a cuatro pacientes dados de alta del hospital caminando uno tras otro: ¿cuál es la probabilidad de que todos/todas ellos/ellas hayan tenido la patología con mayor probabilidad de aparición atendida en su establecimiento?

# Se debe tener en cuenta a aquellos que poseen la patología con mayor probabilidad de aparición y fueron dados de alta
vivos = sum(datos[(datos$diagnostico == patologia_mas_frecuente & datos$egreso == "Alta"), 9])

# Se debe tener en cuenta que el caso a observar debe ser de cuatro pacientes, por lo tanto la probabilidad corresponderá a 4/vivos
prob = 4/vivos
cat("La probabilidad de que aquellos cuatro pacientes dados de alta hayan tenido la patología con mayor probabilidad de aparición es:", prob)
## La probabilidad de que aquellos cuatro pacientes dados de alta hayan tenido la patología con mayor probabilidad de aparición es: 0.006633499

Usted ha/ustedes han decidido ir al área ambulatoria de consultas médicas. Si entre todos/todas los/las especialistas médicos se está atendiendo un promedio a treinta pacientes por hora ¿cuál es la probabilidad que en la siguiente hora se atienda como mínimo a N pacientes?

# Se utilizará una distribución de Poisson

# N aleatorio entre 5 y 50
N = sample(seq(5,50),1)

# Ya que se atiende a un promedio de treinta pacientes
prob = 1 - ppois(N, lambda = 30)
cat("La probabilidad de que a la siguiente hora se atienda como mínimo a N pacientes es:", prob)
## La probabilidad de que a la siguiente hora se atienda como mínimo a N pacientes es: 0.9870673
data_graph = data.frame(seq(1,50), dpois(seq(1,50), 30))
graph = ggplot(data = data_graph, aes(x = seq(1,50), y = dpois(seq(1,50), 30)))
graph = graph + geom_bar(stat = "identity", fill = "red")
graph = graph + theme_bw() + ggtitle("Probabilidad de que a la siguiente hora se atienda como mínimo a N pacientes")
graph = graph + xlab("N") + ylab("Probabilidad")
plot(graph)