This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

La siguiente base de datos habla sobre las muertes en cirugía en un hospital. Hay más de 70 variables que fueron estudiadas que podían influir en la muerte de un paciente, sin embargo solo se seleccionaron algunas para poder predecir si un paciente puede morir o no en cirugía de acuerdo a sus características.

datos <- read_csv("/Users/ander/Downloads/mrk0.csv")
Rows: 50240 Columns: 106── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (106): hospital_death, age, bmi, ethnicity, gender, height, hospital_admit_source...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
datos <- select(datos, hospital_death, age, bmi, gender, height, weight )

La base de datos tenía más de 50,000 filas. Solo se agarraron 100 para este algoritmo de prueba por cuestiones de procesamiento.

datos <- head(datos, 100)
datos
# Estandarización y visualización de datos
datos$age <- (datos$age - min(datos$age)) / (max(datos$age) - min(datos$age))
hist(datos$age)


datos$bmi <- (datos$bmi - min(datos$bmi)) / (max(datos$bmi) - min(datos$bmi))
hist(datos$bmi)


datos$gender <- (datos$gender - min(datos$gender)) / (max(datos$gender) - min(datos$gender))
hist(datos$gender)


datos$height <- (datos$height - min(datos$height)) / (max(datos$height) - min(datos$height))
hist(datos$height)


datos$weight <- (datos$weight - min(datos$weight)) / (max(datos$weight) - min(datos$weight))
hist(datos$weight)

# training aleatorio
set.seed(37)
inp <- sample(2, nrow(datos), replace = TRUE, prob = c(0.7, 0.3)) # 70% train 30% test
training_data <- datos[inp==1, ]
test_data <- datos[inp==2, ]
training_data
#Red neuronal
set.seed(333) #hidden es la cantidad de neuronas en la capa escondida, stepmax es que tantos pasos hará


n <- neuralnet(hospital_death~ . , #Decimos cuál es la y y cuáles son x 
               data = training_data, # información para crear la red 
               hidden = 3, # capas escondidas o en medio 
               # o puede ser hidden = c(3,2), --> tienes una fila hidden de tres y otra de 2 
               err.fct = "ce", # Tipo de error 
               linear.output = FALSE, 
               lifesign = 'full',
               rep = 2, # va a hacer dos veces lo de 800,000
               algorithm = "rprop+",
               stepmax = 200000) # Cuántos procesameintos de CPU va a utilizar --> Súper
hidden: 3    thresh: 0.01    rep: 1/2    steps:    1000 min thresh: 0.0513176851684538
                                                   2000 min thresh: 0.0211325124915538
                                                   2523 error: 4.13908  time: 0.71 secs
hidden: 3    thresh: 0.01    rep: 2/2    steps:    1000 min thresh: 0.0990185490874353
                                                   2000 min thresh: 0.0908582993673342
                                                   3000 min thresh: 0.0453100284895061
                                                   4000 min thresh: 0.0183738033612628
                                                   4708 error: 0.0118   time: 0.17 secs

Como lo indica la red neuronal al final, el grado de error es muy bajo, lo que habla de que puede ser un buen modelo de predicción

plot(n, rep = 1)

n$result.matrix
                                     [,1]          [,2]
