Carregando o banco de dados

Esses dados foram coletados no Kaggle e constitui-se como um experimento descritivo realizado com uma amostra de 309 pessoas. Serão relacionadas as variáveis categóricas, a fim de identificar a associação estatstica de causa e efeito entre as varíaveis coletadas e o quanto elas contribuem para o estudo de câncer para esta população.

dados <- read.csv("survey-lung-cancer.csv", sep = ",", dec = ".")
DT::datatable(dados)

Vereifando-se a classe dessas covariáveis,

str(dados)
## 'data.frame':    309 obs. of  16 variables:
##  $ GENDER               : chr  "M" "M" "F" "M" ...
##  $ AGE                  : int  69 74 59 63 63 75 52 51 68 53 ...
##  $ SMOKING              : int  1 2 1 2 1 1 2 2 2 2 ...
##  $ YELLOW_FINGERS       : int  2 1 1 2 2 2 1 2 1 2 ...
##  $ ANXIETY              : int  2 1 1 2 1 1 1 2 2 2 ...
##  $ PEER_PRESSURE        : int  1 1 2 1 1 1 1 2 1 2 ...
##  $ CHRONIC.DISEASE      : int  1 2 1 1 1 2 1 1 1 2 ...
##  $ FATIGUE              : int  2 2 2 1 1 2 2 2 2 1 ...
##  $ ALLERGY              : int  1 2 1 1 1 2 1 2 1 2 ...
##  $ WHEEZING             : int  2 1 2 1 2 2 2 1 1 1 ...
##  $ ALCOHOL.CONSUMING    : int  2 1 1 2 1 1 2 1 1 2 ...
##  $ COUGHING             : int  2 1 2 1 2 2 2 1 1 1 ...
##  $ SHORTNESS.OF.BREATH  : int  2 2 2 1 2 2 2 2 1 1 ...
##  $ SWALLOWING.DIFFICULTY: int  2 2 1 2 1 1 1 2 1 2 ...
##  $ CHEST.PAIN           : int  2 2 2 2 1 1 2 1 1 2 ...
##  $ LUNG_CANCER          : chr  "YES" "YES" "NO" "NO" ...

sabe-se que algumas calsses dessas variáveis não são compatíveis com as funções do modelo logístico.

Modificando algumas covariáveis

Percebe-se que a variável resposta está categorizada como fator, binári porem fora dos padrões da distribuição binomial aceita: 0 ou 1. Assim é preciso modificar a variável resposta LUNG_CANCER e mudar o aspecto lógico d avariavel AGE de "int" para "num". Assim,

dados$LUNG_CANCER[dados$LUNG_CANCER=='YES']<-1
dados$LUNG_CANCER[dados$LUNG_CANCER=='NO']<-0
dados$LUNG_CANCER <- as.factor(dados$LUNG_CANCER)
dados$AGE <- as.numeric(dados$AGE)
str(dados)
## 'data.frame':    309 obs. of  16 variables:
##  $ GENDER               : chr  "M" "M" "F" "M" ...
##  $ AGE                  : num  69 74 59 63 63 75 52 51 68 53 ...
##  $ SMOKING              : int  1 2 1 2 1 1 2 2 2 2 ...
##  $ YELLOW_FINGERS       : int  2 1 1 2 2 2 1 2 1 2 ...
##  $ ANXIETY              : int  2 1 1 2 1 1 1 2 2 2 ...
##  $ PEER_PRESSURE        : int  1 1 2 1 1 1 1 2 1 2 ...
##  $ CHRONIC.DISEASE      : int  1 2 1 1 1 2 1 1 1 2 ...
##  $ FATIGUE              : int  2 2 2 1 1 2 2 2 2 1 ...
##  $ ALLERGY              : int  1 2 1 1 1 2 1 2 1 2 ...
##  $ WHEEZING             : int  2 1 2 1 2 2 2 1 1 1 ...
##  $ ALCOHOL.CONSUMING    : int  2 1 1 2 1 1 2 1 1 2 ...
##  $ COUGHING             : int  2 1 2 1 2 2 2 1 1 1 ...
##  $ SHORTNESS.OF.BREATH  : int  2 2 2 1 2 2 2 2 1 1 ...
##  $ SWALLOWING.DIFFICULTY: int  2 2 1 2 1 1 1 2 1 2 ...
##  $ CHEST.PAIN           : int  2 2 2 2 1 1 2 1 1 2 ...
##  $ LUNG_CANCER          : Factor w/ 2 levels "0","1": 2 2 1 1 1 2 2 2 1 2 ...
attach(dados)

