library(sets)
sets_options("universe", seq(from = 0, to = 10, by = 0.1))
= set(
variaveis 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:
= set(
rules 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
<- fuzzy_system(variaveis, rules) system
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.
<- fuzzy_inference(system, list(ideologia = 5 , intervencionismo = 3))
fi 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
<- function(input1, input2) {
calc_output <- fuzzy_inference(system, list(ideologia = input1, intervencionismo = input2))
result return(gset_defuzzify(result, "centroid"))
}
# Gerando os dados para o gráfico 2D
<- seq(0, 10, by = 0.5)
ideologia_vals <- seq(0, 10, by = 0.5)
intervencionismo_vals <- outer(ideologia_vals, intervencionismo_vals, Vectorize(calc_output))
conservadorismo_vals
# Preparando os dados para o plotly
<- expand.grid(ideologia = ideologia_vals, intervencionismo = intervencionismo_vals)
df $conservadorismo <- as.vector(conservadorismo_vals)
df
# 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
= FALSE
echo 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.
<- read_sav("https://github.com/Renatobarreiraunirio/ADAE/raw/main/04810.sav") data1
Selecionando somente as variáveis que serão usadas, renomeando, tirando o que não queremos etc.
<- data1 %>%
data2 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$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)
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
<- data2 %>% select(GOSTA_BOLSONARO, IDEOLOGIA)
data_subset
<- scale(data_subset) #nese caso, não acho que seja realmente necessário.
data_scaled
<- 3
num_clusters
# serve para dar sempre a mesma ordem de clusters
set.seed(123)
# FUZZY C-MEANS
<- cmeans(data_scaled, centers = num_clusters, iter.max = 100, m = 2)
fcm_result
#print(fcm_result) só pra ver se deu certo.
# adicionar os graus de pertencimento ao data frame
$cluster <- fcm_result$cluster
data2for (i in 1:num_clusters) {
paste0("membership_cluster", i)]] <- fcm_result$membership[, i]
data2[[
}
# 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
<- data2 %>% select(GOSTA_LULA, GOSTA_PT)
data_subset_ptismo
#não sei se precisa, mas pq não né
<- scale(data_subset_ptismo)
data_scaled_ptismo
<- 3
num_clusters_ptismo
set.seed(123)
# Executar o algoritmo fuzzy c-means
<- cmeans(data_scaled_ptismo, centers = num_clusters_ptismo, iter.max = 100, m = 2)
fcm_result_ptismo
#print(fcm_result_new) #só pra ver se funcionou mesmo não precisa.
# Adicionar o grau de pertencimento do novo clustering
$cluster_new <- fcm_result_ptismo$cluster
data2for (i in 1:num_clusters_ptismo) {
paste0("membership_cluster_new", i)]] <- fcm_result_ptismo$membership[, i]
data2[[
}
# 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
<- lm(BOLSONARISMO ~ ANTIPETISMO + treatment, data = data2)
model 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)
<- 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 %>%
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$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 %>%
data002 filter(
<= 2,
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
)
# 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)
)
<- na.omit(data002) 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)
<- data002 %>% select(GOSTA_BOLSONARO, IDEOLOGIA)
data_subset002
<- scale(data_subset002) #nese caso, não acho que seja realmente necessário.
data_scaled002
<- 3
num_clusters
# serve para dar sempre a mesma ordem de clusters
set.seed(123)
# FUZZY C-MEANS
<- cmeans(data_scaled002, centers = num_clusters, iter.max = 100, m = 2)
fcm_result002
#print(fcm_result) só pra ver se deu certo.
# adicionar os graus de pertencimento ao data frame
$cluster <- fcm_result002$cluster
data002for (i in 1:num_clusters) {
paste0("membership_cluster", i)]] <- fcm_result002$membership[, i]
data002[[
}
# 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
<- data002 %>% select(GOSTA_LULA, GOSTA_PT)
data_subset_ptismo002
#não sei se precisa, mas pq não né
<- scale(data_subset_ptismo002)
data_scaled_ptismo002
<- 3
num_clusters_ptismo
set.seed(123)
# Executar o algoritmo fuzzy c-means
<- cmeans(data_scaled_ptismo002, centers = num_clusters_ptismo, iter.max = 100, m = 2)
fcm_result_ptismo002
#print(fcm_result_new) #só pra ver se funcionou mesmo não precisa.
# Adicionar o grau de pertencimento do novo clustering
$cluster_new <- fcm_result_ptismo002$cluster
data002for (i in 1:num_clusters_ptismo) {
paste0("membership_cluster_new", i)]] <- fcm_result_ptismo002$membership[, i]
data002[[
}
# 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
= data002[, c("BOLSONARISMO", "ANTIPETISMO")]
X1 = data002[, c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO","INTERV_MIL_INST_POL")] targets
#install.packages("caTools")
library(caTools)
set.seed(42)
<- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
split <- subset(X1, split == TRUE)
X1_train <- subset(X1, split == FALSE)
X1_test <- subset(targets, split == TRUE)
targets_train <- subset(targets, split == FALSE) targets_test
<- list()
models <- list()
coefficients_list <- list()
intercepts
for (target in colnames(targets_train)) {
# Criar o modelo de regressão logística
<- as.formula(paste(target, "~ BOLSONARISMO + ANTIPETISMO"))
formula <- glm(formula, data = cbind(X1_train, targets_train), family = binomial)
model
# Armazenar o modelo, coeficientes e intercepto
<- model
models[[target]] <- coef(model)
coefficients <- coefficients[1]
intercepts[[target]] <- coefficients[-1]
coefficients_list[[target]]
# 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
<- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
split <- subset(data002, split == TRUE)
X1_train <- subset(data002, split == FALSE)
X1_test
# Selecionar as características e as variáveis-alvo
<- X1_train[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_train_vars <- X1_test[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_test_vars
# Lista de variáveis-alvo (binárias) para ajuste
<- c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO", "INTERV_MIL_INST_POL")
targets <- X1_train[, targets]
targets_train <- X1_test[, targets]
targets_test
# 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."))
}
}
<- list()
models <- list()
coefficients_list <- list()
intercepts
for (target in targets) {
# Criar o modelo de regressão logística com interação
<- as.formula(paste(target, "~ BOLSONARISMO * ANTIPETISMO"))
formula <- glm(formula, data = X1_train, family = binomial)
model
# Armazenar o modelo, coeficientes e intercepto
<- model
models[[target]] <- coef(model)
coefficients <- coefficients[1]
intercepts[[target]] <- coefficients[-1]
coefficients_list[[target]]
# 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
<- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
split <- subset(data002, split == TRUE)
X1_train <- subset(data002, split == FALSE)
X1_test
# Selecionar as características e as variáveis-alvo
<- X1_train[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_train_vars <- X1_test[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_test_vars
# Lista de variáveis-alvo (binárias) para ajuste
<- c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO", "INTERV_MIL_INST_POL")
targets <- X1_train[, targets]
targets_train <- X1_test[, targets]
targets_test
# Ajustar os modelos e calcular Odds Ratios
<- list()
models <- list()
odds_ratios_list
for (target in targets) {
# Criar o modelo de regressão logística com interação
<- as.formula(paste(target, "~ BOLSONARISMO * ANTIPETISMO"))
formula <- glm(formula, data = X1_train, family = binomial)
model
# Armazenar o modelo
<- model
models[[target]]
# Calcular os Odds Ratios
<- coef(model)
coefficients <- exp(coefficients)
odds_ratios
# Armazenar os Odds Ratios
<- odds_ratios
odds_ratios_list[[target]]
# 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
<- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
split <- subset(data002, split == TRUE)
X1_train <- subset(data002, split == FALSE)
X1_test
# Selecionar as características e as variáveis-alvo
<- X1_train[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_train_vars <- X1_test[, c("BOLSONARISMO", "ANTIPETISMO")]
X1_test_vars
# Lista de variáveis-alvo (binárias) para ajuste
<- c("INTERV_MIL_CRIME", "INTERV_MIL_CORRUPCAO", "INTERV_MIL_INST_POL")
targets <- X1_train[, targets]
targets_train <- X1_test[, targets]
targets_test
# Ajustar o modelo de regressão logística
<- glm(INTERV_MIL_CRIME ~ BOLSONARISMO * ANTIPETISMO, data = X1_train, family = binomial)
model
# Fazer previsões no conjunto de teste
<- predict(model, newdata = X1_test, type = "response")
probabilities <- ifelse(probabilities > 0.5, 1, 0)
predictions
# Gerar o relatório de classificação
<- X1_test$INTERV_MIL_CRIME
actual <- confusionMatrix(as.factor(predictions), as.factor(actual))
conf_matrix
# 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
<- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
split <- subset(data002, split == TRUE)
X1_train <- subset(data002, split == FALSE)
X1_test
# Selecionar as variáveis-alvo
<- "INTERV_MIL_CRIME"
target
# Lista de variáveis explicativas a serem testadas individualmente
<- c("BOLSONARISMO", "ANTIPETISMO")
variables
# Função para ajustar o modelo, gerar previsões e relatório de classificação
<- function(variable, X1_train, X1_test, target) {
test_model <- as.formula(paste(target, "~", variable))
formula <- glm(formula, data = X1_train, family = binomial)
model
<- predict(model, newdata = X1_test, type = "response")
probabilities <- ifelse(probabilities > 0.5, 1, 0)
predictions
<- X1_test[[target]]
actual <- confusionMatrix(as.factor(predictions), as.factor(actual))
conf_matrix
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
<- sample.split(data002$INTERV_MIL_INST_POL, SplitRatio = 0.8)
split <- subset(data002, split == TRUE)
X1_train <- subset(data002, split == FALSE)
X1_test
# Selecionar as variáveis-alvo
<- "INTERV_MIL_CRIME"
target
# Ajustar os modelos
<- glm(INTERV_MIL_CRIME ~ BOLSONARISMO * ANTIPETISMO, data = X1_train, family = binomial)
model_interaction <- glm(INTERV_MIL_CRIME ~ BOLSONARISMO, data = X1_train, family = binomial)
model_bolsonarismo <- glm(INTERV_MIL_CRIME ~ ANTIPETISMO, data = X1_train, family = binomial)
model_antipetismo
# Função para calcular e plotar a curva ROC
<- function(model, X1_test, target, title) {
plot_roc_curve <- predict(model, newdata = X1_test, type = "response")
probabilities <- roc(X1_test[[target]], probabilities)
roc_obj <- auc(roc_obj)
auc_value
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