error                        4.139083e+00  1.180024e-02
reached.threshold            9.874308e-03  9.520511e-03
steps                        2.523000e+03  4.708000e+03
Intercept.to.1layhid1       -7.122948e-02 -1.473687e+00
age.to.1layhid1              1.406182e+01  8.415427e+00
bmi.to.1layhid1              9.733135e-01 -4.424890e+00
gender.to.1layhid1          -7.306990e+00 -1.131577e+00
height.to.1layhid1           5.908567e-01 -1.779182e+00
weight.to.1layhid1          -4.619967e+00 -1.037482e+01
Intercept.to.1layhid2       -2.135161e+00 -3.020322e+00
age.to.1layhid2              2.991330e+01 -1.078558e+01
bmi.to.1layhid2             -1.413562e+00  6.155407e+00
gender.to.1layhid2          -1.448467e+01  1.544272e+00
height.to.1layhid2           2.511397e+00  2.972897e+00
weight.to.1layhid2          -2.633483e+01  1.506173e+01
Intercept.to.1layhid3       -6.652525e+00 -3.188152e-01
age.to.1layhid3             -1.728165e+01  2.346808e+01
bmi.to.1layhid3              5.867970e+00 -2.994696e+00
gender.to.1layhid3           5.599826e+00 -6.389445e+01
height.to.1layhid3           7.692730e+00  4.594788e+01
weight.to.1layhid3           2.318704e+01  6.520218e+01
Intercept.to.hospital_death  1.784738e+01  9.521330e+01
1layhid1.to.hospital_death  -1.413127e+00 -2.086324e+02
1layhid2.to.hospital_death  -1.939548e+01 -3.734334e+02
1layhid3.to.hospital_death  -6.595448e+01 -1.107419e+01
output <- neuralnet::compute(n, rep = 1, training_data[, -1])
head(output$net.result)
             [,1]
[1,] 9.070221e-19
[2,] 4.901214e-02
[3,] 1.037817e-21
[4,] 4.919891e-02
[5,] 1.234759e-21
[6,] 4.900811e-02
head(training_data[1, ])
# Matriz de confusión 
output <- neuralnet::compute(n, rep = 1, training_data[, -1])
p1 <- output$net.result
pred1 <- ifelse(p1 > 0.5, 1, 0)
tab1 <- table(pred1[,1], training_data[,1]$hospital_death)
tab1
   
     0  1
  0 67  1
  1  0  2

De acuerdo con la matriz de confusión, el modelo solo tuvo un falso negativo (es decir, sólo se equivocó en uno), por lo que se puede decir que tiene un grado de error muy bajo

