Modelo de Predicción de casos de gripe A (H7N9) basado en Bosques Aleatorios

El objetivo de este estudio es presentar un modelo de predicción de casos en aprendizaje automático basado en Bosques Aleatorios (Random Forests) que permita predecir el número de pacientes fallecidos y recuperados que han contraído el virus de la gripe A (H7N9) en China durante 2013. Para ello utilizaremos un dataset con información de 134 pacientes, de los cuales se sabe que 31 han fallecido, 46 se han recuperado y 57 tienen un pronóstico desconocido. Para el desarrollo de este modelo se utilizó el lenguaje de programación R, el software RStudio y librerías, entre las que destacan ggplot2 y caret.
Introduccion
El virus de la gripe A(H7N9) forma parte de un subgrupo de virus gripales que normalmente circulan en las aves. Ahora está produciendo infecciones seres humanos, un fenómeno que hasta hace poco no se había observado. La información existente sobre el alcance de la enfermedad causada por este virus y sobre la fuente de exposición es escasa. La enfermedad es preocupante porque ha sido grave en la mayoría de los casos. Por el momento no hay indicios de que pueda transmitirse de persona a persona, pero se están investigando activamente las vías de transmisión tanto de animales a personas como de persona a persona (Organización Mundial de la Salud, 2017). La minería de datos es un campo de la estadística y la informática referido al proceso que intenta descubrir patrones en grandes volúmenes de conjuntos de datos. Utiliza los métodos de la inteligencia artificial, el aprendizaje automático, la estadística y los sistemas de bases de datos. El objetivo general del proceso de minería de datos consiste en extraer información de un conjunto de datos y transformarla en una estructura comprensible para su uso posterior. Mediante los métodos predictivos utilizados en la minería de datos, es posible obtener previsiones de enfermedades víricas en grupos de población definidos.

