Exemplo - Regressão Linear Múltipla para os dados de vendas de cosméticos. O objetivo é propor e ajustar um modelo de regressão para explicar o total em vendas em função do tempo de serviço, idade, anos de estudo e Populacao atendida pelas vendedoras.

##      Tempo           Idade          Estudo        Populacao    
##  Min.   : 0.00   Min.   :23.0   Min.   : 4.00   Min.   :  128  
##  1st Qu.: 7.00   1st Qu.:35.0   1st Qu.: 6.00   1st Qu.: 7595  
##  Median :10.00   Median :40.0   Median : 8.00   Median :10399  
##  Mean   : 9.85   Mean   :39.6   Mean   : 8.65   Mean   :10143  
##  3rd Qu.:13.00   3rd Qu.:44.0   3rd Qu.:11.00   3rd Qu.:12618  
##  Max.   :20.00   Max.   :57.0   Max.   :17.00   Max.   :21203  
##      Venda      
##  Min.   : 4008  
##  1st Qu.:10508  
##  Median :12708  
##  Mean   :12597  
##  3rd Qu.:14584  
##  Max.   :20775

Matriz de gráficos de dispersão (com gráficos das densidades estimadas na diagonal). Os gráficos de dispersão fornecem um primeiro indicativo de tendência crescente entre Populacao atendida e total de vendas e, com menor intensidade, entre total de vendas e tempo de serviço.

Ajuste da regressão linear múltipla, considerando as quatro covariáveis. Nota: uma forma equivalente de ajustar o modelo acima seria

## 
## Call:
## lm(formula = Venda ~ ., data = vendas)
## 
## Coefficients:
## (Intercept)        Tempo        Idade       Estudo    Populacao  
##    3204.051      174.378       18.012       67.800        0.629

Extraindo as estimativas dos parâmetros da regressão.

## 
## Call:
## lm(formula = Venda ~ ., data = vendas)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -4381  -1299     26   1309   5848 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 3204.0510   900.8786    3.56  0.00047 ***
## Tempo        174.3781    40.9153    4.26 0.000032 ***
## Idade         18.0119    22.3506    0.81  0.42129    
## Estudo        67.8001    48.0258    1.41  0.15962    
## Populacao      0.6286     0.0373   16.86  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1910 on 195 degrees of freedom
## Multiple R-squared:  0.634,  Adjusted R-squared:  0.626 
## F-statistic: 84.3 on 4 and 195 DF,  p-value: <2e-16

Os resultados do ajuste indicam que o total em vendas aumenta conforme o tempo de experiência e a Populacao atendida. Para as demais variáveis, não há evidência significativa de que estejam relacionadas ao total em vendas. Estima-se que o total em vendas aumente, em média, R$174,37 para um ano a mais de experiência, mantendo-se fixas as demais covariáveis. Quanto à Populacao atendida, estima-se, em média, R$0,628 a mais por pessoa. Assim, para 1000 pessoas a mais na Populacao, estima-se, em média, R$628 a mais no total de vendas, mantendo-se fixas as demais covariáveis.

## 
## Call:
## lm(formula = Venda ~ scale(Tempo) + scale(Idade) + scale(Estudo) + 
##     scale(Populacao), data = vendas)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -4381  -1299     26   1309   5848 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)         12597        135   93.38  < 2e-16 ***
## scale(Tempo)          708        166    4.26 0.000032 ***
## scale(Idade)          125        155    0.81     0.42    
## scale(Estudo)         214        152    1.41     0.16    
## scale(Populacao)     2296        136   16.86  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1910 on 195 degrees of freedom
## Multiple R-squared:  0.634,  Adjusted R-squared:  0.626 
## F-statistic: 84.3 on 4 and 195 DF,  p-value: <2e-16

Neste novo modelo, todas as variáveis explicativas foram padronizadas (subtraímos, de cada valor, a média da variável e dividimos pelo respectivo desvio padrão). Assim, as variáveis agora têm mesma escala e seus efeitos são diretamente comparáveis.

