- Emerson Rigoni
- Henrique Aparecido Laureano [GitLab, GitHub, Lattes]
Com as bases Pima.tr
e Pima.te
do package MASS
encontrar as duas covariáveis que melhor classificam o resultado do teste de diabetes
library(MASS)
data("Pima.tr")
data("Pima.te")
Uma população de mulheres (532) com no mínimo 21 anos, descendentes da tribo indígina Pima e atualmente vivendo próximo de Phoenix, Arizona, que fizeram o teste para diabetes de acordo o critério da Organização Mundial da Saúde (OMS)
Os dados foram coletados pelo Instituto Nacional Norte Americano de Diabetes e Doenças de Digestivas e Renais
No banco de dados de treino (Pima.tr
) temos 200 indivíduos, e no banco de dados de teste (Pima.te
) temos os demais 332 indivíduos
npreg
: número de gestaçõessummary(Pima.tr$npreg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.00 1.00 2.00 3.57 6.00 14.00
summary(Pima.te$npreg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 1.000 2.000 3.485 5.000 17.000
glu
: concentração de glicose no plasma em um teste oral de tolerância à glicosesummary(Pima.tr$glu)
Min. 1st Qu. Median Mean 3rd Qu. Max.
56.0 100.0 120.5 124.0 144.0 199.0
summary(Pima.te$glu)
Min. 1st Qu. Median Mean 3rd Qu. Max.
65.0 96.0 112.0 119.3 136.2 197.0
bp
: pressão sanguínea diastólica (mm Hg)summary(Pima.tr$bp)
Min. 1st Qu. Median Mean 3rd Qu. Max.
38.00 64.00 70.00 71.26 78.00 110.00
summary(Pima.te$bp)
Min. 1st Qu. Median Mean 3rd Qu. Max.
24.00 64.00 72.00 71.65 80.00 110.00
skin
: espessura da prega cutânea no tríceps (mm)summary(Pima.tr$skin)
Min. 1st Qu. Median Mean 3rd Qu. Max.
7.00 20.75 29.00 29.22 36.00 99.00
summary(Pima.te$skin)
Min. 1st Qu. Median Mean 3rd Qu. Max.
7.00 22.00 29.00 29.16 36.00 63.00
bmi
: índice de massa corporal (\(peso (kg) / altura (m)^{2}\))summary(Pima.tr$bmi)
Min. 1st Qu. Median Mean 3rd Qu. Max.
18.20 27.58 32.80 32.31 36.50 47.90
summary(Pima.te$bmi)
Min. 1st Qu. Median Mean 3rd Qu. Max.
19.40 28.17 32.90 33.24 37.20 67.10
ped
: função de diabetes pedigreesummary(Pima.tr$ped)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0850 0.2535 0.3725 0.4608 0.6160 2.2880
summary(Pima.te$ped)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0850 0.2660 0.4400 0.5284 0.6792 2.4200
age
: idade, em anossummary(Pima.tr$age)
Min. 1st Qu. Median Mean 3rd Qu. Max.
21.00 23.00 28.00 32.11 39.25 63.00
summary(Pima.te$age)
Min. 1st Qu. Median Mean 3rd Qu. Max.
21.00 23.00 27.00 31.32 37.00 81.00
type
: Yes
ou No
para diabetes de acordo com o critério da OMSsummary(Pima.tr$type)
No Yes
132 68
summary(Pima.te$type)
No Yes
223 109
library(latticeExtra)
splom(Pima.tr[1:7]
, groups = Pima.tr$type
, col = 2:3
, xlab = NULL
, pch = 16
, main = "Todos os possíveis gráficos de dispersão 2 x 2"
, key = list(text = list(c("Diabetes: No", "Diabetes: Yes"))
, columns = 2
, points = TRUE
, pch = 16
, col = 2:3))
library(randomForest)
(model <- randomForest(type ~ .
, Pima.tr
, importance = TRUE
, proximity = TRUE))
Call:
randomForest(formula = type ~ ., data = Pima.tr, importance = TRUE, proximity = TRUE)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 2
OOB estimate of error rate: 27.5%
Confusion matrix:
No Yes class.error
No 109 23 0.1742424
Yes 32 36 0.4705882
O modelo não está classificando muito bem na presença de todas as covariáveis, principalmente no caso das mulheres com resultado positivo
importance(model)
No Yes MeanDecreaseAccuracy MeanDecreaseGini
npreg 10.761937 0.5162421 9.5597559 9.597752
glu 13.539915 15.3655683 19.2431944 22.392191
bp 6.123816 -6.8096005 0.3600998 7.962252
skin 1.179178 0.3921454 1.0915255 9.067550
bmi 3.923649 9.0491615 8.1178770 12.840096
ped 5.910101 4.7350967 7.3427757 13.588339
age 12.540266 4.7876090 13.0215618 13.986320
varImpPlot(model
, main = "Auxílio gráfico para encontrar quais covariáveis mais ajudam na classificação de Pima.tr")
As duas covariáveis que melhor classificam são: glu
e age
(model <- randomForest(type ~ glu + age
, Pima.tr
, importance = TRUE
, proximity = TRUE))
Call:
randomForest(formula = type ~ glu + age, data = Pima.tr, importance = TRUE, proximity = TRUE)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 1
OOB estimate of error rate: 31.5%
Confusion matrix:
No Yes class.error
No 100 32 0.2424242
Yes 31 37 0.4558824
Melhorou, mas ainda não está bom
modelpred <- predict(model, Pima.te)
(pred <- table(Pima.te$type, modelpred, dnn = list("Observado", "Predito")))
Predito
Observado No Yes
No 193 30
Yes 46 63
# erro de classificação
## No
pred[1, 2] / sum(pred[1, ])
[1] 0.1345291
## Yes
pred[2, 1] / sum(pred[2, ])
[1] 0.4220183
Em Pima.te
temos erros de classificação consideravelmente grandes, principalmente nas mulheres com resultado positivo para diabetes
Tanto na figura abaixo com apenas as variáveis que ficaram na floresta aleatória definitiva, quanto no gráfico de dispersão 2 x 2 de todas as variáveis apresentado na seção ‘Banco de dados’, observa-se uma grande dificuldade de classificar o resultado do teste de diabetes das mulheres com bases nas variáveis. Nenhum padrão é observado
Um ponto positivo observado no resultado da floresta aleatória é que sua classificação não é feita com base em um ponto de corte que visualmente pode ser delimitado, ela lida melhor com problemas que não tem essa clara divisão, como é o caso do banco de dados aqui estudado. Contudo, aqui ela não apresentou bons resultados, dado a complexidade da classificação desejada
print(xyplot(glu ~ age
, groups = type
, col = 2:3
, pch = 19
, type = c("p", "g")
, main = "Pima.te: Observado"
, key = list(space = "top"
, text = list(c("Diabetes: No", "Diabetes: Yes"))
, points = list(col = 2:3, pch = 19, cex = .8)
, columns = 2)
, Pima.te)
, position = c(0, 0, .5, 1), more = TRUE)
print(xyplot(glu ~ age
, groups = modelpred
, col = 2:3
, pch = 19
, type = c("p", "g")
, main = "Pima.te: Predito"
, key = list(space = "top"
, text = list(c("Diabetes: No", "Diabetes: Yes"))
, points = list(col = 2:3, pch = 19, cex = .8)
, columns = 2)
, Pima.te)
, position = c(.5, 0, 1, 1))