Caso de Estudio
El objetivo general de esta investigación es obtener un modelo óptimo que permita generar previsiones de mortalidad y recuperación en pacientes portadores del virus de la gripe A-H7N9. Los objetivos específicos son los siguientes:
- Realizar un análisis exploratorio de los datos basado en el estudio de algunas medidas de tendencia central (media, mediana, y cuartiles)
- Desarrollar, entrenar y probar un modelo de bosque aleatorio.
Predicción de casos: Metodología
A través del software R Studio, se realiza un análisis exploratorio de datos, basado en el estudio de medidas de tendencia central (media, mediana y cuartiles). Las medidas de tendencia central son medidas estadísticas que tratan de resumir en un único valor a un conjunto de valores. Representan un centro en el que se encuentra el conjunto de datos. (Quevedo, 2011).
Posteriormente, a través de la librería «caret» de R, se construyen y evalúan los modelos a partir de los métodos predictivos de bosque aleatorio.
Algunos parámetros generados por los modelos utilizados son los siguientes:
- Mtry: el algoritmo seleccionará el número mtry de predictores para intentar una división para la clasificación al construir un árbol de clasificación.
- Accuracy: la precisión del predictor se refiere a lo bien que un predictor dado puede adivinar el valor del atributo predicho para un nuevo dato.
- Kappa: es una métrica que compara una precisión observada con una precisión esperada (probabilidad aleatoria). Se utiliza no sólo para evaluar un único clasificador, sino también para evaluar clasificadores entre sí. También tiene en cuenta el azar (según un clasificador aleatorio), lo que suele significar que es menos engañoso que utilizar simplemente la precisión como métrica. Landis y Koch consideran en sus investigaciones los valores 0-0,20 como leves, 0,21-0,40 como regulares, 0,41-0,60 como moderados, 0,61-0,80 como sustanciales y 0,81-1 como casi perfectos.
Kappa = $\frac{observed precision – expected precision}{1 – expected precision}$
El método Random Forest es una combinación de árboles predictores tal que cada árbol depende de los valores de un vector aleatorio probado independientemente y con la misma distribución para cada uno de ellos. Es una modificación sustancial del bagging que construye una larga colección de árboles no correlacionados y luego los promedia. (Breimann L, 2001).
Aplicación del Modelo de Predicción de casos
Análisis exploratorio de los datos
El archivo a analizar es un .csv con los datos de 134 pacientes con virus h7n9, de los cuales se sabe que 31 han fallecido, 46 se han recuperado y 57 tienen pronóstico desconocido. Las variables que componen el conjunto de datos son las siguientes:
- case_id: Identificador del paciente.
- outcome: Pronóstico si lo hay (recuperado o fallecido).
- age: Edad del individuo.
- male: Género (1 = masculino, 0 = femenino)
- hospital: Dato booleano que indica si el paciente ha sido hospitalizado
- days_to_hospital: número de días transcurridos entre el inicio de la enfermedad y la hospitalización
- days_to_outcome: número de días transcurridos entre el inicio y el final de la enfermedad.
- early_outcome: Indica si la enfermedad ha durado menos que la media del conjunto de datos.
- Jiangsu, Shanghai, Zhejiang, Otros: Variables booleanas que indican el lugar de origen del paciente.
Para este análisis, empezamos importando las bibliotecas que vamos a utilizar.
In [ ]:
library(dplyr) library(readr) library(tidyr) library(ggplot2) library(caret) library(gbm) library(rpart) library(rattle) library(rpart.plot) library(RColorBrewer)
Aquí podemos ver el conjunto de datos completo.
In [15]:
h7n9 <- read.csv("../input/chinah7n9/h7n9.csv") h7n9
case_id | outcome | age | male | hospital | days_to_hospital | days_to_outcome | early_outcome | Jiangsu | Other | Shanghai | Zhejiang |
---|---|---|---|---|---|---|---|---|---|---|---|
<chr> | <chr> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> |
case_1 | Death | 58 | 1 | 0 | 4 | 13 | 1 | 0 | 0 | 1 | 0 |
case_2 | Death | 7 | 1 | 1 | 4 | 11 | 1 | 0 | 0 | 1 | 0 |
case_3 | Death | 11 | 0 | 1 | 10 | 31 | 1 | 0 | 1 | 0 | 0 |
case_4 | NA | 18 | 0 | 1 | 8 | 46 | 0 | 1 | 0 | 0 | 0 |
case_5 | Recover | 20 | 0 | 1 | 11 | 57 | 0 | 1 | 0 | 0 | 0 |
case_6 | Death | 9 | 0 | 1 | 7 | 36 | 1 | 1 | 0 | 0 | 0 |
case_7 | Death | 54 | 1 | 1 | 9 | 20 | 1 | 1 | 0 | 0 | 0 |
case_8 | Death | 14 | 1 | 1 | 11 | 20 | 1 | 0 | 0 | 0 | 1 |
case_9 | NA | 39 | 1 | 1 | 0 | 18 | 0 | 0 | 0 | 0 | 1 |
case_10 | Death | 20 | 1 | 1 | 4 | 6 | 1 | 0 | 0 | 1 | 0 |
case_11 | Death | 36 | 1 | 1 | 2 | 6 | 1 | 0 | 0 | 0 | 1 |
case_12 | Death | 24 | 0 | 0 | 6 | 7 | 1 | 0 | 0 | 1 | 0 |
case_13 | Death | 39 | 0 | 1 | 3 | 12 | 1 | 0 | 0 | 1 | 0 |
case_14 | Recover | 15 | 1 | 0 | 4 | 10 | 1 | 0 | 0 | 1 | 0 |
case_15 | NA | 34 | 0 | 0 | 11 | 38 | 1 | 1 | 0 | 0 | 0 |
case_16 | NA | 51 | 1 | 0 | 3 | 20 | 0 | 1 | 0 | 0 | 0 |
case_17 | Death | 46 | 1 | 1 | 6 | 14 | 1 | 0 | 0 | 1 | 0 |
case_18 | Recover | 38 | 1 | 1 | 4 | 20 | 1 | 0 | 0 | 1 | 0 |
case_19 | Death | 31 | 1 | 1 | 5 | 67 | 0 | 0 | 0 | 1 | 0 |
case_20 | Recover | 27 | 1 | 1 | 4 | 22 | 1 | 0 | 1 | 0 | 0 |
case_21 | Recover | 39 | 1 | 1 | 1 | 23 | 1 | 0 | 0 | 1 | 0 |
case_22 | NA | 56 | 1 | 1 | 4 | 17 | 0 | 1 | 0 | 0 | 0 |
case_23 | Recover | 5 | 0 | 1 | 0 | 46 | 0 | 1 | 0 | 0 | 0 |
case_24 | Death | 36 | 1 | 0 | 6 | 6 | 1 | 0 | 0 | 1 | 0 |
case_25 | Recover | 35 | 1 | 1 | 0 | 35 | 0 | 0 | 0 | 1 | 0 |
case_26 | Death | 49 | 1 | 1 | 4 | 11 | 1 | 0 | 0 | 1 | 0 |
case_27 | Recover | 23 | 0 | 1 | 27 | 37 | 1 | 0 | 0 | 0 | 1 |
case_28 | NA | 51 | 1 | 0 | 6 | 6 | 1 | 0 | 0 | 0 | 1 |
case_29 | Recover | 48 | 0 | 1 | 4 | 32 | 0 | 0 | 0 | 1 | 0 |
case_30 | Recover | 53 | 0 | 0 | 6 | 23 | 0 | 0 | 0 | 1 | 0 |
⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ | ⋮ |
case_107 | Death | 61 | 1 | 0 | 7 | 21 | 0 | 0 | 1 | 0 | 0 |
case_108 | NA | 55 | 1 | 0 | 3 | 22 | 0 | 0 | 0 | 0 | 1 |
case_109 | NA | 35 | 1 | 0 | 0 | 8 | 0 | 0 | 0 | 0 | 1 |
case_110 | NA | 25 | 1 | 1 | 4 | 32 | 0 | 0 | 1 | 0 | 0 |
case_111 | Death | 28 | 1 | 0 | 4 | 22 | 0 | 0 | 1 | 0 | 0 |
case_112 | NA | 41 | 1 | 0 | 1 | 11 | 0 | 0 | 1 | 0 | 0 |
case_113 | NA | 33 | 0 | 0 | 7 | 13 | 1 | 0 | 0 | 0 | 1 |
case_114 | NA | 22 | 0 | 0 | 10 | 8 | 0 | 0 | 0 | 0 | 1 |
case_115 | NA | 14 | 1 | 0 | 7 | 10 | 0 | 0 | 0 | 0 | 1 |
case_116 | Recover | 37 | 1 | 1 | 5 | 21 | 0 | 0 | 1 | 0 | 0 |
case_117 | Recover | 48 | 0 | 0 | 4 | 28 | 0 | 0 | 1 | 0 | 0 |
case_118 | NA | 21 | 1 | 0 | 6 | 57 | 0 | 1 | 0 | 0 | 0 |
case_119 | Recover | 12 | 1 | 0 | 6 | 26 | 0 | 1 | 0 | 0 | 0 |
case_120 | NA | 33 | 1 | 0 | 3 | 38 | 0 | 1 | 0 | 0 | 0 |
case_121 | Death | 36 | 0 | 1 | 5 | 30 | 0 | 0 | 1 | 0 | 0 |
case_122 | NA | 14 | 1 | 0 | 5 | 18 | 0 | 0 | 0 | 0 | 1 |
case_123 | Death | 26 | 1 | 1 | 7 | 16 | 0 | 0 | 1 | 0 | 0 |
case_124 | Recover | 52 | 1 | 0 | 7 | 17 | 0 | 0 | 1 | 0 | 0 |
case_125 | Recover | 8 | 0 | 0 | 0 | 20 | 0 | 0 | 1 | 0 | 0 |
case_126 | NA | 52 | 1 | 1 | 10 | 31 | 0 | 0 | 1 | 0 | 0 |
case_127 | Recover | 15 | 1 | 0 | 5 | 9 | 0 | 0 | 1 | 0 | 0 |
case_128 | Recover | 30 | 1 | 1 | 7 | 22 | 0 | 0 | 1 | 0 | 0 |
case_129 | Recover | 41 | 1 | 1 | 4 | 28 | 0 | 0 | 1 | 0 | 0 |
case_130 | NA | 41 | 1 | 1 | 1 | 20 | 0 | 0 | 1 | 0 | 0 |
case_131 | Recover | 60 | 1 | 1 | 1 | 2 | 1 | 0 | 1 | 0 | 0 |
case_132 | NA | 51 | 0 | 1 | 0 | 24 | 0 | 0 | 1 | 0 | 0 |
case_133 | Recover | 32 | 1 | 1 | 0 | 2 | 0 | 0 | 1 | 0 | 0 |
case_134 | Recover | 2 | 1 | 1 | 1 | 7 | 0 | 1 | 0 | 0 | 0 |
case_135 | Death | 34 | 0 | 1 | 3 | 32 | 0 | 0 | 1 | 0 | 0 |
case_136 | NA | 23 | 0 | 1 | 1 | 13 | 0 | 0 | 1 | 0 | 0 |
A continuación se ofrece un resumen de los datos clasificados por edades:
In [16]:
summary(h7n9$age)
Min. 1st Qu. Median Mean 3rd Qu. Max. 2.00 20.25 34.00 32.46 44.75 61.00
Construyamos algunos gráficos para obtener más información de los datos.
In [17]:
plot(density(h7n9$age), main = "Density histogram", xlab = "Age (years old)", ylab = "Density")