##       1       2       3       4       5       6       7       8       9 
## 11734.0 11382.9  9709.5  8605.9 18879.6  5997.7 11349.9  9315.6 15271.2 
##      10 
## 14719.2

Valores ajustados pelo modelo de regressão linear múltipla para as 200 vendedoras.

Gráfico de valores observados pelos valores ajustados.

##                  2.5 %    97.5 %
## (Intercept) 1427.33465 4980.7673
## Tempo         93.68469  255.0715
## Idade        -26.06801   62.0919
## Estudo       -26.91661  162.5169
## Populacao      0.55507    0.7021

Intervalos de confiança (95%) para os parâmetros do modelo.

Agora, algumas predições.

##   Tempo Idade Estudo Populacao
## 1     3    30     10      1000
## 2    15    30     10     10000

Dois perfis de vendedoras para estimarmos o total médio de vendas e predizer o total de vendas

##       1       2 
##  5574.1 13323.9
##       fit     lwr     upr
## 1  5574.1  4671.4  6476.8
## 2 13323.9 12579.5 14068.3

Intervalos de confiança (95%) para o total médio de vendas.

##       fit    lwr     upr
## 1  5574.1 1704.9  9443.4
## 2 13323.9 9488.5 17159.3

Intervalos de predição (95%) para a predição do total de vendas.

Agora, vamos fazer estimativas e predições “no atacado”, usando todos os vetores de covariáveis (perfis de vendedoras) da base.

##    Tempo Idade Estudo Populacao     fit     lwr     upr
## 1      1    28      5     11951 11734.0 11048.9 12419.0
## 2      3    23      5     10981 11382.9 10666.1 12099.8
## 3      3    40      7      7616  9709.5  9102.2 10316.8
## 4      6    37      7      5114  8605.9  8090.5  9121.4
## 5     17    42     12     17724 18879.6 18096.1 19663.1
## 6     10    35      5       128  5997.7  5090.0  6905.5
## 7      6    45      6      9358 11349.9 10797.2 11902.7
## 8      7    32      8      6001  9315.6  8817.4  9813.8
## 9     14    41      9     13168 15271.2 14824.1 15718.3
## 10     8    42     11     13710 14719.2 14193.9 15244.6

Em vendas2 armazenamos os dados e os correspondentes ICs (95%) para o total médio de vendas.

##    Tempo Idade Estudo Populacao     fit     lwr     upr
## 1      1    28      5     11951 11734.0  7909.6 15558.3
## 2      3    23      5     10981 11382.9  7552.8 15213.1
## 3      3    40      7      7616  9709.5  5898.4 13520.7
## 4      6    37      7      5114  8605.9  4808.3 12403.5
## 5     17    42     12     17724 18879.6 15036.4 22722.8
## 6     10    35      5       128  5997.7  2127.3  9868.1
## 7      6    45      6      9358 11349.9  7547.1 15152.8
## 8      7    32      8      6001  9315.6  5520.3 13110.9
## 9     14    41      9     13168 15271.2 11482.3 19060.2
## 10     8    42     11     13710 14719.2 10920.3 18518.2

Em vendas3 armazenamos os dados e os correspondentes IPs (95%) para o total de vendas de novas vendedoras.

Vamos usar o teste F, baseado na extra soma de quadrados para testar algumas hipóteses. H0: Beta(idade)=0 vs H1: Beta(idade)!=0 (testando a significância do efeito da idade)

Modelo de regressão linear múltipla sem considerar a covariável idade.

## Analysis of Variance Table
## 
## Model 1: Venda ~ (Tempo + Idade + Estudo + Populacao) - Idade
## Model 2: Venda ~ Tempo + Idade + Estudo + Populacao
##   Res.Df       RSS Df Sum of Sq    F Pr(>F)
## 1    196 712067051                         
## 2    195 709703391  1   2363660 0.65   0.42