Descritiva

Esse tipo de análise descritiva é a primeira manipulação realizadas em um estudo quantitativo ou qualitativo e tem como principal objetivo explorar o comportamento dos dados. Isso pode ser feito através de tabelas de frequências, gráficos e medidas de resumo numérico.

Análise univariada

Esse tipo de análise descritiva é baseado em averiguar o comportamento de uma única variável. Nesta seção é apresentada as tabelas de frequências relativas das principais covariáveis em estudos de câncer. Assim,

hist(dados$AGE, xlab="Observações", ylab = "Idades")

cancer.tb <- table(dados$LUNG_CANCER)
prop.table(cancer.tb)
## 
##         0         1 
## 0.1262136 0.8737864
alcool.tb <- table(dados$ALCOHOL.CONSUMING)
prop.table(alcool.tb)
## 
##         1         2 
## 0.4433657 0.5566343
fumar.yb <- table(dados$SMOKING)
prop.table(fumar.yb)
## 
##         1         2 
## 0.4368932 0.5631068
genero.tb <- table(dados$GENDER)
prop.table(genero.tb)
## 
##         F         M 
## 0.4757282 0.5242718
ansiedade.tb <- table(dados$ANXIETY)
prop.table(ansiedade.tb)
## 
##         1         2 
## 0.5016181 0.4983819

Buscando-se uma forma gráfica de representar essas quantidades, os gráficos auxiliam de forma mais dinámica e imediata:

par(mfrow = c(2,2), oma = c(4,1,1,1))
barplot(genero.tb, xlab = "Gênero", ylab = "Contagem de pessoas")
barplot(fumar.yb, xlab = "Habito de fumar", ylab = "Contagem de pessoas")
barplot(alcool.tb, xlab = "Consumo de Àlcool", ylab = "Contagem de pessoas")
barplot(cancer.tb, xlab = "Doença câncer", ylab = "Contagem de pessoas")

  • Algumas observações: a contagem de respostas dentro das covariáveis Gênero, Acool e Fumar parecem seguir uma distribuição uniforme. Já na covariável câncer parece qu há um desbalanceamento na contagem, percebendo-se mais indivíduos com a doença do que sem ela.

Análise bivariada

Semelhante a análise univariada, aqui busca-se conferir o comportamento de duas variáveis simultâneas: nesse caso, a variável Idade(AGE) com a covariável câncer (LUNG_CANCER)

ggplot(dados, aes(AGE, LUNG_CANCER)) +
  geom_point() +  labs(x = "Idade", y = "Deonça câncer") + theme_bw()

Fica claro que quanto maior a idade, maior a ocorrência de cancer.

Modelagem pela regressão logística múltipla binária

Proposta por Hosmer e Lemeshow (1989), a regressão logística tornou-se o principal método em estudos de regressão, principalmente na área da saúde. Essa técnica de regressão generalizada ́e usada quando as covariáveis são dicotônicas. Além disso em muitas vezes é preciso prever o valor de uma covariável de resultado categórico binário. Dessa forma, a regressão logística analisa dados distribu ́ıdos binomialmente. Assim,

m1 = glm(LUNG_CANCER ~., family = binomial(link = "logit"),
         data = dados)

O resultado:

summary(m1)
## 
## Call:
## glm(formula = LUNG_CANCER ~ ., family = binomial(link = "logit"), 
##     data = dados)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.19285   0.01489   0.06721   0.16744   2.39827  
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)           -30.65673    5.48251  -5.592 2.25e-08 ***
## GENDERM                -0.52611    0.70898  -0.742 0.458050    
## AGE                     0.02181    0.03394   0.643 0.520476    
## SMOKING                 1.77601    0.70190   2.530 0.011396 *  
## YELLOW_FINGERS          1.37642    0.74251   1.854 0.063776 .  
## ANXIETY                 0.88775    0.81268   1.092 0.274671    
## PEER_PRESSURE           1.73122    0.66025   2.622 0.008740 ** 
## CHRONIC.DISEASE         3.19156    0.88829   3.593 0.000327 ***
## FATIGUE                 3.07043    0.82520   3.721 0.000199 ***
## ALLERGY                 1.64614    0.76894   2.141 0.032291 *  
## WHEEZING                0.96625    0.83419   1.158 0.246736    
## ALCOHOL.CONSUMING       1.40981    0.79890   1.765 0.077615 .  
## COUGHING                3.31128    1.07166   3.090 0.002002 ** 
## SHORTNESS.OF.BREATH    -0.72889    0.76004  -0.959 0.337550    
## SWALLOWING.DIFFICULTY   3.12209    1.12984   2.763 0.005722 ** 
## CHEST.PAIN              0.55907    0.68913   0.811 0.417212    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.299  on 308  degrees of freedom
## Residual deviance:  91.909  on 293  degrees of freedom
## AIC: 123.91
## 
## Number of Fisher Scoring iterations: 8

