Introdução
Aqui, vamos aprender o que é e como ajustar um Modelo Linear Generalizado (GLM) no R. Um GLM é uma extensão do modelo linear clássico, permitindo ajustar modelos a dados com distribuições diferentes da distribuição normal. Um exemplo disso poderia ser uma variável binária, como presença e ausência que é muito utilizada na ecologia. Para isso, vamos utilizar um conjunto de dados simulados da seleção de habitats de aranhas.
Conjunto de dados
Vamos começar carregando e explorando o conjunto de dados. Suponha que estamos interessados em prever a probabilidade de um evento ocorrer (variável binária) com base em uma variável preditora contínua.
# Pacotes nescessários####
#install.packages("ggplot2")
#install.packages("dplyr")
#install.packages("MASS")
require(ggplot2)#Pacote para gerar plots melhores
require(ggpubr)#Para paineis gráficos
require(ggthemes)#temas do ggplot
require(dplyr)#Para manipulação de dados
require(MASS)#Para GLM
# Gerando um conjunto de dados
set.seed(7) # Para padronizar o clock do processador
dados = data.frame(
densidade_bromelias = rnorm(100, mean = 10, sd = 3),
numero_folhas = rpois(100, lambda = 15),
altura_planta = rnorm(100, mean = 100, sd = 20),
altura_chao = rnorm(100, mean = 30, sd = 5),
raio_planta = rnorm(100, mean = 50, sd = 10),
dossel = rnorm(100, mean = 80, sd = 15),
presenca_aranha = rbinom(100, size = 1, prob = 0.4)
)
# Visualizando os primeiros registros
head(dados)
## densidade_bromelias numero_folhas altura_planta altura_chao raio_planta
## 1 16.861741 17 109.45093 30.43845 65.66575
## 2 6.409685 17 88.82444 33.83762 41.55155
## 3 7.917122 14 124.84129 26.93421 60.97649
## 4 8.763121 10 99.69483 30.76251 53.00880
## 5 7.087980 14 84.16423 27.04146 42.23034
## 6 7.158160 13 91.96763 25.19648 49.61566
## dossel presenca_aranha
## 1 69.64818 0
## 2 52.41526 0
## 3 84.24557 0
## 4 46.21115 1
## 5 91.01525 1
## 6 82.18709 0
Avaliando distribuição das variáveis
Agora vamos explorar a relação entre cada variável preditora e a ocorrência de aranhas (variável resposta). Vamos plotar um gráfico de dispersão para cada par de variáveis.
# Gráficos de dispersão
ggplot(dados, aes(x = densidade_bromelias, y = presenca_aranha)) +
geom_point(color="#006699") +
labs(title = "Densidade de Bromélias e Presença de Aranhas", x = "Densidade de Bromélias", y = "Presença de Aranhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = numero_folhas, y = presenca_aranha)) +
geom_point(color="#006699") +
labs(title = "Número de Folhas e Presença de Aranhas", x = "Número de Folhas", y = "Presença de Aranhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = altura_planta, y = presenca_aranha)) +
geom_point(color="#006699") +
labs(title = "Altura da Planta e Presença de Aranhas", x = "Altura da Planta", y = "Presença de Aranhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = altura_chao, y = presenca_aranha)) +
geom_point(color="#006699") +
labs(title = "Altura do Chão e Presença de Aranhas", x = "Altura do Chão", y = "Presença de Aranhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = raio_planta, y = presenca_aranha)) +
geom_point(color="#006699") +
labs(title = "Raio da Planta e Presença de Aranhas", x = "Raio da Planta", y = "Presença de Aranhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = dossel, y = presenca_aranha)) +
geom_point(color="#006699") +
labs(title = "Dossel e Presença de Aranhas", x = "Dossel", y = "Presença de Aranhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
Outra forma de visualizar é usando boxplots
ggplot(dados, aes(x = factor(presenca_aranha), y = densidade_bromelias)) +
geom_boxplot(fill = c("#006666", "#006699")) +
labs(title = "Variação da Densidade de Bromélias entre Presença e Ausência de Aranhas",
x = "Presença de Aranhas", y = "Densidade de Bromélias") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = factor(presenca_aranha), y = numero_folhas)) +
geom_boxplot(fill = c("#006666", "#006699")) +
labs(title = "Variação do Número de Folhas entre Presença e Ausência de Aranhas",
x = "Presença de Aranhas", y = "Número de Folhas") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = factor(presenca_aranha), y = altura_planta)) +
geom_boxplot(fill = c("#006666", "#006699")) +
labs(title = "Variação da Altura da Planta entre Presença e Ausência de Aranhas",
x = "Presença de Aranhas", y = "Altura da Planta") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = factor(presenca_aranha), y = altura_chao)) +
geom_boxplot(fill = c("#006666", "#006699")) +
labs(title = "Variação da Altura do Chão entre Presença e Ausência de Aranhas",
x = "Presença de Aranhas", y = "Altura do Chão") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = factor(presenca_aranha), y = raio_planta)) +
geom_boxplot(fill = c("#006666", "#006699")) +
labs(title = "Variação do Raio da Planta entre Presença e Ausência de Aranhas",
x = "Presença de Aranhas", y = "Raio da Planta") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = factor(presenca_aranha), y = dossel)) +
geom_boxplot(fill = c("#006666", "#006699")) +
labs(title = "Variação do Dossel entre Presença e Ausência de Aranhas",
x = "Presença de Aranhas", y = "Dossel") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
Ajustando o modelo GLM
Agora vamos ajustar um modelo linear generalizado para prever a presença de aranhas com base nas variáveis preditoras. Neste exemplo, usaremos a distribuição binomial e a função de ligação logit. A função logit no GLM é uma transformação matemática que mapeia a probabilidade de sucesso em um preditor linear. Em outras palavras, é uma forma de “forçar” que a variavél resposta seja ajustada em relação a um preditor linear. Essa função de ligação é essencial para o ajuste adequado do modelo e para a interpretação dos resultados no contexto de um modelo de regressão logística binária.
# Ajustando o modelo GLM
modelo_glm = glm(presenca_aranha ~ densidade_bromelias + numero_folhas + altura_planta + altura_chao + raio_planta + dossel,
data = dados, family = binomial(link = "logit"))
# Visualizando os resultados do modelo
summary(modelo_glm)
##
## Call:
## glm(formula = presenca_aranha ~ densidade_bromelias + numero_folhas +
## altura_planta + altura_chao + raio_planta + dossel, family = binomial(link = "logit"),
## data = dados)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.4265 -0.8617 -0.6202 1.1362 1.7244
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.80960 2.74227 -0.660 0.509
## densidade_bromelias -0.08216 0.08198 -1.002 0.316
## numero_folhas 0.09309 0.06188 1.504 0.133
## altura_planta 0.01312 0.01061 1.236 0.216
## altura_chao 0.06968 0.04741 1.470 0.142
## raio_planta -0.03412 0.02306 -1.480 0.139
## dossel -0.01494 0.01670 -0.895 0.371
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 126.84 on 99 degrees of freedom
## Residual deviance: 116.41 on 93 degrees of freedom
## AIC: 130.41
##
## Number of Fisher Scoring iterations: 4
Interpretando os resultados
O modelo GLM fornece números importantes para entender como as características das plantas (densidade de bromélias, número de folhas, altura, raio e dossel) afetam a presença de aranhas. Esses números mostram se as características aumentam ou diminuem a probabilidade de encontrar aranhas. Para facilitar a compreensão, usamos uma fórmula matemática chamada “função logística” para transformar esses números em chances reais de encontrar aranhas com base nas características das plantas. Isso nos ajuda a entender onde podemos encontrar aranhas com base na caracteristica da bromelia e densidade de plantas.
# Obtendo as probabilidades preditas
dados$prob_predita = predict(modelo_glm, type = "response")
# Visualizando as probabilidades preditas
ggplot(dados, aes(x = densidade_bromelias, y = prob_predita)) +
geom_point(color="#006699") +
labs(title = "Probabilidade Preditiva da Presença de Aranhas", x = "Densidade de Bromélias", y = "Probabilidade") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = numero_folhas, y = prob_predita)) +
geom_point(color="#006699") +
labs(title = "Probabilidade Preditiva da Presença de Aranhas", x = "Número de Folhas", y = "Probabilidade") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = altura_planta, y = prob_predita)) +
geom_point(color="#006699") +
labs(title = "Probabilidade Preditiva da Presença de Aranhas", x = "Altura da Planta", y = "Probabilidade") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = altura_chao, y = prob_predita)) +
geom_point(color="#006699") +
labs(title = "Probabilidade Preditiva da Presença de Aranhas", x = "Altura do Chão", y = "Probabilidade") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = raio_planta, y = prob_predita)) +
geom_point(color="#006699") +
labs(title = "Probabilidade Preditiva da Presença de Aranhas", x = "Raio da Planta", y = "Probabilidade") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
ggplot(dados, aes(x = dossel, y = prob_predita)) +
geom_point(color="#006699") +
labs(title = "Probabilidade Preditiva da Presença de Aranhas", x = "Dossel", y = "Probabilidade") + theme_classic() + theme(plot.title = element_text(hjust = 0.5))
Para facilitar a comparação entre as variáveis podemos usar o painéis:
#Primeiro vamos criar um objeto para cada um dos plots anteriores
plot1 = ggplot(dados, aes(x = densidade_bromelias, y = prob_predita)) +
geom_point(color="#006699") +
labs( x = "Densidade de Bromélias", y = "Probabilidade") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
plot2 = ggplot(dados, aes(x = numero_folhas, y = prob_predita)) +
geom_point(color="#006699") +
labs( x = "Número de Folhas", y = "Probabilidade") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
plot3 = ggplot(dados, aes(x = altura_planta, y = prob_predita)) +
geom_point(color="#006699") +
labs( x = "Altura da Planta", y = "Probabilidade") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
plot4 = ggplot(dados, aes(x = altura_chao, y = prob_predita)) +
geom_point(color="#006699") +
labs( x = "Altura do Chão", y = "Probabilidade") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
plot5 = ggplot(dados, aes(x = raio_planta, y = prob_predita)) +
geom_point(color="#006699") +
labs( x = "Raio da Planta", y = "Probabilidade") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
plot6 = ggplot(dados, aes(x = dossel, y = prob_predita)) +
geom_point(color="#006699") + geom_smooth(color="#006666", method = "glm", method.args = list(family = binomial(link = "logit"))) +
labs( x = "Dossel", y = "Probabilidade") +
theme_minimal() +
theme(plot.title = element_text(hjust = 0.5))
#Agora vamos usar o ggarrange() para dispor os gráficos em uma matriz de 2x3 com um tema chique
ggarrange(plot1, plot2, plot3, plot4, plot5, plot6, ncol = 3, nrow = 2) + theme_minimal()
Conclusão
Este é apenas um exemplo didático para introduzir o conceito de GLM. Em casos reais, é necessário considerar a adequação do modelo, diagnósticos e outras análises adicionais, mas já é útil para você começar a aprender sobre Modelos Lineares Generalizados!