Sabatina,

assunto: métodos baseados em árvores

Proposta


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


Banco de dados


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ções
summary(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 à glicose
summary(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 pedigree
summary(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 anos
summary(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 OMS
summary(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))


Random Forest


library(randomForest)

Base de treino


(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


Base de teste


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


Conclusão e considerações


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))