CÓDIGOS DISSERTAÇÃO VERSÃO QUALIFICAÇÃO

Author

BARREIRA, R.

CÓDIGOS DISSERTAÇÃO MESTRADO RENATO BARREIRA

Nesse documento há os códigos utilizados na dissertação Métodos Fuzzy aplicados à Ciência Política apresentado ao PPGCP-UNIRIO.

CAPÍTULO 1 - LÓGICA FUZZY

Nesse capítulo foi utilizado um sistema de inferência fuzzy como exemplo.

Nesse bloco, defini-se as variáveis de entrada e as variáveis de saída.

library(sets)
sets_options("universe", seq(from = 0, to = 10, by = 0.1)) 
variaveis = set(
    ideologia = fuzzy_variable(
      esquerda = fuzzy_trapezoid(corners = c(-1 , 0, 2, 4)),
      centro = fuzzy_trapezoid(corners = c(2 , 4, 6, 8)),
      direita = fuzzy_trapezoid(corners = c( 6, 8, 10, 11))),
    
    intervencionismo = fuzzy_variable(
      nulo = fuzzy_trapezoid(corner = c(-1, 0, 0.1, 1)),
      medio = fuzzy_trapezoid(corner = c(1, 2, 2.1, 3)),
      alto = fuzzy_trapezoid(corner = c(2, 3, 10, 11))),
    
    conservadorismo = fuzzy_variable(
      baixo = fuzzy_trapezoid(corners = c(-1 , 0, 2, 4)),
      medio = fuzzy_trapezoid(corners = c(2 , 4, 6, 8)),
      alto = fuzzy_trapezoid(corners = c( 6, 8, 10, 11)))
    )

As variáveis são funções de grau de pertencimento onde o valor do eixo x vai dar um grau de pertencimento a classe (função) entre 0 e 1.

# Visualizando a variável ideologia
plot(variaveis$ideologia, main = "Variável Fuzzy: Ideologia")

# Visualizando a variável intervencionismo
plot(variaveis$intervencionismo, main = "Variável Fuzzy: Intervencionismo")

# Visualizando a variável conservadorismo
plot(variaveis$conservadorismo, main = "Variável Fuzzy: Conservadorismo")

O sistema de inferência utiliza regras lógicas se - então, definidas no código abaixo:

rules = set(
    fuzzy_rule(ideologia %is% esquerda && intervencionismo %is% nulo, conservadorismo %is% baixo),
    fuzzy_rule(ideologia %is% esquerda && intervencionismo %is% medio, conservadorismo %is% medio),
    fuzzy_rule(ideologia %is% esquerda && intervencionismo %is% alto, conservadorismo %is% alto),
    fuzzy_rule(ideologia %is% centro && intervencionismo %is% nulo, conservadorismo %is% medio),
    fuzzy_rule(ideologia %is% centro && intervencionismo %is% medio, conservadorismo %is% alto),
    fuzzy_rule(ideologia %is% centro && intervencionismo %is% alto, conservadorismo %is% alto),
    fuzzy_rule(ideologia %is% direita && intervencionismo %is% nulo, conservadorismo %is% medio),
    fuzzy_rule(ideologia %is% direita && intervencionismo %is% medio, conservadorismo %is% alto),
    fuzzy_rule(ideologia %is% direita && intervencionismo %is% alto, conservadorismo %is% alto)
    )

Definindo o sistema de variáveis e regras

system <- fuzzy_system(variaveis, rules)

Calculando o valor de saída com um valor de entrada aleatória. O gráfico fi mostra o gráfico cujo centroide será calculado.

fi <- fuzzy_inference(system, list(ideologia = 5 ,  intervencionismo = 3))
plot(fi)

gset_defuzzify(fi, "centroid")
[1] 8.470492

Para analisar o modelo como um todo, segue abaixo um “mapa de calor” com todas as entradas possíveis e suas possíveis saídas. Esse gráfico tem o objetivo de analisar o modelo como um todo e melhor definir as fronteiras das classes.

library(plotly)
Carregando pacotes exigidos: ggplot2

Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':

    last_plot
The following object is masked from 'package:sets':

    %>%
The following object is masked from 'package:stats':

    filter
The following object is masked from 'package:graphics':

    layout
# Função para calcular o valor de saída baseado na inferência fuzzy
calc_output <- function(input1, input2) {
  result <- fuzzy_inference(system, list(ideologia = input1, intervencionismo = input2))
  return(gset_defuzzify(result, "centroid"))
}

