---
title: "Caso S08: Regressão não-linear"
output:
  html_document:
    df_print: paged
---

------------------------------------------------------------------------

### Pacotes do R utilizados:

```{r, message=FALSE, warning=FALSE, include = FALSE}
library(readxl)
library(ggplot2)
library(dplyr)
library(MASS)
library(caret)
library(gam)
```

------------------------------------------------------------------------

### 1. Seleção dos dados:

```{r include = TRUE}
df_RG = read_excel("Df_ProdEnerg.xlsx")
df_RG = data.frame(df_RG)
str(df_RG)
```

------------------------------------------------------------------------

### 2. Diagramas de dispersão e definição do modelo

```{r}
df_RG %>% ggplot(aes(x=AT,y=PE)) + geom_point() +
  xlab("Temperatura ambiente (oC)") + ylab("Energia produzida (MW)") +
  geom_smooth(method = lm, formula = y ~ sqrt(x))
#  geom_smooth(method = lm, formula = y ~ poly(x,3,raw=TRUE))
```

```{r}
df_RG %>% ggplot(aes(x=V,y=PE)) + geom_point() +
  xlab("Pressao do vapor (cm Hg)") + ylab("Energia produzida (MW)") +
  geom_smooth(method = lm, formula = y ~ log(x))
#  geom_smooth(method = lm, formula = y ~ poly(x,3,raw=TRUE))
```


```{r}
df_RG %>% ggplot(aes(x=AP,y=PE)) + geom_point() +
  xlab("Pressao atmosferica (mbar)") + ylab("Energia produzida (MW)") +
  geom_smooth(method = lm, formula = y ~ I(x^3))
#  geom_smooth(method = lm, formula = y ~ poly(x,3,raw=TRUE))
```


```{r}
df_RG %>% ggplot(aes(x=RH,y=PE)) + geom_point() +
  xlab("Umidade relativa (%)") + ylab("Energia produzida (MW)") +
  geom_smooth(method = lm, formula = y ~ I(x^5))
#  geom_smooth(method = lm, formula = y ~ poly(x,5,raw=TRUE))
```

   
   
------------------------------------------------------------------------

### 3. Transformação dos dados

#### Divisao dos dados em amostras de treinamento e de teste do modelo:

Nesta etapa os dados serao divididos de forma a ficar 80% para treinamento do modelo e 20% para teste do modelo. Assim:


```{r}
set.seed(136)
Index <- createDataPartition(y = df_RG$PE,p = 0.8, list = FALSE)
treino <- df_RG[Index,]
teste <- df_RG[-Index,]
```


------------------------------------------------------------------------

### 4. Mineracao dos dados:

___

#### Regressão com transformação dos dados:   

   
```{r}
fit.lm.t <- lm(PE ~ sqrt(AT) + log(V) + I(AP^3) + I(RH^5), data = treino)
fit.lm.t
summary(fit.lm.t)
plot(fit.lm.t,which=1)
```

```{r}
step.model <- stepAIC(fit.lm.t, direction = "both", 
                      trace = FALSE)
summary(step.model)
```


- Desempenho no conjunto de teste:   
   
```{r}
Prev.teste.lm.t <- predict(fit.lm.t,newdata = teste)
postResample(pred = Prev.teste.lm.t, obs = teste$PE)
```
   
___

#### Regressão Polinomial:   

```{r}
fit.poly <- lm(PE ~ poly(AT,3,raw=TRUE) + poly(V,3,raw=TRUE) + 
                    poly(AP,3,raw=TRUE) + poly(RH,5,raw=TRUE), data = treino)
fit.poly
summary(fit.poly)
plot(fit.poly,which=1)
```

```{r}
step.model <- stepAIC(fit.poly, direction = "both", 
                      trace = FALSE)
summary(step.model)
```


```{r}
fit.poly <- lm(PE ~ poly(AT,3,raw=TRUE) + poly(V,3,raw=TRUE) + 
                    poly(AP,3,raw=TRUE), data = treino) # Sem RH
fit.poly
summary(fit.poly)
plot(fit.poly,which=1)
```


```{r}
Prev.teste.poly <- predict(fit.poly,newdata = teste)
postResample(pred = Prev.teste.poly, obs = teste$PE)
```
   
___

#### Regressão GAM (Generalized Additive Model using Splines):   
  

```{r}
fit.gam <- train(PE ~ .,
                 data = treino, 
                 method = 'gam',
                 trControl =trainControl(method = "cv",number = 10))
summary(fit.gam)
```


- Análise dos resíduos:   
   
```{r}
Prev.teste.gam <- predict(fit.gam,newdata = teste)
predVals <- extractPrediction(list(fit.gam), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.gam, obs = teste$PE)
```   
      

___

#### Regressão KNN:   
  

```{r}
set.seed(326)
fit.KNN <- train(PE ~ .,
                 method    = "knn",
                 tuneGrid  = expand.grid(k = 1:20),
                 trControl = trainControl(method ="cv",number=10),
                 preProcess = c("center", "scale"),
                 metric    = "RMSE",
                 data      = treino)
fit.KNN
plot(fit.KNN)
```


- Análise dos resíduos:   
   
```{r}
Prev.teste.KNN <- predict(fit.KNN,newdata = teste)
predVals <- extractPrediction(list(fit.KNN), 
                              testX = teste[,1:4], 
                              testY = teste[,5])
plotObsVsPred(predVals)
postResample(pred = Prev.teste.KNN, obs = teste$PE)
```

   
___