In [18]:
ggplot(h7n9, aes(age)) + geom_density(aes(fill=outcome), alpha=1/3)

In [19]:
summary(h7n9['age']) boxplot(h7n9['age'], main = "Distribution of patients by age", xlab = "Age", ylab = "Patients", col = "orange", border = "brown", horizontal = TRUE, notch = TRUE)
age Min. : 2.00 1st Qu.:20.25 Median :34.00 Mean :32.46 3rd Qu.:44.75 Max. :61.00

In [20]:
summary(h7n9[h7n9$outcome=='Death', 'age']) boxplot(h7n9[h7n9$outcome=='Death', 'age'], main = "Distribution of deceased patients by age", xlab = "Age", ylab = "Patients", col = "orange", border = "brown", horizontal = TRUE, notch = TRUE)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 7.00 27.50 36.00 37.19 49.00 61.00 57

In [21]:
summary(h7n9[h7n9$outcome=='Recover', 'age']) boxplot(h7n9[h7n9$outcome=='Recover', 'age'], main = "Distribution of recovered patients by age", xlab = "Age", ylab = "Patients", col = "orange", border = "brown", horizontal = TRUE, notch = TRUE)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's 2.00 13.25 26.00 26.89 39.75 60.00 57

In [22]:
summary(h7n9[is.na(h7n9$outcome), 'age']) boxplot(h7n9[is.na(h7n9$outcome), 'age'], main = "Distribution of patients without prognosis by age", xlab = "Age", ylab = "Patients", col = "orange", border = "brown", horizontal = TRUE, notch = TRUE)
Min. 1st Qu. Median Mean 3rd Qu. Max. 6.00 26.00 35.00 34.39 44.00 56.00

