library(ggplot2)
library(patchwork)
library(performance)
library(readxl)
library(gt)
library(tidyverse)
library(glmnet)

1 Introdução

A análise de regressão é uma ferramenta estatística usada para entender a relação entre variáveis independentes e uma variável dependente. É amplamente utilizada em diversos campos, como economia, biologia, engenharia e ciências sociais, para modelar e prever comportamentos.

Existem vários tipos de modelos de regressão, cada um adequado para diferentes tipos de dados e questões de pesquisa. A seguir, vamos explorar alguns dos modelos mais populares: a regressão linear, a regressão de Ridge, a regressão Lasso e a Elastic Net.

1.1 Regularização

As técnicas de regularização são muito utilizadas em modelos de aprendizado de máquina, pois ajudam a evitar o overfitting e a melhorar a generalização do modelo. A regularização adiciona uma penalidade aos coeficientes do modelo, incentivando a simplicidade e evitando que os coeficientes se tornem muito grandes. Isso é particularmente útil em situações onde há muitas variáveis independentes ou colinearidade entre as variáveis. Embora a regularização possa tornar o modelo mais simples, ela possui um viés e também tende a reduzir a variância, resultando em modelos mais estáveis, para testar a qualidade do ajuste o conjunto de dados foi dividido em duas partes, uma para treino do modelo e outra para teste, a métrica utilizada para avaliar a qualidade do ajuste foi o erro quadrático médio.

2 Regressão Linear

A regressão linear é o modelo de regressão mais básico e amplamente conhecido. Ela assume uma relação linear entre as variáveis independentes e a variável dependente. Seu objetivo é encontrar a linha reta que melhor ajusta os dados, minimizando a soma dos quadrados dos resíduos (as diferenças entre os valores observados e os previstos).

2.1 Correlação linear

A figura abaixo apresenta um exemplo simples de tipos de correlação entre duas variáveis. No primeiro gráfico, não há correlação entre as variáveis (correlação ausente). No segundo gráfico, há uma correlação positiva entre as variáveis. No terceiro gráfico, há uma correlação negativa entre as variáveis.

Sample<-rnorm(1000)
Sample2<-rnorm(1000)

# Geom points

G1<-ggplot(,aes(x=Sample, y=Sample2)) +
  geom_point(color = "#1b6ca8")+
  theme_light()+
  labs(title="Correlação ausente",
       x="X",
       y="Y")

# Criar duas amostras aleatórias que contenham correlação positiva

Sample3<-rnorm(1000)
Sample4<-Sample3+rnorm(1000)

# Geom points

G2<-ggplot(data=NULL, aes(x=Sample3, y=Sample4))+
  geom_point(color = "#3aaf85")+
  theme_light()+
  labs( title="Correlação linear positiva",
       x="X",
       y="Y")

# Criar duas amostras aleatórias que contenham correlação negativa

Sample5<-rnorm(1000)
Sample6<- -Sample5+rnorm(1000)

# Geom points

G3<-ggplot(data=NULL, aes(x=Sample5, y=Sample6)) +
  geom_point(color = "#cd201f")+
  theme_light()+
  labs( title="Correlação linear negativa",
       x="X",
       y="Y")

# Juntando os 3 gráficos usando o facet_wrap

G1+G2+G3

2.2 Ajuste do modelo de regressão linear

Neste trecho de código foi carregado o conjunto de dados “ENB2012_data.xlsx” que contém informações sobre a eficiência energética de edifícios. O objetivo é prever a variável Y2 (carga de resfriamento) com base nas variáveis independentes X1 a X8. O conjunto de dados foi dividido em 70% para treino e 30% para teste. Em seguida, foi ajustado um modelo de regressão linear usando todas as variáveis independentes.

Dados<- read_excel("ENB2012_data.xlsx")
Dados<- Dados %>% 
  select(X1, X2, X3, X4, X5, X6, X7, X8, Y2)

#Selecionando os dados para treinar

Size<- floor(0.7*nrow(Dados))
train<- sample(seq_len(nrow(Dados)), Size)
test<- Dados[-train,]
train<- Dados[train,]