Seleção das variáveis

  • Metodo Stepwise: O método stepwise é usado para selecionar quais das variáveis ou covariáveis que mais influenciam o conjunto de saída, podendo assim, diminuir o número de variáveis a compor a equação de regressão e promove o aumento do critério de Akaike e os desvios residuais.
step(m1, direction = 'both')
## Start:  AIC=123.91
## LUNG_CANCER ~ GENDER + AGE + SMOKING + YELLOW_FINGERS + ANXIETY + 
##     PEER_PRESSURE + CHRONIC.DISEASE + FATIGUE + ALLERGY + WHEEZING + 
##     ALCOHOL.CONSUMING + COUGHING + SHORTNESS.OF.BREATH + SWALLOWING.DIFFICULTY + 
##     CHEST.PAIN
## 
##                         Df Deviance    AIC
## - AGE                    1   92.302 122.30
## - GENDER                 1   92.473 122.47
## - CHEST.PAIN             1   92.560 122.56
## - SHORTNESS.OF.BREATH    1   92.836 122.84
## - ANXIETY                1   93.139 123.14
## - WHEEZING               1   93.211 123.21
## <none>                       91.909 123.91
## - ALCOHOL.CONSUMING      1   95.144 125.14
## - YELLOW_FINGERS         1   95.665 125.67
## - ALLERGY                1   96.804 126.80
## - SMOKING                1   99.077 129.08
## - PEER_PRESSURE          1  100.029 130.03
## - SWALLOWING.DIFFICULTY  1  101.815 131.81
## - COUGHING               1  103.460 133.46
## - CHRONIC.DISEASE        1  109.791 139.79
## - FATIGUE                1  110.558 140.56
## 
## Step:  AIC=122.3
## LUNG_CANCER ~ GENDER + SMOKING + YELLOW_FINGERS + ANXIETY + PEER_PRESSURE + 
##     CHRONIC.DISEASE + FATIGUE + ALLERGY + WHEEZING + ALCOHOL.CONSUMING + 
##     COUGHING + SHORTNESS.OF.BREATH + SWALLOWING.DIFFICULTY + 
##     CHEST.PAIN
## 
##                         Df Deviance    AIC
## - CHEST.PAIN             1   92.945 120.94
## - GENDER                 1   92.981 120.98
## - SHORTNESS.OF.BREATH    1   93.316 121.32
## - WHEEZING               1   93.636 121.64
## - ANXIETY                1   93.655 121.66
## <none>                       92.302 122.30
## - ALCOHOL.CONSUMING      1   95.793 123.79
## - YELLOW_FINGERS         1   95.878 123.88
## + AGE                    1   91.909 123.91
## - ALLERGY                1   96.988 124.99
## - SMOKING                1   99.380 127.38
## - PEER_PRESSURE          1  100.972 128.97
## - SWALLOWING.DIFFICULTY  1  102.362 130.36
## - COUGHING               1  104.655 132.66
## - CHRONIC.DISEASE        1  110.830 138.83
## - FATIGUE                1  111.642 139.64
## 
## Step:  AIC=120.94
## LUNG_CANCER ~ GENDER + SMOKING + YELLOW_FINGERS + ANXIETY + PEER_PRESSURE + 
##     CHRONIC.DISEASE + FATIGUE + ALLERGY + WHEEZING + ALCOHOL.CONSUMING + 
##     COUGHING + SHORTNESS.OF.BREATH + SWALLOWING.DIFFICULTY
## 
##                         Df Deviance    AIC
## - GENDER                 1   93.333 119.33
## - SHORTNESS.OF.BREATH    1   94.021 120.02
## - ANXIETY                1   94.036 120.04
## - WHEEZING               1   94.536 120.54
## <none>                       92.945 120.94
## - ALCOHOL.CONSUMING      1   96.183 122.18
## + CHEST.PAIN             1   92.302 122.30
## + AGE                    1   92.560 122.56
## - YELLOW_FINGERS         1   97.311 123.31
## - ALLERGY                1   99.440 125.44
## - SMOKING                1   99.869 125.87
## - PEER_PRESSURE          1  102.990 128.99
## - SWALLOWING.DIFFICULTY  1  104.642 130.64
## - COUGHING               1  105.317 131.32
## - CHRONIC.DISEASE        1  110.872 136.87
## - FATIGUE                1  113.288 139.29
## 
## Step:  AIC=119.33
## LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + ANXIETY + PEER_PRESSURE + 
##     CHRONIC.DISEASE + FATIGUE + ALLERGY + WHEEZING + ALCOHOL.CONSUMING + 
##     COUGHING + SHORTNESS.OF.BREATH + SWALLOWING.DIFFICULTY
## 
##                         Df Deviance    AIC
## - ANXIETY                1   94.222 118.22
## - SHORTNESS.OF.BREATH    1   94.397 118.40
## - WHEEZING               1   94.738 118.74
## <none>                       93.333 119.33
## - ALCOHOL.CONSUMING      1   96.187 120.19
## + AGE                    1   92.864 120.86
## + GENDER                 1   92.945 120.94
## + CHEST.PAIN             1   92.981 120.98
## - YELLOW_FINGERS         1   98.071 122.07
## - SMOKING                1   99.874 123.87
## - ALLERGY                1  100.643 124.64
## - PEER_PRESSURE          1  103.306 127.31
## - SWALLOWING.DIFFICULTY  1  104.951 128.95
## - COUGHING               1  105.410 129.41
## - CHRONIC.DISEASE        1  111.731 135.73
## - FATIGUE                1  113.764 137.76
## 
## Step:  AIC=118.22
## LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + PEER_PRESSURE + CHRONIC.DISEASE + 
##     FATIGUE + ALLERGY + WHEEZING + ALCOHOL.CONSUMING + COUGHING + 
##     SHORTNESS.OF.BREATH + SWALLOWING.DIFFICULTY
## 
##                         Df Deviance    AIC
## - WHEEZING               1   95.117 117.12
## - SHORTNESS.OF.BREATH    1   95.697 117.70
## <none>                       94.222 118.22
## + ANXIETY                1   93.333 119.33
## + AGE                    1   93.667 119.67
## - ALCOHOL.CONSUMING      1   97.903 119.90
## + CHEST.PAIN             1   93.983 119.98
## + GENDER                 1   94.036 120.04
## - SMOKING                1  101.022 123.02
## - ALLERGY                1  101.418 123.42
## - YELLOW_FINGERS         1  102.802 124.80
## - PEER_PRESSURE          1  103.956 125.96
## - COUGHING               1  105.737 127.74
## - SWALLOWING.DIFFICULTY  1  108.292 130.29
## - CHRONIC.DISEASE        1  112.805 134.81
## - FATIGUE                1  116.564 138.56
## 
## Step:  AIC=117.12
## LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + PEER_PRESSURE + CHRONIC.DISEASE + 
##     FATIGUE + ALLERGY + ALCOHOL.CONSUMING + COUGHING + SHORTNESS.OF.BREATH + 
##     SWALLOWING.DIFFICULTY
## 
##                         Df Deviance    AIC
## - SHORTNESS.OF.BREATH    1   96.631 116.63
## <none>                       95.117 117.12
## + WHEEZING               1   94.222 118.22
## + AGE                    1   94.615 118.61
## + CHEST.PAIN             1   94.651 118.65
## + ANXIETY                1   94.738 118.74
## + GENDER                 1   94.995 119.00
## - ALCOHOL.CONSUMING      1   99.845 119.84
## - SMOKING                1  101.495 121.50
## - ALLERGY                1  102.523 122.52
## - YELLOW_FINGERS         1  102.962 122.96
## - PEER_PRESSURE          1  105.192 125.19
## - COUGHING               1  112.392 132.39
## - SWALLOWING.DIFFICULTY  1  113.157 133.16
## - CHRONIC.DISEASE        1  113.215 133.22
## - FATIGUE                1  118.755 138.75
## 
## Step:  AIC=116.63
## LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + PEER_PRESSURE + CHRONIC.DISEASE + 
##     FATIGUE + ALLERGY + ALCOHOL.CONSUMING + COUGHING + SWALLOWING.DIFFICULTY
## 
##                         Df Deviance    AIC
## <none>                       96.631 116.63
## + SHORTNESS.OF.BREATH    1   95.117 117.12
## + WHEEZING               1   95.697 117.70
## + ANXIETY                1   95.961 117.96
## + AGE                    1   96.030 118.03
## + CHEST.PAIN             1   96.171 118.17
## + GENDER                 1   96.570 118.57
## - SMOKING                1  102.026 120.03
## - ALCOHOL.CONSUMING      1  103.301 121.30
## - ALLERGY                1  103.513 121.51
## - YELLOW_FINGERS         1  105.430 123.43
## - PEER_PRESSURE          1  107.047 125.05
## - COUGHING               1  112.960 130.96
## - SWALLOWING.DIFFICULTY  1  113.161 131.16
## - CHRONIC.DISEASE        1  113.288 131.29
## - FATIGUE                1  121.004 139.00
## 
## Call:  glm(formula = LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + PEER_PRESSURE + 
##     CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
##     COUGHING + SWALLOWING.DIFFICULTY, family = binomial(link = "logit"), 
##     data = dados)
## 
## Coefficients:
##           (Intercept)                SMOKING         YELLOW_FINGERS  
##               -27.323                  1.454                  1.741  
##         PEER_PRESSURE        CHRONIC.DISEASE                FATIGUE  
##                 1.874                  2.695                  2.870  
##               ALLERGY      ALCOHOL.CONSUMING               COUGHING  
##                 1.834                  1.751                  3.065  
## SWALLOWING.DIFFICULTY  
##                 3.427  
## 
## Degrees of Freedom: 308 Total (i.e. Null);  299 Residual
## Null Deviance:       234.3 
## Residual Deviance: 96.63     AIC: 116.6

