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)))
)CÓDIGOS DISSERTAÇÃO VERSÃO QUALIFICAÇÃO
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.
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 rsImportando 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 preciseRegressõ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