En la distribución de todos los pacientes, la edad mínima es de 2 años, la edad media es de 32,46 años y la edad máxima es de 61 años.
En la distribución de los pacientes fallecidos, la edad mínima es de 7 años, la edad media es de 37,19 años y la edad máxima es de 61 años.
En la distribución de pacientes recuperados, la edad mínima es de 2 años, la edad media es de 26,89 años y la edad máxima es de 60 años.
En la distribución de pacientes con pronóstico desconocido, la edad mínima es de 6 años, la media de edad es de 34,39 años y la edad máxima es de 56 años.
Podemos observar que la edad media de los pacientes fallecidos es mayor que la edad media de los pacientes recuperados, por lo que podemos inferir que la edad es una variable importante a la hora de establecer modelos predictivos sobre este conjunto de datos. Para llegar a esta conclusión, no es necesario transformar los datos porque no se está utilizando ningún método de análisis paramétrico para ello (regresión, t de student, correlación, ANOVA, etc).
Antes de aplicar los métodos predictivos, dividimos los datos en grupos de entrenamiento y de prueba. Los datos de prueba se componen de los 57 casos con pronóstico desconocido. Los datos de entrenamiento se dividen para validar los modelos: El 70% de los datos de entrenamiento se conservarán para la construcción del modelo y el 30% restante se utilizará para la prueba del modelo. Esta proporción se utilizó debido a que es importante utilizar la mayor parte de los datos para entrenar el modelo, y al mismo tiempo dejar una proporción significativa para ejecutar las pruebas.
In [23]:
unknown_index <- which(is.na(h7n9$outcome)) unknown_data = h7n9[unknown_index, ] train_data <- h7n9[-unknown_index, ][,-1] set.seed(1275) val_index <- createDataPartition(train_data$outcome, p = 0.7, list=FALSE) # training data indices val_train_data <- train_data[val_index, ] # training data val_test_data <- train_data[-val_index, ] # test data
Bosque Aleatorio
Este modelo tiene una precisión del 76,73% con los siguientes parámetros:
- mtry = 10
- kappa = 0.4970
Obteniendo la matriz de confusión a partir de la predicción realizada, se registraron 14 resultados acertados y 8 erróneos, lo que representa una precisión del 63,64%. La variable más importante para el modelo es la edad.
In [24]:
model_rf <- caret::train(outcome ~ ., data = val_train_data, method = "rf", preProcess = NULL, trControl = trainControl(method = "repeatedcv", number = 10, repeats = 10, verboseIter = FALSE)) model_rf
Random Forest 55 samples 10 predictors 2 classes: 'Death', 'Recover' No pre-processing Resampling: Cross-Validated (10 fold, repeated 10 times) Summary of sample sizes: 49, 50, 50, 49, 49, 50, ... Resampling results across tuning parameters: mtry Accuracy Kappa 2 0.6804762 0.2994427 6 0.7564286 0.4744705 10 0.7585238 0.4872897 Accuracy was used to select the optimal model using the largest value. The final value used for the model was mtry = 10.
In [25]:
confusionMatrix(predict(model_rf, val_test_data), as.factor(val_test_data$outcome))
Confusion Matrix and Statistics Reference Prediction Death Recover Death 3 2 Recover 6 11 Accuracy : 0.6364 95% CI : (0.4066, 0.828) No Information Rate : 0.5909 P-Value [Acc > NIR] : 0.4195 Kappa : 0.1927 Mcnemar's Test P-Value : 0.2888 Sensitivity : 0.3333 Specificity : 0.8462 Pos Pred Value : 0.6000 Neg Pred Value : 0.6471 Prevalence : 0.4091 Detection Rate : 0.1364 Detection Prevalence : 0.2273 Balanced Accuracy : 0.5897 'Positive' Class : Death
In [26]:
varImp(model_rf, scale=TRUE) # Importance of the variable varImp(model_rf, scale=TRUE) %>% plot()
rf variable importance Overall age 100.0000 days_to_outcome 35.4028 days_to_hospital 32.1660 early_outcome 8.8473 Other 4.9845 male 2.6046 hospital 2.5463 Shanghai 0.7959 Zhejiang 0.1249 Jiangsu 0.0000