Repare que o acréscimo na soma de quadrados (vamos chamar de ASQ) de regressão associado à inclusão do efeito de idade é de 2363660, ao qual temos um grau de liberdade associado.

A estatística do teste é F=(ASQ/1)/QMRes, onde QMRes é o quadrado médio de resíduos do modelo “maior”, que pode ser verificado batendo anova(ajuste1).

Sob H0, F~F(1,195) (faça o teste à mão, para um nível de significância de 5%).

Algumas considerações: 1 - O efeito de idade é não significativo, o que poderia justificar a exclusão dessa variável do modelo.

2 - O teste F é equivalente ao teste t apresentado no summary. Isso não é coincidência, e sempre ocorrerá quando houver apenas um parâmetro do modelo sob teste.

3 - Repare a saída da função anova() aplicada a um único modelo. Ela apresenta a seguinte sequência de testes:

## Analysis of Variance Table
## 
## Response: Venda
##            Df     Sum Sq    Mean Sq F value  Pr(>F)    
## Tempo       1  191606685  191606685   52.65 9.2e-12 ***
## Idade       1     866557     866557    0.24    0.63    
## Estudo      1     260371     260371    0.07    0.79    
## Populacao   1 1034980948 1034980948  284.37 < 2e-16 ***
## Residuals 195  709703391    3639505                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

I- Linha 1 - Testa a inclusão do efeito de Tempo ao modelo nulo (sem covariáveis) - significativa.

II- Linha 2 - Testa a inclusão do efeito de Idade ao modelo com a covariável tempo - não significativa.

III- Linha 3 - Testa a inclusão do efeito de Anos de estudo ao modelo com as covariáveis tempo e idade - não significativa.

IV- Linha 4 - Testa a inclusão do efeito de Populacao ao modelo com as covariáveis tempo, idade e anos de estudo - significativa.

Nota - Em todos os testes, usa-se QMRes produzida pelo modelo ajustado com mais parâmetros (no caso, o modelo com as quatro covariáveis). Repare que os testes não são equivalentes aos do summary (exceto o último). Por que?

Pergunta - o que aconteceria com a sequência de testes se você mudasse a ordem de entrada das variáveis na função lm?

Ajuste da regressão linear múltipla, considerando as quatro covariáveis, com elas inseridas em ordem invertida.

## Analysis of Variance Table
## 
## Response: Venda
##            Df     Sum Sq    Mean Sq F value   Pr(>F)    
## Populacao   1 1069238001 1069238001  293.79  < 2e-16 ***
## Estudo      1   63098117   63098117   17.34 0.000047 ***
## Idade       1   29270468   29270468    8.04   0.0051 ** 
## Tempo       1   66107975   66107975   18.16 0.000032 ***
## Residuals 195  709703391    3639505                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Agora, vamos dar uma olhada no resultado da função Anova (com A maiúsculo), disponível no pacote car.

Anova(ajuste1) A sequência de testes agora é a seguinte: I- Linha 1 - Testa a inclusão do efeito de Tempo ao modelo ajustado com as outras três covariáveis - significativa.

II- Linha 2 - Testa a inclusão do efeito de Idade ao modelo ajustado com as outras três covariáveis - não significativa.

III- Linha 3 - Testa a inclusão do efeito de Anos de estudo ao modelo ajustado com as outras três covariáveis - não significativa.

IV- Linha 4 - Testa a inclusão do efeito de Populacao ao modelo ajustado com as outras três covariáveis - significativa.

Repare que os testes fornecidos por essa função são equivalentes aos do summary. Por que?

Anova(ajuste2) Com as variáveis inseridas em ordem diferente… Mesmo resultado.

Agora, vamos usar o teste F para testar a hipótese de nulidade conjunta H0:Beta(Idade)=Beta(Estudo)=0. Esse teste permite verificar a contribuição ##conjunta das duas variáveis ao modelo.

ajuste3 armazena o modelo ajustado sob H0, ou seja, não incluindo as covariáveis para as quais estamos postulando que o correspondente parâmetro é nulo.