lm_model <- lm(Y2~ X1+X2+X3+X4+X5+X6+X7+X8,train)

Para a seleção de variáveis, foi utilizado o método stepwise, que avalia todas as combinações possíveis de variáveis e seleciona o melhor modelo com base em um critério de seleção. Neste caso, o critério escolhido foi o BIC (Bayesian Information Criterion), que penaliza modelos mais complexos. O modelo selecionado pelo método stepwise foi ajustado e avaliado em relação ao modelo de regressão linear original.

2.3 Seleção de variáveis via stepwise

A seleção de variáveis pode ser obtida através do seguinte código: stepwise_model <- step(lm_model, direction = “both”, k = log(nrow(train)))

Omiti a saída pois é um pouco grande, mas você pode executar o código no seu ambiente para ver os resultados.

sum1 <- summary(stepwise_model)

coefs1 <- coef(stepwise_model) %>% 
        .[!is.na(.)]
      
      df1 <- sum1$coefficients %>% 
                as.data.frame() %>% 
                cbind(rownames(.), ., confint(stepwise_model, parm = names(coefs1))) %>% 
                select(1:3, 6:7, 5)
  
      names(df1)[1]<- "Variables"
      
      gt(df1) %>%
        tab_header(title = md("**Resumo do modelo selecionado pelo stepwise**")) %>%
        fmt(
          columns = c(2:6),
          fns = function(x)
            format(
              round(x, 4),
              #big.mark = ".",
              #decimal.mark = ",",
              nsmall = 4,
              scientific = FALSE
            )
        )  %>%
        tab_spanner(label = "CI 95%",
                    id = "unique_id",
                    columns = c(4,5)) %>%
        tab_footnote(c("R-squared:", round(sum1$r.squared, 4))) %>%
        tab_footnote(c("Adjusted R-squared:", round(sum1$adj.r.squared, 4))) %>%
        tab_footnote(c("Residual standard error:", round(sum1$sigma, 4))) %>%
        opt_stylize(style = 3, color = "blue") %>% 
        tab_options(  table.width ="100%")
Resumo do modelo selecionado pelo stepwise
Variables Estimate Std. Error
CI 95%
Pr(>|t|)
2.5 % 97.5 %
(Intercept) 82.6299 25.1027 33.3171 131.9427 0.0011
X1 -65.1809 13.4959 -91.6929 -38.6689 0.0000
X2 -0.0714 0.0225 -0.1155 -0.0272 0.0016
X3 0.0329 0.0085 0.0162 0.0496 0.0001
X5 4.8991 0.4416 4.0317 5.7666 0.0000
X7 15.4246 1.0452 13.3714 17.4778 0.0000
R-squared: 0.8896
Adjusted R-squared: 0.8885
Residual standard error: 3.23

A seleção via stepwise retirou as variáveis X4,X6 e X8 do modelo, o que resultou em um modelo mais simples e com um BIC menor. O modelo selecionado apresentou um R-quadrado ajustado de 0.8894 e um erro padrão residual de 3.1995.

2.4 Avaliação do modelo de regressão linear

Predict<-predict(stepwise_model, test)
sqrt(mean((Predict-test$Y2)^2))
## [1] 3.174

3 Regressão de Ridge

A regressão utilizando a regularização de Ridge consiste em encontrar o ponto mínimo desta função, sendo o segundo membro dela a penalização.

\[ \sum_{i=1}^{n} (y_i - \beta^Tx_t)^2 + \lambda \sum_{j=1}^{p} \beta_j^2\]

A regressão de Ridge é uma variação da regressão linear que incorpora uma penalidade ao tamanho dos coeficientes. Isso é útil em situações onde há colinearidade entre as variáveis independentes. Ao adicionar essa penalidade, a regressão de Ridge tende a produzir modelos mais estáveis e evita o overfitting.

ridge_model <- cv.glmnet(as.matrix(train[,1:8]), train$Y2, alpha = 0)
plot(ridge_model)

