---
title: "Aula TP 9 -- Resolução FT 7"
author: "João Malato e Tiago A. Marques"
date: "Novembro de 2019"
output:
prettydoc::html_pretty:
theme: cayman
highlight: github
toc: true
toc_depth: 1
---
# Disclaimer
Este documento fornece algumas propostas de resolução aos exercícios da folha de trabalho `TP7.pdf`, resolvida durante a aula prática número 9. Como sempre, é necessário notar que pode haver (quase) infinitas maneiras de solucionar cada um dos exercícios. Se esta resolução não for *exactamente igual* à que foi apresentada na aula, ou à que cada um de vós conseguiu criar, não tem mal. O importante aqui é que sejam capazes de compreender o que fizeram e entender o que é apresentado neste documento para que possam mais à frente reproduzi-lo de forma independente.
Neste documento assumimos que os ficheiros de dados se encontram na mesma directoria do .Rmd. Caso não seja o caso, será necessário primeiro identificar essa directoria.
Os gráficos aqui apresentados são previamente trabalhados para a melhor compreensão dos resultados. Não é obrigatório representarem sempre gráficos assim, embora seja aconselhado.
Além do HTML em si, iremos disponibilizar o .Rmd para que possam também ver como se faz este relatório e quem sabe colher alguma inspiração para implementar nas aulas.
Nota: caso queiram usar este template precisam instalar o package `prettydoc` para isso acontecer, Podem dar uma vista de olhos aos diversos temas e como instalar [aqui](https://prettydoc.statr.me/index.html).
Feito este preliminar, passemos à resolução.
***
# Exercício 1.
**Estimou a mortalidade de aves em alguns parques eólicos, em função de variáveis ambientais (`DataTP7parqueseolicos.csv`). Verifique se a variável `altitude` é um bom preditor da mortalidade, através de um modelo de regressão simples. Caracterize a relação entre as variáveis. Elabore uma função que gere estimativas de mortalidade em função da altitude. Avalie o desempenho do modelo de regressão.**
Como sempre, lemos os dados e fazemos uma rápida análise antes de partirmos para a resolução do exercício.
```{r}
dpeol <- read.csv2("DataTP7parqueseolicos.csv")
```
```{r}
str(dpeol)
summary(dpeol)
```
Todas as colunas apresentam valores numéricos.
Podemos agora ver como se comporta a variável `mortalidade` em função da altitude.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
plot(dpeol$altitude, dpeol$mortalidade, xlab="Altitude (m)", ylab="Mortalidade", ylim=c(0,140), xlim=c(0,2000), pch=20, col="cornflowerblue", las=1, cex=2)
box(lwd=2)
```
Parece haver uma dependência das mortalidade em função da altitude. À medida que a altitude aumenta, também a mortalidade aumenta. Podemos implementar um modelo linear simples para tentar compreender melhor esta relação.
```{r}
mod.alt <- lm(mortalidade ~ altitude, data = dpeol)
```
Podemos ver o nosso modelo graficamente adicionando uma linha (função `abline()`) ao gráfico anterior.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
plot(dpeol$altitude, dpeol$mortalidade, xlab="Altitude (m)", ylab="Mortalidade", ylim=c(0,140), xlim=c(0,2000), pch=20, col="cornflowerblue", las=1, cex=2)
abline(mod.alt, lwd = 2, lty = 2, col = "gray35")
box(lwd=2)
```
Este resultado vem corroborar a clara evidência de que à medida que a altitude aumenta, a mortalidade também aumenta.
Podemos então ver o output do modelo (função `summary()`).
```{r}
summary(mod.alt)
```
> **Pro tip:** Quando se olha para o "sumário" de um modelo há várias coisas que podemos ter em atenção. Enumerando algumas: 1) os valores dos coeficientes do modelo (`Estimate`), 2) o erro associado (`Std. Error`) e 3) o p-value para o teste-t do coeficiente (`Pr(>|t|)`), que nos diz indica se a variável é considerada significante no modelo (p-value < $\alpha$). Podemos também ver 4) o coeficiente de determinação (`Multiple R-squared`) que nos indica o quão próximos os dados estão da linha ajustada do modelo, ou seja explica a variabilidade do modelo (podendo ser interpretado em percentagem) e 5) o p-value associado ao teste-F (`p-value`) para a significância global do modelo. Dá para estar atendo e ver mais resultados, mas se conseguirem idenificar esses já é bom para conseguirem interpretar qualquer modelo linear.
Tendo o modelo ajustado, vamos agora olhar para os residuos do modelo.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
res.alt <- residuals(mod.alt)
plot(res.alt, pch=20, col="coral3", las=1, cex=2, ylab = "Resíduos")
abline(h = 0, lty = 2, col="gray35")
box(lwd=2)
```
Seriam Gaussianos?
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
hist(res.alt, main="Resíduos do modelo Mortalidade~Altitude", xlab="Resíduos", col="coral3", las=1)
box(lwd=2)
```
Sabendo o valor do `Intercept` (`r coef(mod.alt)[[1]]`) e da variável `altitude` (`r coef(mod.alt)[2]`) no modelo,
$$Y\ \tilde\ \beta_0 + \beta_1 X_1\\ $$ ou $$\\ \text{Mortalidade}\ \tilde\ -15.9787257 + 0.0504822\cdot\text{Altitude}$$
podemos prever a mortalidade. A maneira mais clara de perceber o que se passa é criar uma função personalizada.
```{r}
getMort <- function(altitude) {
# tal como vimos na fórmula
mortalidade <- -15.9787257 + 0.0504822 * altitude
return(mortalidade)
}
```
Tendo esta função, podemos prever a mortalidade para a altitude de, por exemplo, 1500 metros.
```{r}
getMort(1500)
```
Fazendo esta previsão visualmente.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
# gráfico mortalidade~altitude
plot(dpeol$altitude, dpeol$mortalidade, xlab = "Altitude (m)", ylab = "Mortalidade", ylim = c(0, 140), xlim = c(0, 2000), pch = 20, col = "cornflowerblue", las = 1, cex = 2)
# linha do modelo
abline(mod.alt, lwd = 2, lty = 2, col = "gray35")
# linha dos 1500 metros
abline(v = 1500, lty = 3, col = "gray50")
# mortalidade a 1500 metros
abline(h = getMort(1500), lty = 3, col = "gray50")
# cruzamento das linhas
points(x = 1500, y = getMort(1500), pch = 4, col = "firebrick", cex = 2, lwd = 3)
box(lwd=2)
```
Se quisermos ver qual a predição para cada um dos pontos observados, que corresponde à projecção desses valores na linha preditiva do modelo podemos fazê-lo aravés da função `predict()`. Esta função não faz mais do que calcular (através de uma função semelhante à que foi criada, `getMort()`) o valor da mortalidade associada aos diferentes pontos de altitude observados.
```{r}
# valores observados e previstos de mortalidade para cada registo de altitude
cbind(altitude = dpeol$altitude,
mort.obs = dpeol$mortalidade,
mort.prev = predict(mod.alt))
# podemos ver o nossa função lado-a-lado com a função predict()
cbind(altitude = dpeol$altitude,
mort.getMort = getMort(dpeol$altitude),
mort.prev = predict(mod.alt))
```
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
# gráfico mortalidade~altitude
plot(dpeol$altitude, dpeol$mortalidade, xlab="Altitude (m)", ylab="Mortalidade", ylim=c(0,140), xlim=c(0,2000), pch=20, col="cornflowerblue", las=1, cex=2)
# linha do modelo
abline(mod.alt, lwd = 2, lty = 2, col = "gray35")
# predição dos pontos na linha
points(dpeol$altitude, predict(mod.alt), pch = 4, cex = 2, col = 2, lwd = 3)
# podemos adicionar um segmento de recta que mostre o ajuste dos pontos observados à recta do modelo
segments(x0=dpeol$altitude, y0=dpeol$mortalidade, x1=dpeol$altitude, y1=predict(mod.alt), lty=3, col="gray50")
box(lwd=2)
```
Se quisermos prever a mortalidade para outros valores da altitude podemos usar a função `predict()` ou a `predict.lm()`, indicando o modelo e o valor da variável explicativa que pretendemos estudar.
```{r}
# usando a função
predict.lm(mod.alt, newdata = data.frame(altitude = 1000))
# ou podemos usar a nossa função...
getMort(1000)
```
***
# Exercício 2.
**Realize uma regressão múltipla aos dados `DataTP7parqueseolicos.csv` e interprete os resultados. Pretende obter um sub-modelo para utilizar noutras regiões com parques eólicos. Obtenha um sub-modelo para esse efeito.**
Vamos agora criar um modelo linear com mais covariáveis. Como logo à partida não sabemos as relações entre as variáveis podemos começar por criar um modelo com todas as variáveis.
> **Pro tip:** Quando não temos grande conhecimento de potenciais relações entre variáveis podemos usar a função `pairs()` que cria gráficos com todas as variáveis presentes nos dados para que possamos visualmente estudar as relações de dependência. No exemplo em baixo é possível ver que o segundo gráfico da primeira linha represente a relação da mortalidade em função da altitude, como já estudámos no exercício anterior. Podemos talmbém ver que a variável `proximidade.aero` também poderá ter um efeito positivo e linear na mortalidade.
```{r, fig.width=7, fig.height=7, fig.align='center'}
pairs(dpeol, pch=16)
```
```{r, tidy=T}
# modelo completo, com todas as covariáveis presentes nos dados
mod.multi <- lm(mortalidade ~ ., data = dpeol)
# o ponto "." é uma maneira mais rápida de incluir todas as vars
# mod.multi <- lm(mortalidade ~ densidade.aero + altitude + proximidade.aero + estradas, data = dpeol)
summary(mod.multi)
```
Vendo o sumário do modelo podemos criar um modelo mais simples apenas com as covariáveis `altitude` e `proximidade.aero`.
```{r, tidy=T}
mod.multi2 <- lm(mortalidade ~ altitude + proximidade.aero, data = dpeol)
summary(mod.multi2)
```
***
# Exercício 3.
**Efectue uma análise da regressão aos dados `DataTP7densidade.csv`, os quais são relativos à densidade de uma espécie em função de variáveis ambientais. Seja a variável dependente a Densidade e a independente a Temperatura. Explore os resultados e efectue uma avaliação do cumprimento dos pressupostos.**
Como sempre, lemos os dados. **Ter sempre atenção** à estrutura dos dados. Abrir os dados antes de os importar para ver como foram recolhidos, qual a separação das colunas e qual o tipo de registo quanto aos números decimais.
```{r, tidy=T}
# ler os dados, ter em atenção o tipo de dados e como se separam os numeros decimais (virgulas ou pontos)
ddens <- read.csv2("DataTP7densidade.csv", dec=".")
```
Ver a estrutura e sumário dos dados.
```{r}
str(ddens) # tudo valores numéricos
summary(ddens)
```
Temos `r nrow(ddens)` observações e `r ncol(ddens)` variáveis recolhidas. Vamos usar a `Densidade` como variável dependente e a `Temperatura` como variável independente. Antes de partirmos para a construção do modelo podemos estudar visualmente a relação entre estas variáveis.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
plot(ddens$Temperatura, ddens$Densidade, xlim = c(5, 30), xlab = "Temperatura", ylab = "Densidade", pch = 20, cex = 2, col = "brown", las = 1)
box(lwd=2)
```
Podemos ajustar o modelo linear simples.
```{r}
mod.temp <- lm(Densidade ~ Temperatura, data = ddens)
summary(mod.temp)
```
Pelo sumário do modelo é possível dizer que a temperatura tem um efeito negativo na densidade da espécie. Quando a temperatura aumenta, o densidade vai reduzir. Mais correctamente podemos dizer que por grau de temperatura incrementado o modelo estima que a densidade vai decrescer em aproximadamente 1.45.
Vemos a linha do modelo ajustado no gráfico anterior.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
plot(ddens$Temperatura, ddens$Densidade, xlim = c(5, 30), xlab = "Temperatura", ylab = "Densidade", pch = 20, cex = 2, col = "brown", las = 1)
abline(mod.temp, lwd = 2, lty = 2, col = "gray35")
box(lwd=2)
```
Tendo o modelo ajustado podemos (e devemos) fazer a análise dos resíduos do modelo.
```{r}
# método 1
residuals(mod.temp)
# método 2 para obter os resíduos
mod.temp$residuals
```
Podemos contruir gráficos de diagnóstico do modelo ajustado.
> **Pro tip:** O conjunto de gráficos de diagnóstio ajuda, de uma maneira visual a explicar o quão bem o modelo se ajusta aos dados. Os dois gráficos do lado direito ajudam a análise de resíduos; o objectivo aqui é não encontrar padrões definidos, garantindo assim a homocedasticidade (i.e. variância constante) dos resíduos (com uma linha vermelha horizontal em torno do valor 0). O gráfico do canto superior direito é um gráfico Q-Q ou *quantil-quantil*, este gráfico coloca os resíduos standardizados em função de quantis teóricos calculados considerando uma distribuição Normal; visualmente, se os pontos (ou maioria deles) se ajustarem bem à linha diagonal, pode-se assumir que os dados do modelo têm uma distribuição Normal. Esta ideia pode depois ser corroborada com a aplicação de um teste de normalidade de Shapiro-Wilk. Por fim, o gráfico do canto inferior direito define intervalos para a Distância de Cook. Esta é uma medida utilizada para identificar potenciais observações influentes e/ou candidatos a outliers; visualmente, uma observação seria considerada influente ou outlier caso passe o intervalo 0.5 ou 1.
```{r, fig.width=7, fig.height=7, fig.align='center'}
par(mfrow = c(2, 2))
plot(mod.temp, pch=16, col="coral3")
```
Olhando para os resultados não parece haver nenhum motivo para considerar o modelo como pouco adequado, por isso poderíamos pensar usar o modelo para prever a densidade da espécie em função da temperatura associada. No entanto, é de notar que estamos a trabalhar com um conjunto de dados relativamente pequeno o que dificultaria qualquer que fosse o motivo para considerar o modelo como errado.
Uma análise de correlação das duas variáveis ajudaria a justificar esta relação.
```{r}
cor(ddens$Temperatura, ddens$Densidade)
```
A correlação, $R$, é naturalmente negativa, uma vez que um aumento da temperatura leva à redução da densidade.
O $R^2$ é aproximadamente `r round(cor(ddens$Temperatura,ddens$Densidade)^2,4)`. Este valor está presente no sumário do modelo enquanto coeficiente de determinação e indica que o modelo explica `r round(with(ddens,cor(Temperatura,Densidade))^2*100,2)`% da variabilidade da densidade da espécie.
```{r}
# mostrar como se calcula o R^2
cor(ddens$Temperatura, ddens$Densidade) ^ 2
```
***
# Exercício 4.
**Com base nos dados da alínea anterior, efectue uma análise de regressão múltipla, sendo a variável dependente a densidade e as independentes todas as restantes. Comente os resultados e verifique se os pressupostos são cumpridos.**
Fazemos o modelo com a densidade a depender de todas as variáveis dos dados.
```{r}
mod.dens <- lm(Densidade ~ ., data = ddens)
summary(mod.dens)
```
Quando todas as variáveis são incluídas no modelo apenas a `Turbidez` e a `Salinidade` surgem como variáveis significativas no modelo. A variável `Temperatura`, que no exercício anterior parecia funcionar bem quando isolada aqui pode ser excluída!
```{r}
# modelo só com turbidez e salinidade
mod.TS <- lm(Densidade ~ Turbidez + Salinidade, data = ddens)
summary(mod.TS)
```
Ajustar um modelo só com as duas variáveis faz com elas se tornem ainda mais significativas. Este novo modelo `mod.TS` tem um coeficiente de determinação de 0.9701. Comparando com o estimado no modelo `mod.dens` podemos dizer que retirar as variáveis para a temperatura e oxigénio apenas se perde `r (0.9761-0.9701)*100`% da explicação da variabilidade (o que é uma informação vestigial). E além disso, 0.97 é muito bom!
Vamos então fazer uma análise aos resíduos do modelo. Começando por uma análise visual.
```{r, fig.width=7, fig.height=7, fig.align='center'}
par(mfrow = c(2, 2))
plot(mod.TS, pch=16)
```
Os resíduos parecem bons (com a excepção da observação 14 que pode potencialmente estar a influenciar a tendência do modelo -- experimentar retirar o ponto e voltar a ajustar o modelo pode ser uma boa solução), podemos complementar o gráfico quantil-quantil para testar a sua normalidade (teste de Shapiro-Wilk).
```{r}
shapiro.test(residuals(mod.TS))
```
Com um p-value maior que os niveis de significância usuais não temos qualquer evidência para rejeitar a hipótese de que os residuos sejam provenientes de uma distribuição Gaussiana, pelo que não há evidencias para suspeitar que o modelo não seja adequado.
***
# Exercício 5.
**Aplique um GLM aos dados `DataTP7anchova.csv`, referentes à abundância de anchova (variável dependente) em função de várias variáveis ambientais (variáveis independentes). Explore os resultados.**
```{r}
danchova <- read.csv2("DataTP7anchova.csv", dec = ".")
```
Dar uma vista de olhos aos dados.
```{r}
# estrutura
str(danchova)
# sumário
summary(danchova)
```
Qual será distribuição adequada para a variável resposta `ANC`? Por vezes a distribuição das observações pode ajudar-nos a ter uma ideia de como se comportam os dados.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
# histograma para tentar ver a dist da veriável resposta
hist(danchova$ANC, ylim = c(0, 20), col = "cyan4", xlab = "Abundância de Anchova", main = "")
box(lwd = 2)
```
O histograma não parece dar grande informação sobre o tipo de distribuição com que estamos a lidar. Podemos ver e construir um modelo linear generalizado (GLM) assumindo que a variável resposta `ANC` tem uma distribuição Gamma com função de ligação logarítmica (`family = Gamma(link = "log")`).
```{r}
# danchova <- glm(ANC ~ ., data = danchova, family = Gamma(link = "log"))
```
No entanto, ajustar o GLM (em cima comentado) devolverá um erro uma vez que existem valores de 0 nas observações da variável resposta, coisa que é incomportável quando se pretende aplicar trabalhar com uma Gamma. Uma maneira de contornar este problema é adicionar uns *pozinhos* à variável resposta (`ANC + 0.001`), assim garantindo que estes zeros passam a observações positivas e o modelo pode ser ajustado sem que os valores sejam significantemente adulterados.
```{r, tidy=T}
fitANC <- glm((ANC + 0.001) ~ ., family = Gamma(link = "log"), data = danchova)
summary(fitANC)
```
Olhando para o sumário dos dados há duas covariáveis que saltam à vista, a salinidade e a turbidez da água, que de um ponto de vista biológico pode fazer sentido. Podemos criar um modelo para a densidade das anchovas incluindo apenas essas duas variáveis.
```{r, tidy=T}
fitANC2 <- glm((ANC + 0.001) ~ Salinity + Turbidity, family = Gamma(link = "log"), data = danchova)
summary(fitANC2)
```
A covariável `Salinity` no modelo comlpeto surgia como *borderline* significativa (ao nível de significância $\alpha$ = 0.05 já não seria considerada significativa). Neste segundo modelo torna-se importante para a descrição da densidade das anchovas. É de notar que as estimativas das covariáveis são baixas (na ordem das milésimas), pelo que apesar de significativas só se sente o seu impacto no modelo devido às suas amplitudes (`Salinity` = (`r range(danchova$Salinity)`) e `Turbidity` = (`r range(danchova$Turbidity)`)).
Fazendo a análise dos resíduos do modelo.
```{r, fig.width=7, fig.height=7, fig.align='center'}
par(mfrow = c(2, 2))
plot(fitANC2, pch = 20, col = "cyan4")
```
Temos a observação 58 como um valor algo discrepante das restantes.
```{r}
# vamos ver o valor dessa observação
danchova$ANC[58]
```
Esta observação é o 0 registado na variável resposta. Podemos construir o mesmo modelo desta vez retirando essa observação nos dados.
```{r, tidy=T}
fitANC2_clean <- glm(ANC ~ Salinity + Turbidity, family = Gamma(link = "log"), data = danchova[-58, ])
summary(fitANC2_clean)
```
Ao retirar esta observação a Salinidade mais uma vez deixa de ser significativa considerando um nivel de significancia de 5% na explicação da densidade de anchovas. Ainda assim podemos fazer a análise de resíduos e comparar as diferenças com o modelo `fitANC2`.
```{r, fig.width=7, fig.height=7, fig.align='center'}
par(mfrow=c(2,2))
plot(fitANC2_clean, pch = 20, col = "cyan4")
```
É possível ver um gráfico quantil-quantil com os pontos mais bem ajustados à linha, ainda que os extremos não o estejam a 100%. O mesmo se pode dizer do gráfico Scale-Location, que já não mostra o ponto 58 a influenciar a linha.
O modelo pode ser considerado aceitável e o exercício poderia ficar por aqui, interpretando que variáveis podem influenciar a densidade da espécie e em que cenários (com ou sem zeros nas observações). Mas como somos seres curiosos e não custa nada ir um bocado mais além, vamos ajustar um modelo para a densidade das anchovas (sem o 0) apenas com a variável turbidez enquanto variável explicativa.
```{r}
fitANC.T <- glm(ANC ~ Turbidity, family = Gamma(link = "log"), data = danchova[-58, ])
summary(fitANC.T)
```
Modelo bem ajustado e com uma análise de resíduos semelhante às anteriores. Tendo apenas uma covariável podemos estudar visualmente a relação de dependência da variável alearória, incluindo também uma curva para os valores preditivos.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
# criamos sequencia de valores de turbidez onde queremos prever a densidade de anchovas
turb.seq <- seq(40, 3200, 0.2)
# fazemos uso da função predict.glm() para prever a densidade em função da sequancia de valores, tendo em conta o modelo criado
predict.turb <- predict.glm(fitANC.T, newdata = data.frame(Turbidity = turb.seq), type = "response")
# gráfico com os pontos densidade em função da turbidez
plot(danchova$Turbidity, danchova$ANC, xlab = "Turbidez", ylab = "Densidade Anchova", pch = 20, cex = 2, col = "cyan4", xlim = c(0, 3500), ylim = c(0, 1), las = 1)
# linha para valores preditivos em função da sequencia de turbidez
lines(turb.seq, predict.turb, lty = 2, col = "gray35", lwd = 2)
box(lwd = 2)
```
***
# Exercício 6.
**Aplique um GLM aos dados `DataTP7presenca.csv`, os quais descrevem a abundância de uma espécie em função de algumas variáveis ambientais. Utilize a distribuição Gama como família de distribuição do erro (Gamma) e a função inversa como função de ligação (inverse).**
Ler os dados.
```{r}
dpresenca <- read.csv2("DataTP7presenca.csv")
```
Ver os dados.
```{r}
# estrutura
str(dpresenca)
# sumário
summary(dpresenca)
```
Temos `r ncol(dpresenca)` variáveis, com `r nrow(dpresenca)` observações. Podemos assumir que a variável `presenca` depende de todas as outras (nota: com 10 observações, um modelo com 5 variáveis é demasiado complexo para correr bem, mas vamos experimentar...)
```{r, tidy=T}
fit.pres <- glm(presenca ~ ., family = Gamma(link = "inverse"), data = dpresenca)
summary(fit.pres)
```
Apenas a variável `estradas` parece ter um impacto significativo no modelo. Podemos tentar construir um modelo com essa variável.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
plot(dpresenca$estradas, dpresenca$presenca, xlab = "Estradas", ylab = "Presença", pch = 20, cex = 2, col = "goldenrod", xlim = c(0, 25), ylim = c(0,20), las = 1)
box(lwd = 2)
```
```{r, tidy=T}
fit.estradas <- glm(presenca ~ estradas, family = Gamma(link = "inverse"), data = dpresenca)
summary(fit.estradas)
```
Finalmnete, vamos visualizar esta relação.
```{r, fig.width=8, fig.height=6, fig.align='center', tidy=T}
est.seq <- seq(0, 25, 0.1)
predict.estradas <- predict.glm(fit.estradas, newdata = data.frame(estradas = est.seq), type = "response")
plot(dpresenca$estradas, dpresenca$presenca, xlab = "Estradas", ylab = "Presença", pch = 20, cex = 2, col = "goldenrod", xlim = c(0, 25), ylim = c(0, 20), las = 1)
lines(est.seq, predict.estradas, lty = 2, col = "gray50", lwd = 2)
box(lwd = 2)
```
Na ficha TP7b este conjunto de dados vai voltar a ser explorado, de uma forma mais minuciosa... até lá... bom estudo :)
***