Carregando os dados e pacotes do exemplo:

library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.2.4
dados = read.csv("../data/Advertising.csv",header=TRUE)

Definindo as variáveis e interesse:

TV = dados$TV
radio = dados$Radio
jornal = dados$Newspaper
Vendas = dados$Sales

O exemplo utilizado se baseia na predição de quantiddade de produtos vendidos (em milhares de unidades) de acordo com o investimento feito em propagando (em milhares de dólares). Para criar uma regressão linear simples usando somente a variável TV:

reg_linear = lm(Vendas ~ TV)

Imprimindo o sumário do modelo:

summary(reg_linear)
## 
## Call:
## lm(formula = Vendas ~ TV)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.3860 -1.9545 -0.1913  2.0671  7.2124 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 7.032594   0.457843   15.36   <2e-16 ***
## TV          0.047537   0.002691   17.67   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.259 on 198 degrees of freedom
## Multiple R-squared:  0.6119, Adjusted R-squared:  0.6099 
## F-statistic: 312.1 on 1 and 198 DF,  p-value: < 2.2e-16

Obtendo as predições do modelo:

predicoes = predict.lm(reg_linear,dados)

Obtendo os resíduos:

residuos = Vendas - predicoes

Gráficos de Diagnóstico

O gráfico valors observados versus valores previstos nos dá uma ideia da acurácia do nosso modelo.

axisRange = extendrange(c(Vendas,predicoes)) #deixando as variáveis na mesma escala
plot(Vendas,predicoes)
abline(0,1,col="blue",lty=2,lwd=2)

Plotando predições versus resíduos:

plot(predicoes,residuos)
abline(h=0,col="blue",lty=2,lwd=2)

Verificando se os resíduos seguem uma distribuição normal com média 0:

qqnorm(residuos)
qqline(residuos, col = 2,lwd=2,lty=2)

Calculando RMSE e R2:

RMSE(predicoes,Vendas)
## [1] 3.242322
R2(predicoes,Vendas)
## [1] 0.6118751

Regressão Múltipla

Para criar uma regressão múltipla utilizando todas as variáveis disponíveis fazemos o seguinte:

reg_multipla = lm(Vendas ~ TV + radio + jornal)
summary(reg_multipla)
## 
## Call:
## lm(formula = Vendas ~ TV + radio + jornal)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.8277 -0.8908  0.2418  1.1893  2.8292 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.938889   0.311908   9.422   <2e-16 ***
## TV           0.045765   0.001395  32.809   <2e-16 ***
## radio        0.188530   0.008611  21.893   <2e-16 ***
## jornal      -0.001037   0.005871  -0.177     0.86    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.686 on 196 degrees of freedom
## Multiple R-squared:  0.8972, Adjusted R-squared:  0.8956 
## F-statistic: 570.3 on 3 and 196 DF,  p-value: < 2.2e-16

Como a variável jornal não parece ter relação com a variável-alvo note que a diferença entre o R2 do modelo acima e um modelo sem jornal é muito pequena:

reg_multipla_sem_jornal = lm(Vendas ~ TV + radio)
summary(reg_multipla_sem_jornal)
## 
## Call:
## lm(formula = Vendas ~ TV + radio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -8.7977 -0.8752  0.2422  1.1708  2.8328 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  2.92110    0.29449   9.919   <2e-16 ***
## TV           0.04575    0.00139  32.909   <2e-16 ***
## radio        0.18799    0.00804  23.382   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.681 on 197 degrees of freedom
## Multiple R-squared:  0.8972, Adjusted R-squared:  0.8962 
## F-statistic: 859.6 on 2 and 197 DF,  p-value: < 2.2e-16

Regressão Múltipla com Interação de Variáveis

Abaixo uma regressão com intereção entre radio e TV:

reg_multi_interaction = lm(Vendas ~ TV + radio + TV*radio)
summary(reg_multi_interaction)
## 
## Call:
## lm(formula = Vendas ~ TV + radio + TV * radio)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -6.3366 -0.4028  0.1831  0.5948  1.5246 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 6.750e+00  2.479e-01  27.233   <2e-16 ***
## TV          1.910e-02  1.504e-03  12.699   <2e-16 ***
## radio       2.886e-02  8.905e-03   3.241   0.0014 ** 
## TV:radio    1.086e-03  5.242e-05  20.727   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.9435 on 196 degrees of freedom
## Multiple R-squared:  0.9678, Adjusted R-squared:  0.9673 
## F-statistic:  1963 on 3 and 196 DF,  p-value: < 2.2e-16

Regressão polinomial

Abaixo exemplo de uma regressão polinomial de grau 2:

poly2 = lm(Vendas ~ TV + I(TV^2))
summary(poly2)
## 
## Call:
## lm(formula = Vendas ~ TV + I(TV^2))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -7.6844 -1.7843 -0.1562  2.0088  7.5097 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  6.114e+00  6.592e-01   9.275  < 2e-16 ***
## TV           6.727e-02  1.059e-02   6.349 1.46e-09 ***
## I(TV^2)     -6.847e-05  3.558e-05  -1.924   0.0557 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.237 on 197 degrees of freedom
## Multiple R-squared:  0.619,  Adjusted R-squared:  0.6152 
## F-statistic: 160.1 on 2 and 197 DF,  p-value: < 2.2e-16
curva2 = function(x) poly2$coefficients[1] + poly2$coefficients[2]*x + poly2$coefficients[3]*x^2
curve(curva2,xlim=c(min(TV),max(TV)),ylim=c(min(Vendas),max(Vendas)),xlab="TV",ylab="Vendas",col="red",lwd=2)
points(TV,Vendas,type="p")