O gráfico anterior mostra a variação do erro quadrático médio em função do log de lambda, que é o coeficiente de regularização. O valor de lambda que minimiza o erro quadrático médio é chamado de lambda mínimo. As linhas tracejadas na vertical indicam o valor de lambda que minimiza o erro quadrático médio e o valor com a maior regularização em que o erro quadrático médio não seja maior que o mínimo multiplicado mais um desvio padrão.

coef(ridge_model, s = "lambda.min")
## 9 x 1 sparse Matrix of class "dgCMatrix"
##                   s1
## (Intercept) 12.67246
## X1          -7.33016
## X2          -0.01255
## X3           0.04318
## X4          -0.04424
## X5           3.04603
## X6           0.14527
## X7          13.85605
## X8           0.12519

3.1 Extraindo o erro quadrático médio

Predict<-predict(ridge_model, as.matrix( test[,1:8]))
sqrt(mean((Predict-test$Y2)^2))
## [1] 3.318

4 Regressão Lasso

A regularização de Lasso é obtida através da minimização da seguinte função: \[ \sum_{i=1}^{n} (y_i - \beta^Tx_t)^2 + \lambda \sum_{j=1}^{p} |\beta_j|\]

A regressão Lasso (Least Absolute Shrinkage and Selection Operator) também adiciona uma penalidade aos coeficientes, mas de forma diferente da regressão de Ridge. A penalidade Lasso pode forçar alguns coeficientes a zero, efetivamente selecionando um subconjunto de variáveis independentes. Isso torna a regressão Lasso útil para seleção de variáveis e simplificação de modelos.

lasso_model <- cv.glmnet(as.matrix(train[,1:8]), train$Y2, alpha = 1)
plot(lasso_model)

coef(lasso_model, s = "lambda.min")
## 9 x 1 sparse Matrix of class "dgCMatrix"
##                     s1
## (Intercept)  2.496e+01
## X1          -3.422e+01
## X2          -2.887e-05
## X3           .        
## X4          -4.315e-02
## X5           5.564e+00
## X6           1.317e-01
## X7           1.506e+01
## X8           1.191e-01

4.1 Extraindo o erro quadrático médio

Predict<-predict(lasso_model, as.matrix( test[,1:8]))
sqrt(mean((Predict-test$Y2)^2))
## [1] 3.188

5 Regressão Elastic Net

A regularização Elastic Net é obtida através da minimização da seguinte função que é uma combinação da regularização Ridge e Lasso: \[\sum_{i=1}^{n} (y_i - \hat{y}i)^2 + \lambda_1 \sum_{j=1}^{p} |\beta_j| + \lambda_2 \sum_{j=1}^{p} \beta_j^2\]

A regressão Elastic Net combina os aspectos de penalidade da regressão de Ridge e da regressão Lasso. Ela usa uma combinação das penalidades L1 (Lasso) e L2 (Ridge), permitindo maior flexibilidade. O Elastic Net é especialmente útil quando há muitas variáveis independentes correlacionadas, pois pode selecionar grupos de variáveis correlacionadas em conjunto.

elastic_model <- cv.glmnet(as.matrix(train[,1:8]), train$Y2, alpha = 0.5)
plot(elastic_model)

coef(elastic_model, s = "lambda.min")
## 9 x 1 sparse Matrix of class "dgCMatrix"
##                     s1
## (Intercept)  6.649e+01
## X1          -5.682e+01
## X2          -2.818e-02
## X3           1.491e-05
## X4          -5.946e-02
## X5           5.079e+00
## X6           1.421e-01
## X7           1.512e+01
## X8           1.236e-01

5.1 Extraindo o erro quadrático médio

Predict<-predict(elastic_model, as.matrix( test[,1:8]))
sqrt(mean((Predict-test$Y2)^2))
## [1] 3.198

A regressão linear obtida pelo método de seleção de variáveis stepwise apresentou o menor erro quadrático médio entre os modelos testados. No entanto, é importante ressaltar que a escolha do modelo depende do contexto e dos objetivos da análise. Cada modelo tem suas vantagens e limitações, e é importante considerar esses aspectos ao escolher o modelo mais adequado para os dados e a questão de pesquisa em questão.