Porque deve-se plotar os valores ajustados no eixo das abscissas!

Depois de ler este post eu fiquei impressionado como a imensa maioria dos software comerciais de Engenharia de Avaliações erram ao plotar o chamado gráfico de aderência, ou gráfico do poder de predição. Não vou dizer todos porque erram porque seria displicência minha, mas não me recordo de ter visto nenhum software que tenha o gráfico de aderência com os valores estimados no eixo das abscissas.

Todos sabemos que a NBR exige que seja apresentado em um laudo de avaliação o gráfico de preços observados versus valores estimados pelo modelo, o que alguns chamam de gráfico de poder de predição e outros de gráfico de aderência do modelo.

O que ninguém sabe é que a NBR 14.653-02, erroneamente, especifica que este gráfico deve ser elaborado com o valor dos preços observados na abscissa versus valores estimados pelo modelo na ordenada (item 8.2.1.4.1, p.15).

Eu mesmo, que não faço uso de nenhum destes software comerciais no dia a dia, já que faço uso do R, cometi este erro recentemente, no artigo em que publicamos no XX COBREAP sobre a centralização de dados amostrais. Este foi o gráfico que publicamos, no qual acrescentei a reta de regressão (em azul) entre os valores ajustados e os valores observados (a reta em vermelho é a bissetriz):

power_plot_NBR(fit)
Gráfico publicado, elaborado conforme a NBR 14.653-02.

Figure 1: Gráfico publicado, elaborado conforme a NBR 14.653-02.

E este seria o gráfico correto:

library(appraiseR)
power_plot(fit)
Este seria o gráfico correto.

Figure 2: Este seria o gráfico correto.

Obviamente que o meu erro foi o mesmo erro dos programadores dos software comerciais: reproduzir sem pensar os gráficos que a gente vê no dia a dia da nossa prática da Engenharia de Avaliações, seguindo cegamente o que diz a NBR 14.653-02.

Vou tentar com este post deixar bem claro para a comunidade de avaliadores o motivo pelo qual os gráficos de aderência ou poder de predição atuais estão errados.

Modelo nulo

Para isto, primeiramente, vamos construir um modelo nulo. Um model nulo é um modelo onde a hipótese nula sobre os coeficientes dos regressores, ou seja, a hipótese que desejamos negar, é verdadeira, e o modelo de regressão abaixo:

\[Y = \alpha + \beta X + \epsilon\]

Se degenera no seguinte modelo, dito nulo:

\[Y = \alpha + \epsilon\] Em outras palavras, o modelo nulo é o da média simples da variável dependente, de tal maneira que os valores ajustados por este modelo terão sempre o mesmo valor, igual à média aritmética da variável.

Por exemplo, imaginem que foram observados 100 dados de lotes urbanos, com valores de área total (\(X\)) e valor unitário (\(Y\)), não chegando-se a nenhuma correlação entre X e Y. A melhor forma de se estimar \(Y\), portanto, seria através da simples média dos valores unitários (\(\bar Y\)).

set.seed(9)
Y <- rnorm(100, mean = 2500, sd = 200)
X <- rnorm(100, mean = 500, sd = 100)
plot(Y ~ X)
abline(lm(Y~X), col = "red")
Dados com correlação baixíssima.

Figure 3: Dados com correlação baixíssima.

Podemos calcular os resíduos de um modelo nulo e plotá-los em função dos valores ajustados, obtendo o seguinte gráfico:

fit1 <- lm(Y~1)
plot(fit1, which = 1)
Gráfico dos resíduos vs. valores ajustados

Figure 4: Gráfico dos resíduos vs. valores ajustados

Observa-se que, grosso modo, os resíduos são independentes e são identicamente distribuídos em torno do seu valor médio, que é igual a zero, como era de se esperar.

Se, no entanto, alguém optar por plotar os resíduos contra os valores observados, esta pessoa deduzirá erroneamente um padrão de alta nos resíduos, o que na verdade não ocorre na prática. Na realidade, como os valores observados foram colocados em ordem para a plotagem, a aparência é que há uma tendenciosidade.

plot(fit1$residuals ~ Y)
abline(h = 0, lty = 3, col = "grey")

Imagine-se agora que tenhamos um modelo com 100 dados de lotes de terrenos urbanos mostrando grande correlação (negativa) entre os valores unitários dos lotes e os valores de área. Os dados foram criados randômicamente no R, através do seguinte código:

set.seed(100)
X <- rnorm(100, mean = 500, sd = 100)
Y = 10000 -5*X + rnorm(100, mean = 0, sd = 250)
fit <- lm(Y~X)
plot(Y~X)
abline(lm(Y~X), col = "red")
Dados com correlação negativa.

Figure 5: Dados com correlação negativa.

O gráfico correto para a análise dos resíduos é (fornecido pelo próprio R):

plot(fit, which = 1)
Gráficos dos resíduos correto.

Figure 6: Gráficos dos resíduos correto.

A maneira errônea de se analisar os resíduos, ou seja, contra os valores observados, nem está disponível no R – que é um software estatístico produzido por estatísticos, portanto com os conceitos corretos–, mas podemos criar este gráfico através do seguinte código:

plot(fit$residuals ~ Y)
abline(h = 0, lty = 3, col = "grey")
abline(lm(fit$residuals ~ Y), col = "red")
Gráfico dos resíduos incorreto.

Figure 7: Gráfico dos resíduos incorreto.

Pode parecer que há uma tendência dos valores mais baixos terem resíduos negativos enquanto os valores mais altos tem valores positivos.

hist(rstandard(fit))
Histograma dos resíduos padronizados.

Figure 8: Histograma dos resíduos padronizados.

Mas, na verdade, não há nada de errado com o modelo. Os resíduos são absolutamente normais, com média zero, como mostra o histograma dos resíduos padronizados.

E o mesmo é válido para o gráfico de aderência.

Se plotarmos o gráfico de aderência corretamente, vemos que a linha de regressão entre os valores observados e os valores ajustados tem coeficiente angular muito próximo de 1 – a reta de regressão (em azul), se superpõe à bissetriz (em vermelho).

par(pty="s")
plot(Y ~ fit$fitted.values)
abline(a = 0, b = 1, col = "red")
abline(lm(Y ~ fit$fitted.values), col = "blue", lwd = 2)
Gráfico de aderência correto.

Figure 9: Gráfico de aderência correto.

Porém, se construirmos o gráfico de aderência incorretamente, como manda a nossa NBR 14.653-02, teremos o seguinte gráfico de aderência, o que mostra uma suposta estrutura ausente no modelo, o que não é verdade.

par(pty="s")
plot(fit$fitted.values ~ Y)
abline(a = 0, b = 1, col = "red")
abline(lm(fit$fitted.values~Y), col = "blue", lwd = 2)
Gráfico de aderência incorreto.

Figure 10: Gráfico de aderência incorreto.

Dados criados para ilustrar melhor o fenômeno

Criei os dados abaixo especificamente para melhor entendimento:

X <- c(0, 0.5, 1, 1, 1.5, 1, 2, 2, 2, 2, 2, 2.5, 3, 3, 3, 3.5, 4, 4, 4, 4, 4, 4.5, 5, 5, 5, 5.5, 6, 6, 6, 6, 6, 6.5, 7, 7, 7, 7.5)
Y <- c(0, 0.5, 0, 1, 1.5, 2, 0, 1, 2, 3, 4, 2.5, 2, 3, 4, 3.5, 2, 3, 4, 5, 6, 4.5, 4, 5, 6, 5.5, 4, 5, 6, 7, 8, 6.5, 6, 7, 8, 7.5)
fit <- lm(Y ~ X)
par(pty="s")
plot(Y ~ X, xlim = c(0,8), ylim = c(0,8))
abline(fit, col = "red")

plot(fit, which = 1)

plot(fit$residuals ~ Y)
abline(h = 0, lty = 3, col = "grey")
abline(lm(fit$residuals ~ Y), col = "red")

par(pty="s")
plot(Y ~ fit$fitted.values, xlim = c(0, 8))
abline(a = 0, b = 1, col = "red")
abline(lm(Y ~ fit$fitted.values), col = "blue", lwd = 2)
Gráfico de aderência correto.

Figure 11: Gráfico de aderência correto.

par(pty="s")
plot(fit$fitted.values ~ Y, ylim = c(0,8))
abline(a = 0, b = 1, col = "red")
abline(lm(fit$fitted.values~Y), col = "blue", 2)
Gráfico de aderência incorreto.

Figure 12: Gráfico de aderência incorreto.

Avatar
Luiz F. P. Droubi
Mestrando no Programa de Pós-Graduação em Engenharia de Transportes e Gestão Territorial
comments powered by Disqus