#Porcentaje de error total (usando datos de la matrix de confusión)
1 - sum(diag(tab1)) / sum(tab1)
[1] 0.01428571
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4KClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLgoKTGEgc2lndWllbnRlIGJhc2UgZGUgZGF0b3MgaGFibGEgc29icmUgbGFzIG11ZXJ0ZXMgZW4gY2lydWfDrWEgZW4gdW4gaG9zcGl0YWwuIEhheSBtw6FzIGRlIDcwIHZhcmlhYmxlcyBxdWUgZnVlcm9uIGVzdHVkaWFkYXMgcXVlIHBvZMOtYW4gaW5mbHVpciBlbiBsYSBtdWVydGUgZGUgdW4gcGFjaWVudGUsIHNpbiBlbWJhcmdvIHNvbG8gc2Ugc2VsZWNjaW9uYXJvbiBhbGd1bmFzIHBhcmEgcG9kZXIgcHJlZGVjaXIgc2kgdW4gcGFjaWVudGUgcHVlZGUgbW9yaXIgbyBubyBlbiBjaXJ1Z8OtYSBkZSBhY3VlcmRvIGEgc3VzIGNhcmFjdGVyw61zdGljYXMuCgpgYGB7cn0KZGF0b3MgPC0gcmVhZF9jc3YoIi9Vc2Vycy9hbmRlci9Eb3dubG9hZHMvbXJrMC5jc3YiKQpgYGAKCmBgYHtyfQpkYXRvcyA8LSBzZWxlY3QoZGF0b3MsIGhvc3BpdGFsX2RlYXRoLCBhZ2UsIGJtaSwgZ2VuZGVyLCBoZWlnaHQsIHdlaWdodCApCmBgYAoKTGEgYmFzZSBkZSBkYXRvcyB0ZW7DrWEgbcOhcyBkZSA1MCwwMDAgZmlsYXMuIFNvbG8gc2UgYWdhcnJhcm9uIDEwMCBwYXJhIGVzdGUgYWxnb3JpdG1vIGRlIHBydWViYSBwb3IgY3Vlc3Rpb25lcyBkZSBwcm9jZXNhbWllbnRvLgoKYGBge3J9CmRhdG9zIDwtIGhlYWQoZGF0b3MsIDEwMCkKYGBgCgpgYGB7cn0KZGF0b3MKYGBgCgpgYGB7cn0KIyBFc3RhbmRhcml6YWNpw7NuIHkgdmlzdWFsaXphY2nDs24gZGUgZGF0b3MKZGF0b3MkYWdlIDwtIChkYXRvcyRhZ2UgLSBtaW4oZGF0b3MkYWdlKSkgLyAobWF4KGRhdG9zJGFnZSkgLSBtaW4oZGF0b3MkYWdlKSkKaGlzdChkYXRvcyRhZ2UpCgpkYXRvcyRibWkgPC0gKGRhdG9zJGJtaSAtIG1pbihkYXRvcyRibWkpKSAvIChtYXgoZGF0b3MkYm1pKSAtIG1pbihkYXRvcyRibWkpKQpoaXN0KGRhdG9zJGJtaSkKCmRhdG9zJGdlbmRlciA8LSAoZGF0b3MkZ2VuZGVyIC0gbWluKGRhdG9zJGdlbmRlcikpIC8gKG1heChkYXRvcyRnZW5kZXIpIC0gbWluKGRhdG9zJGdlbmRlcikpCmhpc3QoZGF0b3MkZ2VuZGVyKQoKZGF0b3MkaGVpZ2h0IDwtIChkYXRvcyRoZWlnaHQgLSBtaW4oZGF0b3MkaGVpZ2h0KSkgLyAobWF4KGRhdG9zJGhlaWdodCkgLSBtaW4oZGF0b3MkaGVpZ2h0KSkKaGlzdChkYXRvcyRoZWlnaHQpCgpkYXRvcyR3ZWlnaHQgPC0gKGRhdG9zJHdlaWdodCAtIG1pbihkYXRvcyR3ZWlnaHQpKSAvIChtYXgoZGF0b3Mkd2VpZ2h0KSAtIG1pbihkYXRvcyR3ZWlnaHQpKQpoaXN0KGRhdG9zJHdlaWdodCkKCmBgYAoKYGBge3J9CiMgdHJhaW5pbmcgYWxlYXRvcmlvCnNldC5zZWVkKDM3KQppbnAgPC0gc2FtcGxlKDIsIG5yb3coZGF0b3MpLCByZXBsYWNlID0gVFJVRSwgcHJvYiA9IGMoMC43LCAwLjMpKSAjIDcwJSB0cmFpbiAzMCUgdGVzdAp0cmFpbmluZ19kYXRhIDwtIGRhdG9zW2lucD09MSwgXQp0ZXN0X2RhdGEgPC0gZGF0b3NbaW5wPT0yLCBdCmBgYAoKYGBge3J9CnRyYWluaW5nX2RhdGEKYGBgCgpgYGB7cn0KI1JlZCBuZXVyb25hbApzZXQuc2VlZCgzMzMpICNoaWRkZW4gZXMgbGEgY2FudGlkYWQgZGUgbmV1cm9uYXMgZW4gbGEgY2FwYSBlc2NvbmRpZGEsIHN0ZXBtYXggZXMgcXVlIHRhbnRvcyBwYXNvcyBoYXLDoQoKCm4gPC0gbmV1cmFsbmV0KGhvc3BpdGFsX2RlYXRofiAuICwgI0RlY2ltb3MgY3XDoWwgZXMgbGEgeSB5IGN1w6FsZXMgc29uIHggCiAgICAgICAgICAgICAgIGRhdGEgPSB0cmFpbmluZ19kYXRhLCAjIGluZm9ybWFjacOzbiBwYXJhIGNyZWFyIGxhIHJlZCAKICAgICAgICAgICAgICAgaGlkZGVuID0gMywgIyBjYXBhcyBlc2NvbmRpZGFzIG8gZW4gbWVkaW8gCiAgICAgICAgICAgICAgICMgbyBwdWVkZSBzZXIgaGlkZGVuID0gYygzLDIpLCAtLT4gdGllbmVzIHVuYSBmaWxhIGhpZGRlbiBkZSB0cmVzIHkgb3RyYSBkZSAyIAogICAgICAgICAgICAgICBlcnIuZmN0ID0gImNlIiwgIyBUaXBvIGRlIGVycm9yIAogICAgICAgICAgICAgICBsaW5lYXIub3V0cHV0ID0gRkFMU0UsIAogICAgICAgICAgICAgICBsaWZlc2lnbiA9ICdmdWxsJywKICAgICAgICAgICAgICAgcmVwID0gMiwgIyB2YSBhIGhhY2VyIGRvcyB2ZWNlcyBsbyBkZSA4MDAsMDAwCiAgICAgICAgICAgICAgIGFsZ29yaXRobSA9ICJycHJvcCsiLAogICAgICAgICAgICAgICBzdGVwbWF4ID0gMjAwMDAwKSAjIEN1w6FudG9zIHByb2Nlc2FtZWludG9zIGRlIENQVSB2YSBhIHV0aWxpemFyIC0tPiBTw7pwZXIKYGBgCgpDb21vIGxvIGluZGljYSBsYSByZWQgbmV1cm9uYWwgYWwgZmluYWwsIGVsIGdyYWRvIGRlIGVycm9yIGVzIG11eSBiYWpvLCBsbyBxdWUgaGFibGEgZGUgcXVlIHB1ZWRlIHNlciB1biBidWVuIG1vZGVsbyBkZSBwcmVkaWNjacOzbgoKYGBge3J9CnBsb3QobiwgcmVwID0gMSkKYGBgCgpgYGB7cn0KbiRyZXN1bHQubWF0cml4CmBgYAoKYGBge3J9Cm91dHB1dCA8LSBuZXVyYWxuZXQ6OmNvbXB1dGUobiwgcmVwID0gMSwgdHJhaW5pbmdfZGF0YVssIC0xXSkKaGVhZChvdXRwdXQkbmV0LnJlc3VsdCkKCmhlYWQodHJhaW5pbmdfZGF0YVsxLCBdKQpgYGAKCmBgYHtyfQojIE1hdHJpeiBkZSBjb25mdXNpw7NuIApvdXRwdXQgPC0gbmV1cmFsbmV0Ojpjb21wdXRlKG4sIHJlcCA9IDEsIHRyYWluaW5nX2RhdGFbLCAtMV0pCnAxIDwtIG91dHB1dCRuZXQucmVzdWx0CnByZWQxIDwtIGlmZWxzZShwMSA+IDAuNSwgMSwgMCkKdGFiMSA8LSB0YWJsZShwcmVkMVssMV0sIHRyYWluaW5nX2RhdGFbLDFdJGhvc3BpdGFsX2RlYXRoKQp0YWIxCmBgYAoKRGUgYWN1ZXJkbyBjb24gbGEgbWF0cml6IGRlIGNvbmZ1c2nDs24sIGVsIG1vZGVsbyBzb2xvIHR1dm8gdW4gZmFsc28gbmVnYXRpdm8gKGVzIGRlY2lyLCBzw7NsbyBzZSBlcXVpdm9jw7MgZW4gdW5vKSwgcG9yIGxvIHF1ZSBzZSBwdWVkZSBkZWNpciBxdWUgdGllbmUgdW4gZ3JhZG8gZGUgZXJyb3IgbXV5IGJham8KCmBgYHtyfQojUG9yY2VudGFqZSBkZSBlcnJvciB0b3RhbCAodXNhbmRvIGRhdG9zIGRlIGxhIG1hdHJpeCBkZSBjb25mdXNpw7NuKQoxIC0gc3VtKGRpYWcodGFiMSkpIC8gc3VtKHRhYjEpCgpgYGAK