# Gerando os dados para o gráfico 2D
ideologia_vals <- seq(0, 10, by = 0.5)
intervencionismo_vals <- seq(0, 10, by = 0.5)
conservadorismo_vals <- outer(ideologia_vals, intervencionismo_vals, Vectorize(calc_output))

# Preparando os dados para o plotly
df <- expand.grid(ideologia = ideologia_vals, intervencionismo = intervencionismo_vals)
df$conservadorismo <- as.vector(conservadorismo_vals)

# Plotando o gráfico 2D
plot_ly(df, x = ~ideologia, y = ~intervencionismo, z = ~conservadorismo, type = 'contour') %>%
  layout(title = "Sistema de Inferência Fuzzy",
         xaxis = list(title = 'Ideologia'),
         yaxis = list(title = 'Intervencionismo'))

PARTE 2 CAPÍTULO 1 - Em busca do Algorítimo Bolsonarista

Seguem abaixo os códigos referentes oa capítulo

echo = FALSE
library(haven) #importar banco de dados em formato spss
library(dplyr) #a essa altura eu nem lembro mais oq ela faz, eu só coloco

Attaching package: 'dplyr'
The following object is masked from 'package:sets':

    %>%
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
library(readr) #abrir csv, eu acho
library(e1071) #fuzzy cmeans eu acho rs
library(ggplot2) #dizem por ai q ele faz uns gráficos rs

Importando o banco de dados sem tratamento da página github do autor.

data1 <- read_sav("https://github.com/Renatobarreiraunirio/ADAE/raw/main/04810.sav")

Selecionando somente as variáveis que serão usadas, renomeando, tirando o que não queremos etc.

data2 <- data1 %>%
  select(Q19, Q17_2, Q16_5, Q17_5, Q30a, Q30b, Q30c)

data2 <- data2 %>%
  rename(
    GOSTA_PT =  Q16_5,
    GOSTA_BOLSONARO = Q17_2,
    GOSTA_LULA = Q17_5,
    IDEOLOGIA = Q19,
    INTERV_MIL_CRIME = Q30a,
    INTERV_MIL_CORRUPCAO = Q30b,
    INTERV_MIL_INST_POL = Q30c
  )

#tirando os "não sei" "não respondeu" etc."
data2 <- data2[data2$INTERV_MIL_CRIME <= 10, ]
data2 <- data2[data2$INTERV_MIL_CORRUPCAO <= 10, ]
data2 <- data2[data2$INTERV_MIL_INST_POL <= 10, ]
data2 <- data2[data2$IDEOLOGIA <= 10, ]
data2 <- data2[data2$GOSTA_BOLSONARO <= 10, ]
data2 <- data2[data2$GOSTA_LULA <= 10, ]
data2 <- data2[data2$GOSTA_PT <= 10, ]

data2 <- na.omit(data2)

#salvando que arquivo que vai para o github tb
#write.csv(data2, "data2.csv", row.names = FALSE)

Utilização do Fuzzy C-Means BOLSONARISMO

data_subset <- data2 %>% select(GOSTA_BOLSONARO, IDEOLOGIA)

data_scaled <- scale(data_subset) #nese caso, não acho que seja realmente necessário.

num_clusters <- 3 

# serve para dar sempre a mesma ordem de clusters
set.seed(123) 

# FUZZY C-MEANS
fcm_result <- cmeans(data_scaled, centers = num_clusters, iter.max = 100, m = 2)


#print(fcm_result) só pra ver se deu certo.

# adicionar os graus de pertencimento ao data frame
data2$cluster <- fcm_result$cluster
for (i in 1:num_clusters) {
  data2[[paste0("membership_cluster", i)]] <- fcm_result$membership[, i]
}

# Visualizar os clusters
ggplot(data2, aes(x = GOSTA_BOLSONARO, y = IDEOLOGIA, color = as.factor(cluster), , size = membership_cluster2)) +
  geom_point() +
  theme_minimal() +
  labs(color = "Cluster")

Utilização do Fuzzy C-Means ANTIPETISMO

# Selecionar apenas as variáveis de interesse
data_subset_ptismo <- data2 %>% select(GOSTA_LULA, GOSTA_PT)

#não sei se precisa, mas pq não né
data_scaled_ptismo <- scale(data_subset_ptismo)


num_clusters_ptismo <- 3

set.seed(123)

# Executar o algoritmo fuzzy c-means
fcm_result_ptismo <- cmeans(data_scaled_ptismo, centers = num_clusters_ptismo, iter.max = 100, m = 2)


