-
Notifications
You must be signed in to change notification settings - Fork 1
/
Modelo linear generalizado logistico.R
120 lines (92 loc) · 3.82 KB
/
Modelo linear generalizado logistico.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
## Curso Modelos de regressão no software R - Módulo 2 ##
## Modelos lineares generalizados ##
## Modelos lineares são utilizados para variáveis com distribuição normal
## A grande maioria das variáveis não tem distribuição normal
## Para este tipo de variáveis nós precisamos usar os modelos conhecidos como lineares generalizados
## Como identificar se a minha variável tem distribuição normal????
## Através dos testes de normalidade como Kolmogorov-Smirnov e Shapiro-Wilk
## Vocês já aprenderam a analizar estes testes no curso Modelos de regressão linear - módulo 1
## Os modelos lineares generalizados são utilizados para analizar
## variáveis que possuem distribuição não normal tais como:
## dados binários, dados de contagem, probabilidades, proporções, etc
## Leitura dos dados
dados<-read.table("caminhododiretorio/tuberculose-dados-all.csv",h=T,sep=";")
# Sumarizar os dados
library(dplyr)
continuous <- select_if(dados, is.numeric)
statistics<-summary(continuous)
write.csv(statistics, "dados-tuberculose-reg-stat.csv")
# Rodando o modelo para analizar o uso de smartphone pela população
# Para este tipo de modelo a distribuição utilizada é binomial
# family - distribuição dos nossos dados
# documentação https://www.rdocumentation.org/packages/stats/versions/3.6.2/topics/glm
#Renomear GTA
colnames(dados)[1]<-("GTA")
colnames(dados)[13]<-("tuberculosis_cat")
# Remover as GTAS repetidas
dados<-dados[!duplicated(dados$GTA),]
glm1 <- glm(formula= tuberculosis_cat ~ TOTAL.ABATIDOS + QTD_PARTE_PARTADA, data=dados,
family=binomial)
summary(glm1)
glm2 <- glm(formula= tuberculosis_cat ~ TOTAL.ABATIDOS, data=dados,
family=binomial)
summary(glm2)
glm3 <- glm(formula= tuberculosis_cat ~ QTD_PARTE_PARTADA, data=dados,
family=binomial)
summary(glm3)
# Teste de Hosmer-Lemeshow
library(ResourceSelection)
hoslem.test(dados$tuberculosis_cat, fitted(glm1))
# Fazendo predições
teste<-data.frame(Sexo=c(1,1,2,2),Idade=c(30,65,40,58), Smartphone=c(0,1,1,1))
predict <- predict(glm1, dados, type = 'response')
predict
# predict - ele vai dar um numero entre 0 e 1 assim, maior que 0.5 vai ser meu 1
# menor que 0.5 meu 0 logo, um valor 0.34 significa minha classe 0
# nesse exemplo, 0 usa smarthphone, e 1 não usa smarthphone
# 1 2 3 4
# 0.1051911 0.9690878 0.3670668 0.9111694
# era assim 0 1 1 1
# acertou acertou errou acertou
# https://www.rdocumentation.org/packages/car/versions/3.0-10/topics/Predict
# Matrix de confusão
dados_conf_matrix <- table(dados$tuberculosis_cat, predict > 0.5)
dados_conf_matrix
# nas colunas a matriz tem os valores reais e nas linhas os valores preditos
# FALSE TRUE
##0 1 0
##1 1 2
# o modelo classificou uma errada a diagonal principal é o que o modelo acertou
### FALSE TRUE
##0 1 0 linha classe zero
##1 - 1 - 2 linha classe um
### aqui é o erro
###
# Calculando a acurácia
acuracia <- sum(diag(dados_conf_matrix)) / sum(dados_conf_matrix)
acuracia
# Calculando a precisão
precision <- function(matrix) {
# True positive
tp <- matrix[2, 2]
# false positive
fp <- matrix[1, 2]
return (tp / (tp + fp))
}
recall <- function(matrix) {
tp <- matrix[2, 2]# true positive
fn <- matrix[2, 1]# false negative
return (tp / (tp + fn))
}
prec <- precision(dados_conf_matrix)
prec
rec <- recall(dados_conf_matrix)
rec
f1 <- 2 * ((prec * rec) / (prec + rec))
f1
# Plotando os resultados
library(ROCR)
ROCRpred <- prediction(predict, teste$Smartphone)
ROCRperf <- performance(ROCRpred, 'tpr', 'fpr')
plot(ROCRperf, colorize = TRUE, text.adj = c(-0.2, 1.7))
#fazer smote para fazer a amostragem