## Analysis of Variance Table
## 
## Model 1: Venda ~ Populacao + Tempo
## Model 2: Venda ~ Tempo + Idade + Estudo + Populacao
##   Res.Df       RSS Df Sum of Sq    F Pr(>F)
## 1    197 720103307                         
## 2    195 709703391  2  10399916 1.43   0.24

Repare que a extra-soma de quadrados (10399916, com 2 graus de liberdade) não é significativa (p=0,2421), o que pode justificar a exclusão das duas covariáveis (Estudo e Idade) do modelo.

O teste é obtido por (ASQ/2)/QMRes, sendo QMRes=3639505 extraída do modelo ajustado com mais parâmetros.

Nota: Ao observar que duas covariáveis não são marginalmente significativas no ajuste de um modelo, isso não implica que elas sejam não significativas conjuntamente. A não significância conjunta deve ser testada com base no teste F da extra-soma de quadrados.

Agora, vamos explorar o efeito das covariáveis usando gráficos.

Cada gráfico apresenta a estimativa do total de vendas (e bandas de confiança 95%) para os valores de uma variável (representados no eixo horizontal) fixando as demais variáveis na média.

Diagnóstico - primeiramente vamos extrair os diferentes tipos de resíduos.

Resíduos ordinários.

##        1        2        3        4        5        6        7        8 
##  1169.56  -629.76  -325.39 -3108.15   352.55  1638.99 -2963.68 -2190.74 
##        9       10 
##  1999.96 -2003.70

Extraindo (a raiz do) quadrado médio de resíduos produzido pelo ajuste.

##        1        2        3        4        5        6        7        8 
##  0.61306 -0.33011 -0.17056 -1.62922  0.18480  0.85912 -1.55350 -1.14834 
##        9       10 
##  1.04834 -1.05030

Resíduos padronizados.

##        1        2        3        4        5        6        7        8 
##  0.62348 -0.33627 -0.17283 -1.64473  0.18894  0.88527 -1.57054 -1.15854 
##        9       10 
##  1.05582 -1.06069

Resíduos studentizados (internamente).

##        1        2        3        4        5        6        7        8 
##  0.62250 -0.33550 -0.17240 -1.65201  0.18847  0.88478 -1.57651 -1.15956 
##        9       10 
##  1.05613 -1.06103

Resíduos studentizados (externamente).

Veja a documentação da função rstudent para relembrar a diferença desses dois tipos de resíduos.

Repare que há pouca diferença nos valores dos dois tipos de resíduos.

Daqui por diante, vamos usar apenas os resíduos studentizados internamente.

Conjunto de gráficos de diagnóstico padrão do R. O gráfico do canto superior esquerdo é de resíduos ordinários versus valores ajustados. Repare que os resíduos estão dispersos aleatoriamente, sem valores extremos ou padrões não aleatórios. Vamos fazer um gráfico semelhante, mas baseado nos resíduos studentizados:

## integer(0)

A observação com resíduo superior a 3 está na linha 195. Vamos avaliá-la:

##     Tempo Idade Estudo Populacao Venda
## 195    14    44     14     11995 20775
##      Tempo           Idade          Estudo        Populacao    
##  Min.   : 0.00   Min.   :23.0   Min.   : 4.00   Min.   :  128  
##  1st Qu.: 7.00   1st Qu.:35.0   1st Qu.: 6.00   1st Qu.: 7595  
##  Median :10.00   Median :40.0   Median : 8.00   Median :10399  
##  Mean   : 9.85   Mean   :39.6   Mean   : 8.65   Mean   :10143  
##  3rd Qu.:13.00   3rd Qu.:44.0   3rd Qu.:11.00   3rd Qu.:12618  
##  Max.   :20.00   Max.   :57.0   Max.   :17.00   Max.   :21203  
##      Venda      
##  Min.   : 4008  
##  1st Qu.:10508  
##  Median :12708  
##  Mean   :12597  
##  3rd Qu.:14584  
##  Max.   :20775

