Um total de 75.665 partos válidos, que obedecem os critérios de inclusão e exclusão presentes na dissertação de mestrado de PMMMJ
Desse universo de parto, a distribuição do tipo de parto pelo método de indução é:
Das 41.768 cesarianas, temos 11,5% de partos induzidos.
Dos 33.897 partos vaginais, temos 23% de partos induzidos.
Possuímos 1.427 partos sem a informação da indução.
##
## Row percent
## maes$labour
## maes$birth induced not induced Total
## caesarean 984 4824 35960 41768
## (2.4) (11.5) (86.1) (100)
## vaginal 443 7801 25653 33897
## (1.3) (23) (75.7) (100)
Uma das alterações necessárias para este trabalho será a exclusão de 1.427 registros que não possuem a classificação para o tipo de trabalho de parto.
Porém, da mesma forma qua a ausência do Grupo de Robson acontecia de forma maior nos hospitais privados, é importante ver se a ausência do trabalho de parto ocorre mais ou menos por tipo de hospital.
Dos 45.984 partos ocorridos nos hospitais municipais:
1,7% tem missing para o trabalho de parto e,
19,2% de partos induzidos.
Dos 25.711 partos ocorridos nos hospitais privados:
1,2% tem missing para o trabalho de parto e,
11,7% de partos induzidos.
Dos 3.970 partos ocorridos nos hospitais universitários:
9,1% tem missing para o trabalho de parto e,
19,9% de partos induzidos.
##
## Row percent
## maes$labour
## maes$division induced not induced Total
## Municipal 761 8823 36400 45984
## (1.7) (19.2) (79.2) (100)
## Privada 306 3012 22393 25711
## (1.2) (11.7) (87.1) (100)
## Universitário 360 790 2820 3970
## (9.1) (19.9) (71) (100)
O gráfico deixa mais perceptível a maior proporção de partos induzidos nos hospitais municipais e universitários.
Porém os hospitais universitários possuem uma proporção maior de “missing” para o tipo de trabalho de parto:
Por fim, vale a pena verificar como que a distribuição da indução de parto ocorre para cada hospital.
O gráfico sugere que nossa hipótese de investigação é válida, que a indução será maior entre os partos vaginais, pois é uma prática de estímulo à redução de cesarianas preconizada pela OMS e,
Os hospitais privados são os que realizam a maior proporção de partos vaginais com indução.
Esses dados organizados numericamente em uma tabela possuem a seguinte distribuição:
## Stratified by division
## level Municipal Privada Universitário
## n 45,984 25,711 3,970
## labour (%) 761 ( 1.7) 306 ( 1.2) 360 ( 9.1)
## induced 8823 (19.2) 3012 (11.7) 790 (19.9)
## not induced 36400 (79.2) 22393 (87.1) 2820 (71.0)
## birth (%) caesarean 15920 (34.6) 23926 (93.1) 1922 (48.4)
## vaginal 30064 (65.4) 1785 ( 6.9) 2048 (51.6)
Então agora que sabemos que a maior proporção de partos induzidos ocorre no tipo de parto vaginal, e que esta correlação é maior nos hospitais privados, apresentaremos os resultados das florestas aleatórias em cada tipo de hospital para indução do parto.
Primeiro realizamos as exclusões dos partos com “missing” no desfecho (n=1.427)
maes <- subset(maes, labour!="")
Retiramos o label vazio.
table(maes$labour)
##
## induced not induced
## 0 12625 61613
maes$labour <- as.character(maes$labour)
table(maes$labour)
##
## induced not induced
## 12625 61613
maes$labour <- as.factor(maes$labour)
Separamos uma base para cada tipo de hospital
set.seed(123)
pub <- subset(maes, division=="Municipal")
uni <- subset(maes, division=="Universitário")
priv <- subset(maes, division=="Privada")
Separamos 70% para base de treino e 30% para base de teste
smp_size_pub<- floor(0.70 * nrow(pub))
smp_size_uni <- floor(0.70 * nrow(uni))
smp_size_priv <- floor(0.70 * nrow(priv))
train_pub <- sample(seq_len(nrow(pub)), size = smp_size_pub)
train_uni <- sample(seq_len(nrow(uni)), size = smp_size_uni)
train_priv <- sample(seq_len(nrow(priv)), size = smp_size_priv)
pub_treino <- pub[train_pub, ]
uni_treino <- uni[train_uni, ]
priv_treino <- priv[train_priv, ]
pub_test <- pub[-train_pub, ]
uni_test <- uni[-train_uni, ]
priv_test <- priv[-train_priv, ]
Conforme a análise inicial a indução do parto, independente do tipo de parto, ocorre em pequena proporção.
Por isso balanceamos as bases de treino para que tivessem 50% de partos induzidos, utilizando o algoritmo de downsample, que mantém mas mesmas proporções das variáveis dependentes.
pub_balanced <- downSample(x = pub_treino,
y = pub_treino$labour)
pub_balanced <- pub_balanced[,-76]
uni_balanced <- downSample(x = uni_treino,
y = uni_treino$labour)
uni_balanced <- uni_balanced[,-76]
priv_balanced <- downSample(x = priv_treino,
y = priv_treino$labour)
priv_balanced <- priv_balanced[,-76]
Agora as bases de treino possuem 50% para cada trabalho de indução:
tab1(pub_balanced$labour, graph=F )
## pub_balanced$labour :
## Frequency Percent Cum. percent
## induced 6141 50 50
## not induced 6141 50 100
## Total 12282 100 100
tab1(uni_balanced$labour, graph=F)
## uni_balanced$labour :
## Frequency Percent Cum. percent
## induced 545 50 50
## not induced 545 50 100
## Total 1090 100 100
tab1(priv_balanced$labour, graph=F )
## priv_balanced$labour :
## Frequency Percent Cum. percent
## induced 2108 50 50
## not induced 2108 50 100
## Total 4216 100 100
As variáveis que serão utilizadas como atributos de predição serão:
maternal_agec = idade materna
maternal_scholc = escolaridade materna
maternal_racecolor = raça/cor da mãe
parity = histórico gestacional
gestational_age = idade gestacional (semanas)
num_fetuses = gemelar ou não
birthweight_week = peso do bebê ajustado a idade gestacional
presentation = apresentação do bebê
infant_acu = presença de uti neonatal no hosp. de nascimento
hospital_type = tipo de hospital
certification = certificação de hospital amigo da criança
hospital_volume = volume de partos do hospital
A distribuição do trabalho de parto dessas variáveis nas bases originais [i.e. não balanceadas] está apresentada nas tabelas abaixo:
Hospitais municipais
## Stratified by labour
## level induced not induced
## n 8,823 36,400
## maternal_agec (%) 10 - 19 3036 ( 34.4) 11218 ( 30.8)
## 20 - 34 5242 ( 59.4) 22346 ( 61.4)
## 35 - 49 545 ( 6.2) 2836 ( 7.8)
## maternal_scholc (%) 122 ( 1.4) 797 ( 2.2)
## > 12 340 ( 3.9) 1270 ( 3.5)
## < 4 345 ( 3.9) 1948 ( 5.4)
## 5 - 11 8016 ( 90.9) 32385 ( 89.0)
## maternal_racecolor (%) white 1862 ( 21.1) 8182 ( 22.5)
## brown 6302 ( 71.4) 24020 ( 66.0)
## black 659 ( 7.5) 4198 ( 11.5)
## parity (%) multiparous 4619 ( 52.4) 22383 ( 61.5)
## nulliparous 4204 ( 47.6) 14017 ( 38.5)
## gestational_age (%) 22 - 27 31 ( 0.4) 207 ( 0.6)
## 28 - 31 64 ( 0.7) 464 ( 1.3)
## 32 -36 707 ( 8.0) 3596 ( 9.9)
## 37 - 41 7625 ( 86.4) 30613 ( 84.1)
## > 42 396 ( 4.5) 1520 ( 4.2)
## num_fetuses (%) multiple 45 ( 0.5) 374 ( 1.0)
## 0 ( 0.0) 0 ( 0.0)
## single 8778 ( 99.5) 36026 ( 99.0)
## birthweight_week (%) AGA 8064 ( 91.4) 32830 ( 90.2)
## BGA 506 ( 5.7) 2289 ( 6.3)
## SGA 253 ( 2.9) 1281 ( 3.5)
## presentation (%) 0 ( 0.0) 2 ( 0.0)
## cephalic 8720 ( 98.8) 34591 ( 95.0)
## breech 102 ( 1.2) 1764 ( 4.8)
## transverse 1 ( 0.0) 43 ( 0.1)
## infant_acu (%) with ACU 8823 (100.0) 36400 (100.0)
## no ACU 0 ( 0.0) 0 ( 0.0)
## hospital_type (%) general 5190 ( 58.8) 17407 ( 47.8)
## maternity 3633 ( 41.2) 18993 ( 52.2)
## certification (%) child friendly 4125 ( 46.8) 15725 ( 43.2)
## not child friendly 4698 ( 53.2) 20675 ( 56.8)
## hospital_volume (%) 1500 - 2999 2817 ( 31.9) 4272 ( 11.7)
## 3000 - 4499 1275 ( 14.5) 12329 ( 33.9)
## < 1500 0 ( 0.0) 0 ( 0.0)
## > 4500 4731 ( 53.6) 19799 ( 54.4)
Hospitais universitários
## Stratified by labour
## level induced not induced
## n 790 2,820
## maternal_agec (%) 10 - 19 201 ( 25.4) 615 ( 21.8)
## 20 - 34 499 ( 63.2) 1868 ( 66.2)
## 35 - 49 90 ( 11.4) 337 ( 12.0)
## maternal_scholc (%) 3 ( 0.4) 21 ( 0.7)
## > 12 120 ( 15.2) 313 ( 11.1)
## < 4 40 ( 5.1) 118 ( 4.2)
## 5 - 11 627 ( 79.4) 2368 ( 84.0)
## maternal_racecolor (%) white 324 ( 41.0) 1094 ( 38.8)
## brown 306 ( 38.7) 1200 ( 42.6)
## black 160 ( 20.3) 526 ( 18.7)
## parity (%) multiparous 361 ( 45.7) 1761 ( 62.4)
## nulliparous 429 ( 54.3) 1059 ( 37.6)
## gestational_age (%) 22 - 27 1 ( 0.1) 30 ( 1.1)
## 28 - 31 7 ( 0.9) 59 ( 2.1)
## 32 -36 79 ( 10.0) 359 ( 12.7)
## 37 - 41 644 ( 81.5) 2242 ( 79.5)
## > 42 59 ( 7.5) 130 ( 4.6)
## num_fetuses (%) multiple 2 ( 0.3) 70 ( 2.5)
## 0 ( 0.0) 0 ( 0.0)
## single 788 ( 99.7) 2750 ( 97.5)
## birthweight_week (%) AGA 729 ( 92.3) 2524 ( 89.5)
## BGA 35 ( 4.4) 183 ( 6.5)
## SGA 26 ( 3.3) 113 ( 4.0)
## presentation (%) 0 ( 0.0) 1 ( 0.0)
## cephalic 740 ( 93.7) 2507 ( 88.9)
## breech 49 ( 6.2) 307 ( 10.9)
## transverse 1 ( 0.1) 5 ( 0.2)
## infant_acu (%) with ACU 790 (100.0) 2820 (100.0)
## no ACU 0 ( 0.0) 0 ( 0.0)
## hospital_type (%) general 391 ( 49.5) 1146 ( 40.6)
## maternity 399 ( 50.5) 1674 ( 59.4)
## certification (%) child friendly 192 ( 24.3) 525 ( 18.6)
## not child friendly 598 ( 75.7) 2295 ( 81.4)
## hospital_volume (%) 1500 - 2999 374 ( 47.3) 1486 ( 52.7)
## 3000 - 4499 0 ( 0.0) 0 ( 0.0)
## < 1500 416 ( 52.7) 1334 ( 47.3)
## > 4500 0 ( 0.0) 0 ( 0.0)
Hospitais privados
## Stratified by labour
## level induced not induced
## n 3,012 22,393
## maternal_agec (%) 10 - 19 154 ( 5.1) 1197 ( 5.3)
## 20 - 34 2291 ( 76.1) 16978 ( 75.8)
## 35 - 49 567 ( 18.8) 4218 ( 18.8)
## maternal_scholc (%) 6 ( 0.2) 65 ( 0.3)
## > 12 1882 ( 62.5) 12527 ( 55.9)
## < 4 15 ( 0.5) 78 ( 0.3)
## 5 - 11 1109 ( 36.8) 9723 ( 43.4)
## maternal_racecolor (%) white 2066 ( 68.6) 13706 ( 61.2)
## brown 774 ( 25.7) 7162 ( 32.0)
## black 172 ( 5.7) 1525 ( 6.8)
## parity (%) multiparous 1350 ( 44.8) 11193 ( 50.0)
## nulliparous 1662 ( 55.2) 11200 ( 50.0)
## gestational_age (%) 22 - 27 17 ( 0.6) 72 ( 0.3)
## 28 - 31 19 ( 0.6) 205 ( 0.9)
## 32 -36 295 ( 9.8) 2370 ( 10.6)
## 37 - 41 2629 ( 87.3) 19427 ( 86.8)
## > 42 52 ( 1.7) 319 ( 1.4)
## num_fetuses (%) multiple 33 ( 1.1) 329 ( 1.5)
## 0 ( 0.0) 1 ( 0.0)
## single 2979 ( 98.9) 22063 ( 98.5)
## birthweight_week (%) AGA 2842 ( 94.4) 21053 ( 94.0)
## BGA 96 ( 3.2) 656 ( 2.9)
## SGA 74 ( 2.5) 684 ( 3.1)
## presentation (%) 7 ( 0.2) 41 ( 0.2)
## cephalic 2965 ( 98.4) 21533 ( 96.2)
## breech 38 ( 1.3) 742 ( 3.3)
## transverse 2 ( 0.1) 77 ( 0.3)
## infant_acu (%) with ACU 1716 ( 57.0) 18885 ( 84.3)
## no ACU 1296 ( 43.0) 3508 ( 15.7)
## hospital_type (%) general 2178 ( 72.3) 13558 ( 60.5)
## maternity 834 ( 27.7) 8835 ( 39.5)
## certification (%) child friendly 0 ( 0.0) 0 ( 0.0)
## not child friendly 3012 (100.0) 22393 (100.0)
## hospital_volume (%) 1500 - 2999 1521 ( 50.5) 9067 ( 40.5)
## 3000 - 4499 141 ( 4.7) 3189 ( 14.2)
## < 1500 686 ( 22.8) 4553 ( 20.3)
## > 4500 664 ( 22.0) 5584 ( 24.9)
Com todas as variáveis dependentes e exigindo que a cada árvore, seja utilizada 3 variáveis para sortear a cada nível de decisão.
Existe 34,43% de erro dentro da floresta no erro de fora da amostra.
Este erro está balanceado entre os dois tipos de desfecho, conforme tabela abaixo
rfpub
##
## Call:
## randomForest(formula = labour ~ maternal_agec + maternal_scholc + maternal_racecolor + parity + gestational_age + num_fetuses + birthweight_week + presentation + infant_acu + hospital_type + certification + hospital_volume, data = pub_balanced, mtry = 3, importance = T, proximity = F, na.action = na.omit)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 33.68%
## Confusion matrix:
## induced not induced class.error
## induced 4224 1917 0.3121641
## not induced 2219 3922 0.3613418
A estabilização do erro de predição de acordo com o número de árvores ocorre mais ou menos depois de 200 árvores:
plot(rfpub)
As 5 variáveis mais importantes para a decisão do tipo de trabalho de parto são em ordem: volume do hospital, tipo de hospital, raçacor da mãe, histórico gestacional e idade gestacional.
round(importance(rfpub), 2)
## induced not induced MeanDecreaseAccuracy MeanDecreaseGini
## maternal_agec -8.98 16.95 12.83 49.06
## maternal_scholc 23.42 14.32 28.56 58.06
## maternal_racecolor 25.76 4.44 26.96 68.16
## parity 20.36 26.60 40.42 63.66
## gestational_age 8.40 -1.41 5.82 59.54
## num_fetuses 8.87 4.18 9.23 10.29
## birthweight_week 13.54 11.68 18.19 41.92
## presentation 62.13 5.03 51.08 62.55
## infant_acu 0.00 0.00 0.00 0.00
## hospital_type 43.14 7.47 76.31 122.35
## certification 27.92 -17.27 27.04 70.69
## hospital_volume 63.56 39.32 134.85 509.63
varImpPlot(rfpub)
##primeiro seta um preditor
pred.pub <- predict(rfpub, pub_balanced, type="class")
##depois verifica a acuracia da classificacao
table(pred.pub, pub_balanced$labour )
##
## pred.pub induced not induced
## induced 4340 2134
## not induced 1801 4007
##vendo a predicao na base de teste
pred.pub.test <- predict(rfpub, pub_test, type="class")
confusionMatrix(pred.pub.test, pub_test$labour)
## Confusion Matrix and Statistics
##
## Reference
## Prediction induced not induced
## induced 1837 4091
## not induced 845 6794
##
## Accuracy : 0.6362
## 95% CI : (0.628, 0.6443)
## No Information Rate : 0.8023
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.2123
##
## Mcnemar's Test P-Value : <0.0000000000000002
##
## Sensitivity : 0.6849
## Specificity : 0.6242
## Pos Pred Value : 0.3099
## Neg Pred Value : 0.8894
## Prevalence : 0.1977
## Detection Rate : 0.1354
## Detection Prevalence : 0.4369
## Balanced Accuracy : 0.6545
##
## 'Positive' Class : induced
##
Com todas as variáveis dependentes e exigindo que a cada árvore, seja utilizada 3 variáveis para sortear a cada nível de decisão.
Existe 40,64% de erro dentro da floresta no erro de fora da amostra.
Este erro NÃO está balanceado entre os dois tipos de desfecho. Os partos não induzidos apresentam maior erro de erro dentro da amostra conforme tabela abaixo:
rfuni
##
## Call:
## randomForest(formula = labour ~ maternal_agec + maternal_scholc + maternal_racecolor + parity + gestational_age + num_fetuses + birthweight_week + presentation + infant_acu + hospital_type + certification + hospital_volume, data = uni_balanced, mtry = 3, importance = T, proximity = F, na.action = na.omit)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 36.33%
## Confusion matrix:
## induced not induced class.error
## induced 400 145 0.2660550
## not induced 251 294 0.4605505
Existe um grande erro em toda a floresta:
plot(rfuni)
As variáveis parecem não carregar tanta importância para a predição do trabalho de parto. As mais importantes foram o histórico gestacional e a idade gestacional.
round(importance(rfuni), 2)
## induced not induced MeanDecreaseAccuracy MeanDecreaseGini
## maternal_agec 8.13 -6.46 1.41 12.38
## maternal_scholc 7.58 4.35 8.73 13.75
## maternal_racecolor -0.63 -1.18 -1.34 13.48
## parity 25.63 19.75 30.09 16.62
## gestational_age -1.12 16.96 11.28 17.12
## num_fetuses 13.71 2.73 11.07 3.31
## birthweight_week 7.65 4.81 8.41 10.45
## presentation 9.02 18.54 21.98 12.24
## infant_acu 0.00 0.00 0.00 0.00
## hospital_type 31.67 -1.33 31.43 14.08
## certification 17.68 0.36 17.51 8.97
## hospital_volume 19.40 -9.88 16.66 6.48
varImpPlot(rfuni)
##primeiro seta um preditor
pred.uni <- predict(rfuni, uni_balanced, type="class")
##depois verifica a acuracia da classificacao
table(pred.uni, uni_balanced$labour )
##
## pred.uni induced not induced
## induced 434 214
## not induced 111 331
##vendo a predicao na base de teste
pred.uni.test <- predict(rfuni, uni_test, type="class")
confusionMatrix(pred.uni.test, uni_test$labour)
## Confusion Matrix and Statistics
##
## Reference
## Prediction induced not induced
## induced 176 437
## not induced 69 401
##
## Accuracy : 0.5328
## 95% CI : (0.5025, 0.5628)
## No Information Rate : 0.7738
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.1286
##
## Mcnemar's Test P-Value : <0.0000000000000002
##
## Sensitivity : 0.7184
## Specificity : 0.4785
## Pos Pred Value : 0.2871
## Neg Pred Value : 0.8532
## Prevalence : 0.2262
## Detection Rate : 0.1625
## Detection Prevalence : 0.5660
## Balanced Accuracy : 0.5984
##
## 'Positive' Class : induced
##
Com todas as variáveis dependentes e exigindo que a cada árvore, seja utilizada 3 variáveis para sortear a cada nível de decisão.
Existe 33,85% de erro dentro da floresta no erro de fora da amostra.
Este erro está balanceado entre os dois tipos de desfecho. Os partos induzidos apresentam maior erro de erro dentro da amostra conforme tabela abaixo:
rfpriv
##
## Call:
## randomForest(formula = labour ~ maternal_agec + maternal_scholc + maternal_racecolor + parity + gestational_age + num_fetuses + birthweight_week + presentation + infant_acu + hospital_type + certification + hospital_volume, data = priv_balanced, mtry = 3, importance = T, proximity = F, na.action = na.omit)
## Type of random forest: classification
## Number of trees: 500
## No. of variables tried at each split: 3
##
## OOB estimate of error rate: 33.78%
## Confusion matrix:
## induced not induced class.error
## induced 1368 740 0.3510436
## not induced 684 1424 0.3244782
Existe uma estabilização no erro da floresta depois de 300 árvores:
plot(rfpriv)
As 5 variáveis mais importantes para predição do trabalho de parto foram: o hospital de uti neonatal, o volume de partos, escolaridade materna, a raça/cor materna e a idade gestacional
round(importance(rfpriv), 2)
## induced not induced MeanDecreaseAccuracy MeanDecreaseGini
## maternal_agec 0.74 4.10 4.41 22.12
## maternal_scholc 35.00 -21.28 24.42 36.69
## maternal_racecolor 24.41 -10.37 17.39 39.69
## parity 2.79 8.76 10.13 15.63
## gestational_age 7.63 -1.59 4.54 28.88
## num_fetuses -6.20 -0.31 -4.96 4.13
## birthweight_week 0.83 -0.76 0.00 17.32
## presentation 22.94 12.91 23.80 15.27
## infant_acu 104.00 30.94 107.16 195.58
## hospital_type -1.61 19.53 18.61 17.42
## certification 0.00 0.00 0.00 0.00
## hospital_volume 27.75 20.76 56.15 106.27
varImpPlot(rfpriv)
##primeiro seta um preditor
pred.priv <- predict(rfpriv, priv_balanced, type="class")
##depois verifica a acuracia da classificacao
table(pred.priv, priv_balanced$labour )
##
## pred.priv induced not induced
## induced 1430 600
## not induced 678 1508
##vendo a predicao na base de teste
pred.priv.test <- predict(rfpriv, priv_test, type="class")
confusionMatrix(pred.priv.test, priv_test$labour)
## Confusion Matrix and Statistics
##
## Reference
## Prediction induced not induced
## induced 573 2186
## not induced 331 4532
##
## Accuracy : 0.6698
## 95% CI : (0.6591, 0.6803)
## No Information Rate : 0.8814
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.1634
##
## Mcnemar's Test P-Value : <0.0000000000000002
##
## Sensitivity : 0.63385
## Specificity : 0.67461
## Pos Pred Value : 0.20768
## Neg Pred Value : 0.93194
## Prevalence : 0.11860
## Detection Rate : 0.07518
## Detection Prevalence : 0.36198
## Balanced Accuracy : 0.65423
##
## 'Positive' Class : induced
##