#print(fcm_result_new) #só pra ver se funcionou mesmo não precisa.

# Adicionar o grau de pertencimento do novo clustering

data2$cluster_new <- fcm_result_ptismo$cluster
for (i in 1:num_clusters_ptismo) {
  data2[[paste0("membership_cluster_new", i)]] <- fcm_result_ptismo$membership[, i]
}

# Visualizar os clusters
ggplot(data2, aes(x = GOSTA_LULA, y = GOSTA_PT, color = as.factor(cluster_new), size = membership_cluster_new1)) +
  geom_point() +
  theme_minimal() +
  labs(color = "Cluster")

Para melhor trabalhar os dados, vamos renomear o grau de pertencimento dos clusters acima

data2 <- data2 %>%
  rename(
    BOLSONARISMO = membership_cluster2,
    ANTIPETISMO = membership_cluster_new1
  )

Para enriquecer a análise

# Visualizar a distribuição das variáveis antipetismo e bolsonarismo
summary(data2$antipetismo)
Warning: Unknown or uninitialised column: `antipetismo`.
Length  Class   Mode 
     0   NULL   NULL 
summary(data2$bolsonarismo)
Warning: Unknown or uninitialised column: `bolsonarismo`.
Length  Class   Mode 
     0   NULL   NULL 
# Gráfico de dispersão para identificar um possível ponto de corte
ggplot(data2, aes(x = ANTIPETISMO, y = BOLSONARISMO)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE, color = "red") +
  labs(title = "Bolsonarismo vs. Antipetismo", x = "Antipetismo", y = "Bolsonarismo")
`geom_smooth()` using formula = 'y ~ x'

Gráfico do Fuzzy RDD com ponto de corte 0.75

library(ggplot2)
library(dplyr)
library(broom)

# Definir a variável de tratamento
data2 <- data2 %>%
  mutate(treatment = ifelse(ANTIPETISMO > 0.75, 1, 0))

# Ajustar o modelo OLS para análise fuzzy RDD
model <- lm(BOLSONARISMO ~ ANTIPETISMO + treatment, data = data2)
summary(model)

Call:
lm(formula = BOLSONARISMO ~ ANTIPETISMO + treatment, data = data2)

Residuals:
    Min      1Q  Median      3Q     Max 
-0.7753 -0.1344 -0.0771  0.1899  0.8456 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.13817    0.01083  12.753   <2e-16 ***
ANTIPETISMO  0.75873    0.06539  11.603   <2e-16 ***
treatment   -0.10999    0.06118  -1.798   0.0724 .  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.2912 on 1501 degrees of freedom
Multiple R-squared:  0.5062,    Adjusted R-squared:  0.5055 
F-statistic: 769.2 on 2 and 1501 DF,  p-value: < 2.2e-16
# Obter os coeficientes do modelo
tidy_model <- tidy(model)

ggplot(data2, aes(x = ANTIPETISMO, y = BOLSONARISMO)) +
  geom_point(aes(color = factor(treatment)), alpha = 0.5) +
  geom_vline(xintercept = 0.75, linetype = "dashed", color = "black") +
  geom_smooth(data = subset(data2, ANTIPETISMO <= 0.75), method = "lm", se = FALSE, color = "blue") +
  geom_smooth(data = subset(data2, ANTIPETISMO > 0.75), method = "lm", se = FALSE, color = "red") +
  labs(title = "Fuzzy RDD: Relação entre Antipetismo e Bolsonarismo",
       x = "Antipetismo", y = "Bolsonarismo", color = "Treatment") +
  theme_minimal()
`geom_smooth()` using formula = 'y ~ x'
`geom_smooth()` using formula = 'y ~ x'

# Print dos resultados do modelo
print(tidy_model)
# A tibble: 3 × 5
  term        estimate std.error statistic  p.value
  <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1 (Intercept)    0.138    0.0108     12.8  1.93e-35
2 ANTIPETISMO    0.759    0.0654     11.6  7.14e-30
3 treatment     -0.110    0.0612     -1.80 7.24e- 2

Para análise das curvas ROC e variáveis relacionadas ao conservadorismo. Segue abaixo todo o tratamento de dados.

library(haven)
library(dplyr)

data002 <- read_sav("https://github.com/Renatobarreiraunirio/ADAE/raw/main/04810.sav") #não sei pq eu botei esse nome estranho mas agora é tarde demais pra mudar.