Assim, selecionamos as variáveis para o modelo. A conferir:

m1_after_stepwise <- glm(formula = LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + PEER_PRESSURE + 
      CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
      COUGHING + SWALLOWING.DIFFICULTY, family = binomial(link = "logit"), 
    data = dados)

summary(m1_after_stepwise)
## 
## Call:
## glm(formula = LUNG_CANCER ~ SMOKING + YELLOW_FINGERS + PEER_PRESSURE + 
##     CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
##     COUGHING + SWALLOWING.DIFFICULTY, family = binomial(link = "logit"), 
##     data = dados)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.39797   0.01515   0.06230   0.18836   2.25582  
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)           -27.3228     4.6537  -5.871 4.33e-09 ***
## SMOKING                 1.4536     0.6535   2.224 0.026120 *  
## YELLOW_FINGERS          1.7409     0.6397   2.722 0.006497 ** 
## PEER_PRESSURE           1.8743     0.6372   2.942 0.003265 ** 
## CHRONIC.DISEASE         2.6949     0.7619   3.537 0.000404 ***
## FATIGUE                 2.8705     0.6719   4.272 1.94e-05 ***
## ALLERGY                 1.8342     0.7238   2.534 0.011267 *  
## ALCOHOL.CONSUMING       1.7514     0.7117   2.461 0.013861 *  
## COUGHING                3.0653     0.8369   3.663 0.000250 ***
## SWALLOWING.DIFFICULTY   3.4267     0.9797   3.498 0.000469 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.299  on 308  degrees of freedom
## Residual deviance:  96.631  on 299  degrees of freedom
## AIC: 116.63
## 
## Number of Fisher Scoring iterations: 8

