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
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
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
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
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")