data002 <- data002 %>%
  select(Q19, Q17_2, Q16_5, Q17_5, Q30a, Q30b, Q30c, Q31_1, Q31_2, Q31_3, Q31_4, Q31_5, Q31_6, Q31_7, Q31_8, Q31_9, Q31_10, Q31_11, Q31_14)

data002 <- data002 %>%
  rename(
    GOSTA_PT =  Q16_5,
    GOSTA_BOLSONARO = Q17_2,
    GOSTA_LULA = Q17_5,
    IDEOLOGIA = Q19,
    INTERV_MIL_CRIME = Q30a,
    INTERV_MIL_CORRUPCAO = Q30b,
    INTERV_MIL_INST_POL = Q30c,
    REDUCAO_MAIORIDADE = Q31_1,
    CASAMENTO_GAY = Q31_2,
    ADOCAO_PORGAY = Q31_3,
    PENA_MORTE = Q31_4,
    DESCRIMINALIZACAO_DROGAS = Q31_5,
    PROIBICAO_VENDA_ARMAS = Q31_6,
    LEGALIZACAO_ABORTO = Q31_7,
    PRISAO_ABORTO = Q31_8,
    ADOCAO_COTAS_RACIAIS = Q31_9,
    ENSINAR_REZARDEUS_ESCOLA = Q31_10,
    PRIVATIZACAO = Q31_11,
    MILITARIZACAO_ESCOLAS_PUBLICAS = Q31_14
  )

#tirando os "não sei" "não respondeu" etc."
data002 <- data002[data002$INTERV_MIL_CRIME <= 10, ]
data002 <- data002[data002$INTERV_MIL_CORRUPCAO <= 10, ]
data002 <- data002[data002$INTERV_MIL_INST_POL <= 10, ]
data002 <- data002[data002$IDEOLOGIA <= 10, ]
data002 <- data002[data002$GOSTA_BOLSONARO <= 10, ]
data002 <- data002[data002$GOSTA_LULA <= 10, ]
data002 <- data002[data002$GOSTA_PT <= 10, ]
data002 <- data002 %>%
  filter(
    REDUCAO_MAIORIDADE <= 2,
    CASAMENTO_GAY <= 2,
    ADOCAO_PORGAY <= 2,
    PENA_MORTE <= 2,
    DESCRIMINALIZACAO_DROGAS <= 2,
    PROIBICAO_VENDA_ARMAS <= 2,
    PRISAO_ABORTO <= 2,
    ADOCAO_COTAS_RACIAIS <= 2,
    ENSINAR_REZARDEUS_ESCOLA <= 2,
    PRIVATIZACAO <= 2,
    MILITARIZACAO_ESCOLAS_PUBLICAS <= 2
  )

# Reatribuir valores conforme especificado
data002 <- data002 %>%
  mutate(
    REDUCAO_MAIORIDADE = ifelse(REDUCAO_MAIORIDADE == 2, 0, REDUCAO_MAIORIDADE),
    CASAMENTO_GAY = ifelse(CASAMENTO_GAY == 1, 0, ifelse(CASAMENTO_GAY == 2, 1, CASAMENTO_GAY)),
    ADOCAO_PORGAY = ifelse(ADOCAO_PORGAY == 1, 0, ifelse(ADOCAO_PORGAY == 2, 1, ADOCAO_PORGAY)),
    PENA_MORTE = ifelse(PENA_MORTE == 2, 0, PENA_MORTE),
    DESCRIMINALIZACAO_DROGAS = ifelse(DESCRIMINALIZACAO_DROGAS == 1, 0, ifelse(DESCRIMINALIZACAO_DROGAS == 2, 1, DESCRIMINALIZACAO_DROGAS)),
    PROIBICAO_VENDA_ARMAS = ifelse(PROIBICAO_VENDA_ARMAS == 1, 0, ifelse(PROIBICAO_VENDA_ARMAS == 2, 1, PROIBICAO_VENDA_ARMAS)),
    PRISAO_ABORTO = ifelse(PRISAO_ABORTO == 2, 0, PRISAO_ABORTO),
    ADOCAO_COTAS_RACIAIS = ifelse(ADOCAO_COTAS_RACIAIS == 1, 0, ifelse(ADOCAO_COTAS_RACIAIS == 2, 1, ADOCAO_COTAS_RACIAIS)),
    ENSINAR_REZARDEUS_ESCOLA = ifelse(ENSINAR_REZARDEUS_ESCOLA == 2, 0, ENSINAR_REZARDEUS_ESCOLA),
    PRIVATIZACAO = ifelse(PRIVATIZACAO == 2, 0, PRIVATIZACAO),
    LEGALIZACAO_ABORTO = ifelse(LEGALIZACAO_ABORTO == 2, 0, LEGALIZACAO_ABORTO),
    MILITARIZACAO_ESCOLAS_PUBLICAS = ifelse(MILITARIZACAO_ESCOLAS_PUBLICAS == 2, 0, MILITARIZACAO_ESCOLAS_PUBLICAS),
    INTERV_MIL_CRIME = ifelse(INTERV_MIL_CRIME == 2, 0, INTERV_MIL_CRIME),
    INTERV_MIL_CORRUPCAO = ifelse(INTERV_MIL_CORRUPCAO == 2, 0, INTERV_MIL_CORRUPCAO),
    INTERV_MIL_INST_POL = ifelse(INTERV_MIL_INST_POL == 2, 0, INTERV_MIL_INST_POL)
  )