In [27]:
predict(model_rf, newdata = unknown_data) # Prediction new_h7n9 = unknown_data # Include results in dataset new_h7n9 %>% mutate(outcome=predict(model_rf, newdata=unknown_data))
- Recover
- Recover
- Death
- Recover
- Death
- Death
- Recover
- Recover
- Recover
- Recover
- Death
- Death
- Death
- Recover
- Recover
- Death
- Recover
- Death
- Death
- Death
- Recover
- Recover
- Recover
- Recover
- Death
- Death
- Death
- Recover
- Recover
- Death
- Recover
- Recover
- Recover
- Death
- Recover
- Recover
- Recover
- Recover
- Death
- Recover
- Recover
- Death
- Recover
- Death
- Recover
- Death
- Recover
- Death
- Recover
- Recover
- Recover
- Death
- Recover
- Recover
- Recover
- Recover
- Recover
Levels:
- ‘Death’
- ‘Recover’
case_id | outcome | age | male | hospital | days_to_hospital | days_to_outcome | early_outcome | Jiangsu | Other | Shanghai | Zhejiang | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
<chr> | <fct> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | <int> | |
4 | case_4 | Recover | 18 | 0 | 1 | 8 | 46 | 0 | 1 | 0 | 0 | 0 |
9 | case_9 | Recover | 39 | 1 | 1 | 0 | 18 | 0 | 0 | 0 | 0 | 1 |
15 | case_15 | Death | 34 | 0 | 0 | 11 | 38 | 1 | 1 | 0 | 0 | 0 |
16 | case_16 | Recover | 51 | 1 | 0 | 3 | 20 | 0 | 1 | 0 | 0 | 0 |
22 | case_22 | Death | 56 | 1 | 1 | 4 | 17 | 0 | 1 | 0 | 0 | 0 |
28 | case_28 | Death | 51 | 1 | 0 | 6 | 6 | 1 | 0 | 0 | 0 | 1 |
31 | case_31 | Recover | 43 | 1 | 0 | 4 | 21 | 0 | 1 | 0 | 0 | 0 |
32 | case_32 | Recover | 46 | 1 | 0 | 3 | 20 | 0 | 1 | 0 | 0 | 0 |
38 | case_38 | Recover | 28 | 1 | 0 | 2 | 7 | 1 | 1 | 0 | 0 | 0 |
39 | case_39 | Recover | 38 | 1 | 1 | 0 | 18 | 0 | 0 | 0 | 0 | 1 |
40 | case_40 | Death | 46 | 1 | 1 | 5 | 14 | 1 | 0 | 0 | 0 | 1 |
41 | case_41 | Death | 26 | 0 | 1 | 6 | 28 | 0 | 0 | 0 | 0 | 1 |
42 | case_42 | Death | 25 | 1 | 1 | 7 | 38 | 0 | 0 | 0 | 1 | 0 |
47 | case_47 | Recover | 44 | 1 | 0 | 6 | 16 | 0 | 1 | 0 | 0 | 0 |
48 | case_48 | Recover | 37 | 1 | 1 | 6 | 17 | 0 | 0 | 0 | 0 | 1 |
52 | case_52 | Death | 36 | 0 | 0 | 10 | 20 | 1 | 0 | 0 | 0 | 1 |
54 | case_54 | Recover | 47 | 1 | 0 | 0 | 8 | 0 | 0 | 0 | 0 | 1 |
56 | case_56 | Death | 45 | 1 | 1 | 6 | 17 | 1 | 0 | 0 | 1 | 0 |
62 | case_62 | Death | 40 | 0 | 0 | 11 | 8 | 1 | 0 | 0 | 0 | 1 |
63 | case_63 | Death | 33 | 1 | 0 | 7 | 2 | 1 | 0 | 1 | 0 | 0 |
66 | case_66 | Recover | 44 | 1 | 0 | 0 | 2 | 1 | 1 | 0 | 0 | 0 |
67 | case_67 | Recover | 28 | 1 | 0 | 2 | 10 | 0 | 0 | 0 | 0 | 1 |
68 | case_68 | Recover | 29 | 1 | 0 | 0 | 6 | 0 | 0 | 0 | 0 | 1 |
69 | case_69 | Recover | 35 | 1 | 0 | 0 | 17 | 0 | 0 | 0 | 0 | 1 |
70 | case_70 | Death | 30 | 0 | 0 | 8 | 31 | 0 | 0 | 0 | 0 | 1 |
71 | case_71 | Death | 44 | 0 | 0 | 8 | 8 | 0 | 0 | 0 | 0 | 1 |
78 | case_80 | Death | 46 | 1 | 0 | 6 | 7 | 0 | 0 | 0 | 0 | 1 |
82 | case_84 | Recover | 6 | 0 | 0 | 7 | 22 | 1 | 1 | 0 | 0 | 0 |
83 | case_85 | Recover | 52 | 0 | 1 | 7 | 38 | 1 | 0 | 0 | 1 | 0 |
84 | case_86 | Death | 26 | 0 | 0 | 8 | 11 | 1 | 0 | 0 | 0 | 1 |
86 | case_88 | Recover | 15 | 1 | 0 | 4 | 18 | 1 | 0 | 1 | 0 | 0 |
88 | case_90 | Recover | 17 | 1 | 1 | 3 | 11 | 0 | 0 | 0 | 0 | 1 |
90 | case_92 | Recover | 38 | 0 | 1 | 7 | 22 | 0 | 0 | 0 | 0 | 1 |
91 | case_93 | Death | 28 | 1 | 0 | 5 | 7 | 0 | 0 | 0 | 0 | 1 |
93 | case_95 | Recover | 13 | 1 | 0 | 2 | 22 | 0 | 0 | 0 | 0 | 1 |
94 | case_96 | Recover | 17 | 1 | 0 | 4 | 22 | 0 | 1 | 0 | 0 | 0 |
97 | case_99 | Recover | 40 | 0 | 0 | 8 | 17 | 0 | 0 | 0 | 0 | 1 |
98 | case_100 | Recover | 30 | 1 | 0 | 11 | 17 | 0 | 0 | 0 | 0 | 1 |
99 | case_101 | Death | 51 | 0 | 0 | 11 | 10 | 0 | 0 | 0 | 0 | 1 |
100 | case_102 | Recover | 53 | 1 | 0 | 0 | 8 | 0 | 0 | 0 | 0 | 1 |
101 | case_103 | Recover | 40 | 1 | 1 | 6 | 32 | 0 | 1 | 0 | 0 | 0 |
102 | case_104 | Death | 26 | 0 | 0 | 7 | 8 | 0 | 0 | 0 | 0 | 1 |
103 | case_105 | Recover | 9 | 1 | 0 | 11 | 17 | 1 | 0 | 0 | 0 | 1 |
106 | case_108 | Death | 55 | 1 | 0 | 3 | 22 | 0 | 0 | 0 | 0 | 1 |
107 | case_109 | Recover | 35 | 1 | 0 | 0 | 8 | 0 | 0 | 0 | 0 | 1 |
108 | case_110 | Death | 25 | 1 | 1 | 4 | 32 | 0 | 0 | 1 | 0 | 0 |
110 | case_112 | Recover | 41 | 1 | 0 | 1 | 11 | 0 | 0 | 1 | 0 | 0 |
111 | case_113 | Death | 33 | 0 | 0 | 7 | 13 | 1 | 0 | 0 | 0 | 1 |
112 | case_114 | Recover | 22 | 0 | 0 | 10 | 8 | 0 | 0 | 0 | 0 | 1 |
113 | case_115 | Recover | 14 | 1 | 0 | 7 | 10 | 0 | 0 | 0 | 0 | 1 |
116 | case_118 | Recover | 21 | 1 | 0 | 6 | 57 | 0 | 1 | 0 | 0 | 0 |
118 | case_120 | Death | 33 | 1 | 0 | 3 | 38 | 0 | 1 | 0 | 0 | 0 |
120 | case_122 | Recover | 14 | 1 | 0 | 5 | 18 | 0 | 0 | 0 | 0 | 1 |
124 | case_126 | Recover | 52 | 1 | 1 | 10 | 31 | 0 | 0 | 1 | 0 | 0 |
128 | case_130 | Recover | 41 | 1 | 1 | 1 | 20 | 0 | 0 | 1 | 0 | 0 |
130 | case_132 | Recover | 51 | 0 | 1 | 0 | 24 | 0 | 0 | 1 | 0 | 0 |
134 | case_136 | Recover | 23 | 0 | 1 | 1 | 13 | 0 | 0 | 1 | 0 | 0 |
In [28]:
summary(predict(model_rf, newdata = unknown_data))
Death21Recover36
Resultados
A partir de los datos obtenidos, se puede determinar que de los 57 pacientes con pronóstico desconocido, 21 fallecerán y 36 se recuperarán, lo que indica una tasa de mortalidad del 36,84% para este conjunto de datos.
En cuanto a los pacientes que fallecerán, los datos son los siguientes:
- El 52,38% (11 pacientes) son de sexo masculino y el 47,62% (10 pacientes) son de sexo femenino.
- El 27,27% (6 pacientes) estaban hospitalizados, mientras que el 72,73% (15 pacientes) no lo estaban.
- El 14,28% (3 pacientes) proceden de Jiangsu, el 66,66% (14 pacientes) de Zhenjiang, el 9,52% (2 pacientes) de Shanghai y el 9,52% (2 pacientes) de otras localidades.
- El 42,85% (9 pacientes) tuvieron la enfermedad menos tiempo de lo habitual, lo que indica que murieron más rápidamente.
En cuanto a los pacientes que se recuperarán, se obtienen los siguientes datos:
- El 77,77% (28 pacientes) son de sexo masculino, y el 22,22% (8 pacientes) son de sexo femenino.
- El 33,33% (12 pacientes) estaban hospitalizados, mientras que el 66,66% (24 pacientes) no lo estaban.
- El 30,55% (11 pacientes) proceden de Jiangsu, el 50% (18 pacientes) de Zhenjiang, el 2,77% (1 paciente) de Shanghai y el 16,68% (6 pacientes) de otras localidades.
- El 16,66% (6 pacientes) tuvieron la enfermedad menos tiempo de lo habitual, lo que indica que superaron la enfermedad más rápidamente.
In [29]:
unknown_data$outcome = c('Recover', 'Recover', 'Death', 'Recover', 'Death', 'Death', 'Recover', 'Recover', 'Recover', 'Recover', 'Death', 'Death', 'Death', 'Recover', 'Recover', 'Death', 'Recover', 'Death', 'Death', 'Death', 'Recover', 'Recover', 'Recover', 'Recover', 'Death', 'Death', 'Death', 'Recover', 'Recover', 'Death', 'Recover', 'Recover', 'Recover', 'Death', 'Recover', 'Recover', 'Recover', 'Recover', 'Death', 'Recover', 'Recover', 'Death', 'Recover', 'Death', 'Recover', 'Death', 'Recover', 'Death', 'Recover', 'Recover', 'Recover', 'Death', 'Recover', 'Recover', 'Recover', 'Recover', 'Recover') par(mfrow=c(1,2)) plot(density(unknown_data$age), main = "Final results of the predictive model", xlab = "Forecast", ylab = "Frequency") hist(unknown_data$age, main = "Histogram of frequencies", xlab = "Age", ylab = "Frequency", col = "red", border = "black") death_male = unknown_data[ which(unknown_data$male=='1' & unknown_data$outcome=='Death'),] death_female = unknown_data[ which(unknown_data$male=='0' & unknown_data$outcome=='Death'),] death_hospital = unknown_data[ which(unknown_data$hospital=='1' & unknown_data$outcome=='Death'),] death_not_hospital = unknown_data[ which(unknown_data$hospital=='0' & unknown_data$outcome=='Death'),] death_jiangsu = unknown_data[ which(unknown_data$Jiangsu=='1' & unknown_data$outcome=='Death'),] death_zhejiang = unknown_data[ which(unknown_data$Zhejiang =='1' & unknown_data$outcome=='Death'),] death_shanghai = unknown_data[ which(unknown_data$Shanghai=='1' & unknown_data$outcome=='Death'),] death_other = unknown_data[ which(unknown_data$Other=='1' & unknown_data$outcome=='Death'),] death_early_outcome = unknown_data[ which(unknown_data$early_outcome=='1' & unknown_data$outcome=='Death'),] death_not_early_outcome = unknown_data[ which(unknown_data$early_outcome=='0' & unknown_data$outcome=='Death'),] recover_male = unknown_data[ which(unknown_data$male=='1' & unknown_data$outcome=='Recover'),] recover_female = unknown_data[ which(unknown_data$male=='0' & unknown_data$outcome=='Recover'),] recover_hospital = unknown_data[ which(unknown_data$hospital=='1' & unknown_data$outcome=='Recover'),] recover_not_hospital = unknown_data[ which(unknown_data$hospital=='0' & unknown_data$outcome=='Recover'),] recover_jiangsu = unknown_data[ which(unknown_data$Jiangsu=='1' & unknown_data$outcome=='Recover'),] recover_zhejiang = unknown_data[ which(unknown_data$Zhejiang =='1' & unknown_data$outcome=='Recover'),] recover_shanghai = unknown_data[ which(unknown_data$Shanghai=='1' & unknown_data$outcome=='Recover'),] recover_other = unknown_data[ which(unknown_data$Other=='1' & unknown_data$outcome=='Recover'),] recover_early_outcome = unknown_data[ which(unknown_data$early_outcome=='1' & unknown_data$outcome=='Recover'),] recover_not_early_outcome = unknown_data[ which(unknown_data$early_outcome=='0' & unknown_data$outcome=='Recover'),] count(death_early_outcome)
n |
---|
<int> |
9 |