Nota-se que após a seleção das covariaveis por Spetwise é importante salientar a inclusão da variável AGE(idade) no modelo, pois na literatura encontram-se diversas citações de artigos na area da medicina que associam a idade como um fator para o aparecimento de câncer de pulmão.

m1_after_stepwise_plus_age <- glm(formula = LUNG_CANCER ~ AGE + SMOKING + YELLOW_FINGERS + PEER_PRESSURE + 
      CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
      COUGHING + SWALLOWING.DIFFICULTY, family = binomial(link = "logit"), 
    data = dados)

summary(m1_after_stepwise_plus_age)
## 
## Call:
## glm(formula = LUNG_CANCER ~ AGE + SMOKING + YELLOW_FINGERS + 
##     PEER_PRESSURE + CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
##     COUGHING + SWALLOWING.DIFFICULTY, family = binomial(link = "logit"), 
##     data = dados)
## 
## Deviance Residuals: 
##      Min        1Q    Median        3Q       Max  
## -2.30683   0.01596   0.06237   0.17922   2.30461  
## 
## Coefficients:
##                        Estimate Std. Error z value Pr(>|z|)    
## (Intercept)           -28.88555    5.16617  -5.591 2.25e-08 ***
## AGE                     0.02660    0.03342   0.796 0.426042    
## SMOKING                 1.49365    0.65848   2.268 0.023310 *  
## YELLOW_FINGERS          1.77355    0.64985   2.729 0.006349 ** 
## PEER_PRESSURE           1.82812    0.64030   2.855 0.004302 ** 
## CHRONIC.DISEASE         2.65898    0.76518   3.475 0.000511 ***
## FATIGUE                 2.84404    0.67325   4.224 2.40e-05 ***
## ALLERGY                 1.87503    0.72557   2.584 0.009760 ** 
## ALCOHOL.CONSUMING       1.71489    0.71440   2.400 0.016375 *  
## COUGHING                3.01781    0.83775   3.602 0.000315 ***
## SWALLOWING.DIFFICULTY   3.45438    0.99519   3.471 0.000518 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.30  on 308  degrees of freedom
## Residual deviance:  96.03  on 298  degrees of freedom
## AIC: 118.03
## 
## Number of Fisher Scoring iterations: 8