data002 <- na.omit(data002)

Tive que fazer toda a clusterização do início porque como temos mais variáveis temos mais pessoas que não responderam.

library(e1071)
library(ggplot2)

data_subset002 <- data002 %>% select(GOSTA_BOLSONARO, IDEOLOGIA)

data_scaled002 <- scale(data_subset002) #nese caso, não acho que seja realmente necessário.

num_clusters <- 3 

# serve para dar sempre a mesma ordem de clusters
set.seed(123) 

# FUZZY C-MEANS
fcm_result002 <- cmeans(data_scaled002, centers = num_clusters, iter.max = 100, m = 2)


#print(fcm_result) só pra ver se deu certo.

# adicionar os graus de pertencimento ao data frame
data002$cluster <- fcm_result002$cluster
for (i in 1:num_clusters) {
  data002[[paste0("membership_cluster", i)]] <- fcm_result002$membership[, i]
}

# Visualizar os clusters
ggplot(data002, aes(x = GOSTA_BOLSONARO, y = IDEOLOGIA, color = as.factor(cluster), , size = membership_cluster2)) +
  geom_point() +
  theme_minimal() +
  labs(color = "Cluster")

# Selecionar apenas as variáveis de interesse
data_subset_ptismo002 <- data002 %>% select(GOSTA_LULA, GOSTA_PT)

#não sei se precisa, mas pq não né
data_scaled_ptismo002 <- scale(data_subset_ptismo002)


num_clusters_ptismo <- 3

set.seed(123)

# Executar o algoritmo fuzzy c-means
fcm_result_ptismo002 <- cmeans(data_scaled_ptismo002, centers = num_clusters_ptismo, iter.max = 100, m = 2)


#print(fcm_result_new) #só pra ver se funcionou mesmo não precisa.

# Adicionar o grau de pertencimento do novo clustering

data002$cluster_new <- fcm_result_ptismo002$cluster
for (i in 1:num_clusters_ptismo) {
  data002[[paste0("membership_cluster_new", i)]] <- fcm_result_ptismo002$membership[, i]
}

# Visualizar os clusters
ggplot(data002, aes(x = GOSTA_LULA, y = GOSTA_PT, color = as.factor(cluster_new), size = membership_cluster_new1)) +
  geom_point() +
  theme_minimal() +
  labs(color = "Cluster")

data002 <- data002 %>%
  rename(
    BOLSONARISMO = membership_cluster2,
    ANTIPETISMO = membership_cluster_new1
  )

#write.csv(data002, "CONSERVADORISMO.csv") só pra ter caso precise

Regressões logísticas para curva roc