Essa é a vendedora com maior total em vendas. Repare que, embora ela tenha 14 anos de experiência em vendas, atende uma Populacao pequena, de tamanho 11995. Logo, seu desempenho real foi bem superior ao esperado.

Voltando aos gráficos do R. O gráfico do canto superior direito é o gráfico probabilístico normal. Repare um leve afastamento da distribuição normal à esquerda (para valores negativos). Isso não é preocupante, mas vamos fazer um teste para checar a suposição de normalidade.

## 
##  Shapiro-Wilk normality test
## 
## data:  r1
## W = 0.993, p-value = 0.45

A hipótese nula do teste de Shapiro-Wilks é a hipótese de normalidade. Repare que não se tem evidência significativa contra essa hipótese. Logo, a normalidade dos resíduos está verificada.

O gráfico do canto inferior esquerdo é o gráfico da raiz quadrada dos resíduos studentizados (em módulo) versus valores ajustados. Serve para avaliar a suposição de variância constante (dentre outros).

Não há indícios de heterocedasticidade (variância não constante). Repare que no gráfico são assinalados os maiores resíduos, o que já havíamos identificado anteriormente.

Podemos usar o teste de Breusch-Pagan para testar a hipótese de variância constante para os erros. A hipótese nula é a de variância constante e o teste baseia-se na distribuição qui-quadrado. Pode-se testar a homogeneidade de variâncias quanto à média ou a algum termo específico do modelo.

No R - função ncvTest, pacote car.

## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 0.26254, Df = 1, p = 0.608

Não há evidência de que a variância dos erros varie conforme a média (p=0,608)

## Non-constant Variance Score Test 
## Variance formula: ~ Populacao 
## Chisquare = 0.33124, Df = 1, p = 0.565

Não há evidência de que a variância dos erros varie conforme o tamanho da Populacao atendida (p=0,564)

Falaremos sobre o gráfico do canto inferior direito mais adiante. Vamos construir mais alguns gráficos.

## [1] 170 195

Gráfico quantil-quantil dos resíduos studentizados vs quantis teóricos da distribuição t-Student com envelopes simulados. Nesse tipo de gráfico, espera-se que os pontos, que correspondem aos resíduos, estejam dispersos em torno da reta identidade, entre os limites do envelope. Nota-se um pequeno afastamento na cauda inferior, com um ponto externo ao envelope.

Gráfico de resíduos versus variável adicionada no modelo.

A ausência de padrões nos dois gráficos indica que não há a necessidade de considerar a inclusão dessas variáveis ao modelo em alguma outra escala.

Gráfico de resíduos versus variáveis não inseridas ao modelo.

Ajustando o modelo sem o efeito de Populacao.

A relação linear entre resíduos e Populacao atendida indica a necessidade da inclusão dessa variável ao modelo. Adicionalmente, indica o efeito linear dessa variável no total de vendas.

Ajustando o modelo sem o efeito de estudo.

A ausência de relação entre os resíduos e anos de estudo fornece evidencia
de não ser necessária a inclusão dessa variável ao modelo.

Os gráficos de resíduos parciais indicam a relação entre resíduos parciais e as variáveis “anos de estudo” e “Populacao atendida”. Aparentemente, as relações são lineares, indicando a forma como as variáveis devem ser inseridas no modelo.

Agora, vamos calcular medidas de influência com o objetivo de identificar possíveis outliers.

matinf armazena os valores de diversas medidas de influência vistas em aula, como DFBETAs, DFFIT, leverage.