Função de ligação estimada do modelo estimada:

\(ln(\frac{prob_{LUNG\_CANCER}}{1-prob_{LUNG\_CANCER}} ) = -28.8856 + \\ \\ 0.0266\times AGE 1.4937\times SMOKING + \\ 1.7735\times YELLOW\_FINGERS + \\ 1.8281\times PEER\_PRESSURE + \\ 2.6590\times CHRONIC.DISEASE + \\ 2.8440\times FATIGUE + \\ 1.8750\times ALLERGY + \\ 1.7149\times ALCOHOL.CONSUMING + \\ 3.0178\times COUGHING + \\ 3.4544\times SWALLOWING.DIFFICULTY\)

O coeficiente de 1.4937 ,por exemplo, para SMOKING, pelo fato de ser positivo diz respeito que quando se é fumante (SMOKING) se eleva, elevam-se as chances de ocorrência de câncer de pulmão (LUNG_CANCER) (p < 0.05).

Razão de chances stimada

logitor(LUNG_CANCER ~ AGE + SMOKING + YELLOW_FINGERS + PEER_PRESSURE + 
      CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
      COUGHING + SWALLOWING.DIFFICULTY, data = dados)
## Call:
## logitor(formula = LUNG_CANCER ~ AGE + SMOKING + YELLOW_FINGERS + 
##     PEER_PRESSURE + CHRONIC.DISEASE + FATIGUE + ALLERGY + ALCOHOL.CONSUMING + 
##     COUGHING + SWALLOWING.DIFFICULTY, data = dados)
## 
## Odds Ratio:
##                       OddsRatio Std. Err.      z     P>|z|    
## AGE                    1.026959  0.034321 0.7960 0.4260420    
## SMOKING                4.453321  2.932442 2.2683 0.0233100 *  
## YELLOW_FINGERS         5.891723  3.828712 2.7292 0.0063491 ** 
## PEER_PRESSURE          6.222203  3.984062 2.8551 0.0043021 ** 
## CHRONIC.DISEASE       14.281741 10.928128 3.4750 0.0005109 ***
## FATIGUE               17.185105 11.569949 4.2243 2.397e-05 ***
## ALLERGY                6.521043  4.731449 2.5842 0.0097595 ** 
## ALCOHOL.CONSUMING      5.556037  3.969256 2.4004 0.0163753 *  
## COUGHING              20.446374 17.129051 3.6023 0.0003155 ***
## SWALLOWING.DIFFICULTY 31.638514 31.486340 3.4711 0.0005184 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Tem-se que a razão de chances da variável SMOKING foi de 4.2784. A interpretação: dado o satus de fumante (SMOKING), as chances de ocorrância de câncer de pulmâo aumentam 4.2784 vezes. Além disso, é possível também criar um intervalo de confiança para as estimativas a partir da funçaõ confint.

Intervalo de confiança estimado