X1 = data002[, c("BOLSONARISMO", "ANTIPETISMO")]
targets = data002[, c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO","INTERV_MIL_INST_POL")]
#install.packages("caTools")
library(caTools)

set.seed(42)
split <- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
X1_train <- subset(X1, split == TRUE)
X1_test <- subset(X1, split == FALSE)
targets_train <- subset(targets, split == TRUE)
targets_test <- subset(targets, split == FALSE)
models <- list()
coefficients_list <- list()
intercepts <- list()

for (target in colnames(targets_train)) {
  # Criar o modelo de regressão logística
  formula <- as.formula(paste(target, "~ BOLSONARISMO + ANTIPETISMO"))
  model <- glm(formula, data = cbind(X1_train, targets_train), family = binomial)
  
  # Armazenar o modelo, coeficientes e intercepto
  models[[target]] <- model
  coefficients <- coef(model)
  intercepts[[target]] <- coefficients[1]
  coefficients_list[[target]] <- coefficients[-1]
  
  # Exibir os coeficientes e o intercepto
  print(paste("Modelo para:", target))
  print("Coeficientes:")
  print(coefficients_list[[target]])
  print("Intercepto:")
  print(intercepts[[target]])
}
[1] "Modelo para: INTERV_MIL_CRIME"
[1] "Coeficientes:"
BOLSONARISMO  ANTIPETISMO 
   0.9945398    0.8134277 
[1] "Intercepto:"
(Intercept) 
  -1.028547 
[1] "Modelo para: INTERV_MIL_CORRUPCAO"
[1] "Coeficientes:"
BOLSONARISMO  ANTIPETISMO 
   1.7983034    0.8502054 
[1] "Intercepto:"
(Intercept) 
 -0.6245557 
[1] "Modelo para: INTERV_MIL_INST_POL"
[1] "Coeficientes:"
BOLSONARISMO  ANTIPETISMO 
   1.7380796    0.3536211 
[1] "Intercepto:"
(Intercept) 
  -1.014606 

Modelo Combinado

# Definir a semente para reprodutibilidade
set.seed(42)

# Dividir os dados
split <- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
X1_train <- subset(data002, split == TRUE)
X1_test <- subset(data002, split == FALSE)

# Selecionar as características e as variáveis-alvo
X1_train_vars <- X1_train[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_test_vars <- X1_test[, c("BOLSONARISMO", "ANTIPETISMO")]

# Lista de variáveis-alvo (binárias) para ajuste
targets <- c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO", "INTERV_MIL_INST_POL")
targets_train <- X1_train[, targets]
targets_test <- X1_test[, targets]

# Verificar se as variáveis-alvo são binárias
for (target in targets) {
  if (!all(X1_train[[target]] %in% c(0, 1))) {
    stop(paste("A variável-alvo", target, "contém valores fora do intervalo 0-1."))
  }
}

models <- list()
coefficients_list <- list()
intercepts <- list()

for (target in targets) {
  # Criar o modelo de regressão logística com interação
  formula <- as.formula(paste(target, "~ BOLSONARISMO * ANTIPETISMO"))
  model <- glm(formula, data = X1_train, family = binomial)
  
  # Armazenar o modelo, coeficientes e intercepto
  models[[target]] <- model
  coefficients <- coef(model)
  intercepts[[target]] <- coefficients[1]
  coefficients_list[[target]] <- coefficients[-1]
  
  # Exibir os coeficientes e o intercepto
  print(paste("Modelo para:", target))
  print("Coeficientes:")
  print(coefficients_list[[target]])
  print("Intercepto:")
  print(intercepts[[target]])
}
[1] "Modelo para: INTERV_MIL_CRIME"
[1] "Coeficientes:"
            BOLSONARISMO              ANTIPETISMO BOLSONARISMO:ANTIPETISMO 
               0.6706568                0.3791844                0.7961020 
[1] "Intercepto:"
(Intercept) 
 -0.9520012 
[1] "Modelo para: INTERV_MIL_CORRUPCAO"
[1] "Coeficientes:"
            BOLSONARISMO              ANTIPETISMO BOLSONARISMO:ANTIPETISMO 
               1.6041268                0.6106723                0.4997436 
[1] "Intercepto:"
(Intercept) 
 -0.5861708 
[1] "Modelo para: INTERV_MIL_INST_POL"
[1] "Coeficientes:"
            BOLSONARISMO              ANTIPETISMO BOLSONARISMO:ANTIPETISMO 
               1.6788182                0.2756693                0.1453656 
[1] "Intercepto:"
(Intercept) 
     -1.001 

Com as razões de chance

# Definir a semente para reprodutibilidade
set.seed(42)

# Supondo que data002 já esteja carregado e tenha as variáveis necessárias
split <- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
X1_train <- subset(data002, split == TRUE)
X1_test <- subset(data002, split == FALSE)

# Selecionar as características e as variáveis-alvo
X1_train_vars <- X1_train[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_test_vars <- X1_test[, c("BOLSONARISMO", "ANTIPETISMO")]

# Lista de variáveis-alvo (binárias) para ajuste
targets <- c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO", "INTERV_MIL_INST_POL")
targets_train <- X1_train[, targets]
targets_test <- X1_test[, targets]

# Ajustar os modelos e calcular Odds Ratios
models <- list()
odds_ratios_list <- list()

for (target in targets) {
  # Criar o modelo de regressão logística com interação
  formula <- as.formula(paste(target, "~ BOLSONARISMO * ANTIPETISMO"))
  model <- glm(formula, data = X1_train, family = binomial)
  
  # Armazenar o modelo
  models[[target]] <- model
  
  # Calcular os Odds Ratios
  coefficients <- coef(model)
  odds_ratios <- exp(coefficients)
  
  # Armazenar os Odds Ratios
  odds_ratios_list[[target]] <- odds_ratios
  
  # Exibir os Odds Ratios
  print(paste("Odds Ratios para o modelo:", target))
  print(odds_ratios)
}
[1] "Odds Ratios para o modelo: INTERV_MIL_CRIME"
             (Intercept)             BOLSONARISMO              ANTIPETISMO 
               0.3859679                1.9555212                1.4610924 
BOLSONARISMO:ANTIPETISMO 
               2.2168826 
[1] "Odds Ratios para o modelo: INTERV_MIL_CORRUPCAO"
             (Intercept)             BOLSONARISMO              ANTIPETISMO 
                0.556454                 4.973515                 1.841669 
BOLSONARISMO:ANTIPETISMO 
                1.648299 
[1] "Odds Ratios para o modelo: INTERV_MIL_INST_POL"
             (Intercept)             BOLSONARISMO              ANTIPETISMO 
               0.3675116                5.3592186                1.3174122 
BOLSONARISMO:ANTIPETISMO 
               1.1564623 

Relatório de classificação

library(caTools)
library(caret)
Carregando pacotes exigidos: lattice
library(e1071)

# Definir a semente para reprodutibilidade
set.seed(42)

# Supondo que data002 já esteja carregado e tenha as variáveis necessárias
split <- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
X1_train <- subset(data002, split == TRUE)
X1_test <- subset(data002, split == FALSE)

# Selecionar as características e as variáveis-alvo
X1_train_vars <- X1_train[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_test_vars <- X1_test[, c("BOLSONARISMO", "ANTIPETISMO")]

# Lista de variáveis-alvo (binárias) para ajuste
targets <- c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO", "INTERV_MIL_INST_POL")
targets_train <- X1_train[, targets]
targets_test <- X1_test[, targets]

# Ajustar o modelo de regressão logística
model <- glm(INTERV_MIL_CRIME ~ BOLSONARISMO * ANTIPETISMO, data = X1_train, family = binomial)

# Fazer previsões no conjunto de teste
probabilities <- predict(model, newdata = X1_test, type = "response")
predictions <- ifelse(probabilities > 0.5, 1, 0)

# Gerar o relatório de classificação
actual <- X1_test$INTERV_MIL_CRIME
conf_matrix <- confusionMatrix(as.factor(predictions), as.factor(actual))

# Exibir o relatório de classificação
print(conf_matrix)
Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 79 38
         1 17 39
                                          
               Accuracy : 0.6821          
                 95% CI : (0.6071, 0.7507)
    No Information Rate : 0.5549          
    P-Value [Acc > NIR] : 0.0004277       
                                          
                  Kappa : 0.3385          
                                          
 Mcnemar's Test P-Value : 0.0070009       
                                          
            Sensitivity : 0.8229          
            Specificity : 0.5065          
         Pos Pred Value : 0.6752          
         Neg Pred Value : 0.6964          
             Prevalence : 0.5549          
         Detection Rate : 0.4566          
   Detection Prevalence : 0.6763          
      Balanced Accuracy : 0.6647          
                                          
       'Positive' Class : 0               
                                          
# Definir a semente para reprodutibilidade
set.seed(42)

# Supondo que data002 já esteja carregado e tenha as variáveis necessárias
split <- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
X1_train <- subset(data002, split == TRUE)
X1_test <- subset(data002, split == FALSE)

# Selecionar as variáveis-alvo
target <- "INTERV_MIL_CRIME"

# Lista de variáveis explicativas a serem testadas individualmente
variables <- c("BOLSONARISMO", "ANTIPETISMO")

# Função para ajustar o modelo, gerar previsões e relatório de classificação
test_model <- function(variable, X1_train, X1_test, target) {
  formula <- as.formula(paste(target, "~", variable))
  model <- glm(formula, data = X1_train, family = binomial)
  
  probabilities <- predict(model, newdata = X1_test, type = "response")
  predictions <- ifelse(probabilities > 0.5, 1, 0)
  
  actual <- X1_test[[target]]
  conf_matrix <- confusionMatrix(as.factor(predictions), as.factor(actual))
  
  print(paste("Relatório de Classificação para:", variable))
  print(conf_matrix)
}

# Testar modelos para cada variável
for (variable in variables) {
  test_model(variable, X1_train, X1_test, target)
}
[1] "Relatório de Classificação para: BOLSONARISMO"
Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 77 36
         1 19 41
                                          
               Accuracy : 0.6821          
                 95% CI : (0.6071, 0.7507)
    No Information Rate : 0.5549          
    P-Value [Acc > NIR] : 0.0004277       
                                          
                  Kappa : 0.342           
                                          
 Mcnemar's Test P-Value : 0.0309714       
                                          
            Sensitivity : 0.8021          
            Specificity : 0.5325          
         Pos Pred Value : 0.6814          
         Neg Pred Value : 0.6833          
             Prevalence : 0.5549          
         Detection Rate : 0.4451          
   Detection Prevalence : 0.6532          
      Balanced Accuracy : 0.6673          
                                          
       'Positive' Class : 0               
                                          
[1] "Relatório de Classificação para: ANTIPETISMO"
Confusion Matrix and Statistics

          Reference
Prediction  0  1
         0 68 36
         1 28 41
                                          
               Accuracy : 0.6301          
                 95% CI : (0.5535, 0.7021)
    No Information Rate : 0.5549          
    P-Value [Acc > NIR] : 0.02728         
                                          
                  Kappa : 0.2433          
                                          
 Mcnemar's Test P-Value : 0.38157         
                                          
            Sensitivity : 0.7083          
            Specificity : 0.5325          
         Pos Pred Value : 0.6538          
         Neg Pred Value : 0.5942          
             Prevalence : 0.5549          
         Detection Rate : 0.3931          
   Detection Prevalence : 0.6012          
      Balanced Accuracy : 0.6204          
                                          
       'Positive' Class : 0               
                                          

Agora finalmente a curva ROC

# deixar os pacotes aqui caso vc não tenha carregado ainda rs
library(caTools)
library(pROC)
Type 'citation("pROC")' for a citation.

Attaching package: 'pROC'
The following objects are masked from 'package:stats':

    cov, smooth, var
library(ggplot2)

library(caTools)
library(pROC)
library(ggplot2)

# Definir a semente para reprodutibilidade
set.seed(42)

# as variáveis necessárias
split <- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
X1_train <- subset(data002, split == TRUE)
X1_test <- subset(data002, split == FALSE)

# Selecionar as variáveis-alvo
target <- "INTERV_MIL_CRIME"

# Ajustar os modelos
model_interaction <- glm(INTERV_MIL_CRIME ~ BOLSONARISMO * ANTIPETISMO, data = X1_train, family = binomial)
model_bolsonarismo <- glm(INTERV_MIL_CRIME ~ BOLSONARISMO, data = X1_train, family = binomial)
model_antipetismo <- glm(INTERV_MIL_CRIME ~ ANTIPETISMO, data = X1_train, family = binomial)

# Função para calcular e plotar a curva ROC
plot_roc_curve <- function(model, X1_test, target, title) {
  probabilities <- predict(model, newdata = X1_test, type = "response")
  roc_obj <- roc(X1_test[[target]], probabilities)
  auc_value <- auc(roc_obj)
  
  ggplot(data = data.frame(fpr = roc_obj$specificities, tpr = roc_obj$sensitivities), aes(x = 1 - fpr, y = tpr)) +
    geom_line(color = 'darkorange', size = 1.5) +
    geom_abline(slope = 1, intercept = 0, linetype = 'dashed', color = 'navy') +
    labs(title = title, x = "Taxa de Falsos Positivos", y = "Taxa de Verdadeiros Positivos") +
    annotate("text", x = 0.6, y = 0.2, label = paste("AUC =", round(auc_value, 2)), color = 'darkorange', size = 5) +
    theme_minimal()
}

# Plotar curvas ROC
plot_roc_curve(model_interaction, X1_test, target, "ROC Curve - BOLSONARISMO * ANTIPETISMO")
Setting levels: control = 0, case = 1
Setting direction: controls < cases
Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
ℹ Please use `linewidth` instead.

plot_roc_curve(model_bolsonarismo, X1_test, target, "ROC Curve - BOLSONARISMO")
Setting levels: control = 0, case = 1
Setting direction: controls < cases

plot_roc_curve(model_antipetismo, X1_test, target, "ROC Curve - ANTIPETISMO")
Setting levels: control = 0, case = 1
Setting direction: controls < cases