In [33]:
# Pie Chart x <- c(22, 35) labels <- c("Deceased","Recovered") piepercent<- round(100*x/sum(x), 1) pie(x, labels = piepercent, main = "Deaths & Recoveries comparison",col = rainbow(length(x))) legend("topright", c("Deceased","Recovered"), cex = 0.8, fill = rainbow(length(x))) par(mfrow=c(2,2)) hist(death_male$age, main = "Total deaths by male gender", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(death_female$age, main = "Total deaths by female gender", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(recover_male$age, main = "Total recovered by male gender", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(recover_female$age, main = "Total recovered by female gender", xlab = "Age", ylab = "Frequency", col = "red", border = "black")


In [31]:
par(mfrow=c(4,2)) hist(death_jiangsu$age, main = "Total deaths in Jiangsu", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(recover_jiangsu$age, main = "Total recovered in Jiangsu", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(death_shanghai$age, main = "Total deaths in Shanghai", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(recover_shanghai$age, main = "Total recovered in Shanghai", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(death_zhejiang$age, main = "Total deaths in Zhejiang", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(recover_zhejiang$age, main = "Total recovered in Zhejiang", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(death_other$age, main = "Total deaths in other location", xlab = "Age", ylab = "Frequency", col = "red", border = "black") hist(recover_other$age, main = "Total recovered in other location ", xlab = "Age", ylab = "Frequency", col = "red", border = "black")

Referencias
- Virus de la gripe aviar A(H7N9). (s.f.). En Who. Recuperado el 20 de marzo de 2020 de https://www.who.int/influenza/human_animal_interface/influenza_h7n9/es/
- Random Forest (s.f.). En Wikipedia. Recuperado el 20 de marzo de 2020 de https://es.wikipedia.org/wiki/Random_forest
- Análisis Exploratorio de Datos. (s.f.). En Wikipedia. Recuperado el 20 de marzo de 2020 de https://es.wikipedia.org/wiki/An%C3%A1lisis_exploratorio_de_datos
- K-vecinos más próximos. (s.f.). En bookdown. Recuperado el 20 de marzo de 2020 de https://es.wikipedia.org/wiki/K_vecinos_m%C3%A1s_pr%C3%B3ximos
- Elastic Net (s.f.). En Wikipedia. Recuperado el 20 de marzo de 2020 de https://www.interactivechaos.com/manual/tutorial-de-machine-learning/elastic-net
- Hastie, Trevor. Penalized Discriminant Analysis. Stanford University, 1995.
- Nearest shrunken centroids via alternative genewise shrinkages (s.f.). En journals.plos.org. Recuperado el 20 de marzo de 2020 de https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0171068
- Regresión de mínimos cuadrados parciales (s.f.). En wikipedia. Recuperado el 20 de marzo de 2020 de https://es.wikipedia.org/wiki/Regresi%C3%B3n_de_m%C3%ADnimos_cuadrados_parciale
- Medidas de tendencia central y dispersión (s.f.). Recuperado el 20 de marzo de 2020 de https://www.medwave.cl/link.cgi/Medwave/Series/MBE04/4934?ver=sindiseno
- Random Forests (s.f.). Recuperado el 20 de marzo de 2020 de https://link.springer.com/article/10.1023/A:1010933404324
- Random Forests (s.f.). Recuperado el 30 de abril de 2020 de https://www.tutorialspoint.com/data_mining/dm_classification_prediction.htm