exp(cbind(Estimativa=coef(m1_after_stepwise_plus_age), confint(m1_after_stepwise_plus_age)))
## Waiting for profiling to be done...
##                         Estimativa        2.5 %       97.5 %
## (Intercept)           2.852095e-13 3.188074e-18 2.503375e-09
## AGE                   1.026959e+00 9.569059e-01 1.095329e+00
## SMOKING               4.453321e+00 1.288778e+00 1.761927e+01
## YELLOW_FINGERS        5.891723e+00 1.787598e+00 2.367174e+01
## PEER_PRESSURE         6.222203e+00 1.914361e+00 2.427543e+01
## CHRONIC.DISEASE       1.428174e+01 3.580599e+00 7.507599e+01
## FATIGUE               1.718511e+01 5.029369e+00 7.288731e+01
## ALLERGY               6.521043e+00 1.641117e+00 2.943470e+01
## ALCOHOL.CONSUMING     5.556037e+00 1.446795e+00 2.472957e+01
## COUGHING              2.044637e+01 4.332374e+00 1.199875e+02
## SWALLOWING.DIFFICULTY 3.163851e+01 5.241905e+00 2.691147e+02

Predição

dados$pdata <- as.factor(
  ifelse(
    predict(m1_after_stepwise_plus_age,
            newdata = dados,
            type = "response")
    > 0.5, "1", "0"
  )
)
confusionMatrix(dados$pdata, dados$LUNG_CANCER, positive = "1")
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  29   6
##          1  10 264
##                                           
##                Accuracy : 0.9482          
##                  95% CI : (0.9173, 0.9701)
##     No Information Rate : 0.8738          
##     P-Value [Acc > NIR] : 9.834e-06       
##                                           
##                   Kappa : 0.7545          
##                                           
##  Mcnemar's Test P-Value : 0.4533          
##                                           
##             Sensitivity : 0.9778          
##             Specificity : 0.7436          
##          Pos Pred Value : 0.9635          
##          Neg Pred Value : 0.8286          
##              Prevalence : 0.8738          
##          Detection Rate : 0.8544          
##    Detection Prevalence : 0.8867          
##       Balanced Accuracy : 0.8607          
##                                           
##        'Positive' Class : 1               
## 

Dentre esses resultados temos que:

  • Precisão: proporcao das predições corretas do modelo sobre o total das predicoes, tal que \(P\) representa o total de eventos positivos \((Y = 1)\) e \(N\) é o total de “não-eventos” \((Y = 0)\). Assim

\[\hat{AC} = \frac{VP +VN}{P+N}\]

  • Sensibilidade: proporcao de verdadeiros positivos, ou seja, a capacidade do modelo em avaliar o evento como \(\hat{Y}=1\) (estimado) dado que ele é evento real \(Y = 1\).

\[\hat{S} = \frac{VP}{FN}\]

  • Especificidade: proporção dos verdadeiros negativos, ou seja, o poder de predicao do modelo em avaliar \(\hat{Y}=0\) sendo que ele não é evento \(\hat{Y}=0\):

\[\hat{E} = \frac{VN}{VN + VP}\]

  • Valor Preditivo Positivo: proporção de verdadeiros positivos com relação ao total de predicoes positivas, ou seja, se o evento é real \(Y=1\) dada a classificacao do modelo \(\hat{Y}=1\).

\[\hat{VPP} = \frac{VP}{VN + FP}\]

  • Valor Preditivo Negativo: proporção de verdadeiros negativos comparando-se com o total de predições negativas, ou seja, o indivíduo nao ser evento Y=0Y=0 dada classificação do modelo como “não evento” \(\hat{Y}=0\):

\[\hat{VPN} = \frac{VN}{VN + FN}\]

Curva ROC

A curva ROC é dada bi-dimensionalmente pela relação entre a taxa VPP (verdadeiros positivos) do modelo proposto e da taxa FPP (falsos positivos preditos).

curva_roc <-  plot.roc(dados$LUNG_CANCER, fitted(m1_after_stepwise_plus_age))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases

Assim, demonstra-se a elaboração do conceito da Área sobre a Curva ROC (AUC - Area Under the ROC Curve), que compara os classificadores a partir da parformance da curva em um único valor escalar. Este indicador representa a probabilidade de que o classificador efetue predições randômicas na instância positiva melhor do que na instância negativa. O indicador AUC sempre terá seu valor entre 0 e 1, sendo que quanto maior, melhor e nunca um classificador realístico deve estar abaixo de 0,5. Hosmer e Lemeschow (2000) sugere a utilização de AUC acima de 0,7 como aceitável. Então tem-se que,

