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.
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)
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.
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")
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.
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
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
\(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).
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.
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
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:
\[\hat{AC} = \frac{VP +VN}{P+N}\]
\[\hat{S} = \frac{VP}{FN}\]
\[\hat{E} = \frac{VN}{VN + VP}\]
\[\hat{VPP} = \frac{VP}{VN + FP}\]
\[\hat{VPN} = \frac{VN}{VN + FN}\]
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")
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.
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.
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.
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.
plot(m1_after_stepwise_plus_age, which = 5)
plot(m1_after_stepwise_plus_age, which = 4)