## Potentially influential observations of
##   lm(formula = Venda ~ ., data = vendas) :
## 
##     dfb.1_ dfb.Temp dfb.Idad dfb.Estd dfb.Pplc dffit cov.r   cook.d
## 27   0.02   0.04    -0.04     0.02     0.00     0.06  1.08_*  0.00 
## 66  -0.01   0.00     0.00    -0.01     0.01     0.01  1.08_*  0.00 
## 69  -0.01   0.00     0.00     0.00     0.01     0.01  1.11_*  0.00 
## 74   0.28   0.12    -0.33     0.20    -0.17     0.45  0.91_*  0.04 
## 82  -0.04  -0.27     0.09     0.13    -0.03    -0.32  0.91_*  0.02 
## 89  -0.09  -0.01     0.06     0.03     0.07     0.11  1.08_*  0.00 
## 136  0.00   0.01    -0.02     0.01     0.01    -0.03  1.08_*  0.00 
## 143  0.00  -0.01     0.01    -0.01     0.01    -0.02  1.08_*  0.00 
## 170  0.09  -0.18     0.06    -0.17     0.10     0.39  0.89_*  0.03 
## 173  0.03   0.02     0.00    -0.03    -0.05     0.06  1.08_*  0.00 
## 195 -0.21   0.05     0.01     0.32     0.14     0.47  0.81_*  0.04 
##     hat    
## 27   0.05  
## 66   0.05  
## 69   0.08_*
## 74   0.03  
## 82   0.02  
## 89   0.06  
## 136  0.05  
## 143  0.05  
## 170  0.02  
## 173  0.05  
## 195  0.02

Aplicando o summary, o R destaca as observações com valores que ultrapassam o ponto de corte para ao menos uma das medidas. Repare que exceto uma das observações destacadas, todas as demais tem valor acima do ponto de corte para a estatística COVRATIO. Repare que a observação que produz menor valor do COVRATIO é a 195 que, se você lembrar, é a vendedora com maior total de vendas (volte alguns códigos atrás).

A observação 69 é marcada como tendo elevado leverage, configurando um ponto de alavancagem. Vamos ver quem é ela.

##      Tempo           Idade          Estudo        Populacao    
##  Min.   : 0.00   Min.   :23.0   Min.   : 4.00   Min.   :  128  
##  1st Qu.: 7.00   1st Qu.:35.0   1st Qu.: 6.00   1st Qu.: 7595  
##  Median :10.00   Median :40.0   Median : 8.00   Median :10399  
##  Mean   : 9.85   Mean   :39.6   Mean   : 8.65   Mean   :10143  
##  3rd Qu.:13.00   3rd Qu.:44.0   3rd Qu.:11.00   3rd Qu.:12618  
##  Max.   :20.00   Max.   :57.0   Max.   :17.00   Max.   :21203  
##      Venda      
##  Min.   : 4008  
##  1st Qu.:10508  
##  Median :12708  
##  Mean   :12597  
##  3rd Qu.:14584  
##  Max.   :20775
##    Tempo Idade Estudo Populacao Venda
## 69    11    53      6     21203 19867

Repare que essa vendedora atende à região com maior Populacao. Adicionalmente, é uma das vendedoras com maior idade e com menor tempo de estudo.

Vamos verificar o impacto (conjunto) das observações 69 e 195 no modelo, ajustando um novo modelo sem essas observações.

A função update permite o ajuste de um novo modelo, atualizando o anterior. Repare que a atualização corresponde a definição de um subconjunto dos dados.

## Calls:
## 1: lm(formula = Venda ~ ., data = vendas)
## 2: lm(formula = Venda ~ ., data = vendas, subset = -c(69, 195))
## 
##             Model 1 Model 2
## (Intercept)    3204    3396
## SE              901     901
##                            
## Tempo         174.4   172.6
## SE             40.9    40.1
##                            
## Idade          18.0    17.5
## SE             22.4    22.2
##                            
## Estudo         67.8    52.8
## SE             48.0    47.4
##                            
## Populacao    0.6286  0.6232
## SE           0.0373  0.0374
## 

A função compareCoefs, do pacote car, dispõe lado a lado as estimativas e erros padrões de dois modelos. Repare que a alteração mais substancial nos dois ajustes se refere à estimativa do efeito de ajuste (de 67,8 para 52,8). No entanto, nos dois ajustes o efeito de anos de estudo é não significativo. Portanto, as conclusões para os dois modelos são semelhantes.