plot(curva_roc,
     print.auc=TRUE, 
     auc.polygon=TRUE, 
     grud=c(0.1,0.2),
     grid.col=c("#E3CD38","red"), 
     max.auc.polygon=TRUE, 
     auc.polygon.col="#FFC300", 
     print.thres=TRUE, xlab = "Especificidade", ylab = "Sensibilidade", main="Curva ROC")

Teste de Hosmer e Lemeshow

Esse teste é utilizado para mostrar a qualidade do ajuste do modelo proposto, ou seja, se o modelo pode explicar os dados observados ou não. A hipotese nula \(H_0\) do qui-quadrado (p=0,05) deste teste é a de que as proporções observadas e esperadas sao as mesmas ao longo da amostra.

hoslem.test(dados$LUNG_CANCER,fitted(m1_after_stepwise_plus_age),g=10)
## Warning in Ops.factor(1, y): '-' not meaningful for factors
## 
##  Hosmer and Lemeshow goodness of fit (GOF) test
## 
## data:  dados$LUNG_CANCER, fitted(m1_after_stepwise_plus_age)
## X-squared = 309, df = 8, p-value < 2.2e-16

Como o valor de P é menor que \(0.05\) a hipotese nula foi rejeitada pelo teste.

Pseudo-R^{2}

Semelhante ao coeficiente de determinação \(R^{2}\) da regressão múltipla, a medida de pseudo \(R^{2}\) representam o ajuste geral do modelo proposto. Sua interpretação, portanto, é semelhante à regressão múltipla. o valor \(-2LL_{nulo}\) representa \(-2\) vezes o logaritmo do valor de verossimilhança, onde a verossimilhança do modelo nulo é comparado com o modelo completo. Abaixo mostra-se o código para calcular os indicadores, sendo que constam as medidas de pseudo \(R^{2}\) estipuladas por Cox e Snell, Nagelkerke e McFadden.

\[R^{2 }_{LOGIT} = \frac{-2LL_{nulo} - (-2LL_{nulo})}{-2LL_{nulo}}\]

RsqGLM(m1_after_stepwise_plus_age)

## $CoxSnell
## [1] 0.3607593
## 
## $Nagelkerke
## [1] 0.6787385
## 
## $McFadden
## [1] 0.5901407
## 
## $Tjur
## [1] 0.574597
## 
## $sqPearson
## [1] 0.5671109

Ou seja, Assim, quanto maior o pseudo-\(R^{2}\), mais explicativo é o modelo e melhor ele se ajusta à amostra.

Diagnóstico do Modelo

A análise de diagnóstico (ou diagnóstico do ajuste) configura uma etapa fundamental no ajuste de modelos de regressão. Aqui, serão avaliados a multicolinearidade, pontos de alavncagem e distância de cook's.

Multicolinearidade

car::vif(m1_after_stepwise_plus_age)
##                   AGE               SMOKING        YELLOW_FINGERS 
##              1.084763              1.531182              1.345174 
##         PEER_PRESSURE       CHRONIC.DISEASE               FATIGUE 
##              1.273727              2.010599              1.613279 
##               ALLERGY     ALCOHOL.CONSUMING              COUGHING 
##              1.510266              1.677328              2.309246 
## SWALLOWING.DIFFICULTY 
##              2.035942

A função 'vif' diz se há ou não multicolinearidade. Assim, valores que ultrapassam 10.0 indicam colinearidade; dessa maneira, a condição de não multicolinearidade foi testada.

Pontos de alavancagem

plot(m1_after_stepwise_plus_age, which = 5)

  • O outlier no gráfico aparece com valor no eixo x maior do que todos os dados. Vemos que esse ponto que tem indice alto de resíduo e alta alavancagem. Assim, investigar esse e outros pontos que estão próximos ou fora das curvas vermelhas tracejadas é indispensável. A linha tracejada vermelha representa as distâncias de cook acima de 0,5 e 1. Assim, olhar para o gráfico de distâncias de cook para ver as distâncias de cook do outlier.

Distância de Cook

plot(m1_after_stepwise_plus_age, which = 4)

  • A partir do gráfico vemos os outliers no ponto 23 ,30 e 234 com 0,3 e 0,10 distâncias de cook ,que era o esperado como no gráfico anterior, de resíduos vs. alavancagem. Embora discrepante o ponto 23 não parecer alta alavancagem pois não estava acima da linha tracejada vermelha com distância de cook de 0,5.