y<-vendas_casa$preco_mindice_teste<-createDataPartition(y, times =1, p =0.2, list =FALSE)conj_treino<-vendas_casa[-indice_teste,]conj_teste<-vendas_casa[indice_teste,]str(conj_treino)
library(psych)pairs.panels(conj_treino, method ="pearson", # metodo de correlação hist.col ="#00AFBB", density =TRUE, # mostra graficos de densidade ellipses =FALSE# mostra elipses de correlação)
Métodos de seleção de modelo
## Best Subset sem definir o número máx de subsets a ser avaliadoajusreg.comp<-regsubsets(preco_m~., data=conj_treino)summary(ajusreg.comp)
Na função regsubsets use adicionalmente os parametros nvmax, que define o número máximo de variáveis explicativas analisadas, e method, que define qual método de seleção de variáveis deverá ser usado.
## Os modelos vão ser escolhidos com base no menor Cpplot(sumario.reg$cp,xlab="Número de Variáveis",ylab="Cp")points(which.min(sumario.reg$cp),sumario.reg$cp[which.min(sumario.reg$cp)],pch=20,col="red")
plot(sumario.reg.fwd$cp,xlab="Número de Variáveis",ylab="Cp")points(which.min(sumario.reg.fwd$cp),sumario.reg.fwd$cp[which.min(sumario.reg.fwd$cp)],pch=20,col="red")
plot(sumario.reg$bic,xlab="Número de Variáveis",ylab="BIC")points(which.min(sumario.reg$bic),sumario.reg$bic[which.min(sumario.reg$bic)],pch=20,col="red")
## Usando o lm para ajustar o modelo com as variáveis selecionadas pelo BICmod_bic<-lm(preco_m~idade+quartos+m2_princ+andares, data=conj_treino)summary(mod_bic)
Em termos de ajuste praticamente não há diferença nos resultados, sendo que o modelo obtido usando o BIC é bem mais enxuto. A parcimoniosidade é sempre bem vinda, mas é necessário ver como ficam os resultados com o conjunto de testes.
Avaliando Colinearidade
Uma investigação minuciosa da multicollinearidade envolverá a análise do valor do \(R^2\) que resulta da regressão de cada uma das variáveis explicativas contra todas as outras. A relação entre as variáveis explicativas pode ser julgada examinando uma quantidade chamada fator de inflacionário da variância (FIV) ou Variance Inflation Factor (VIF). Seja \(Rj~^{2}\) o quadrado do coeficiente de correlação múltipla que resulta quando a variável explicativa \(Xj~\) é ajustada contra todas as outras variáveis explicativas. Então o vif para \(Xj~\) é \(VIFj = 1 / (1-Rj~^{2})\)
A regra geral é que vifs superiores a 4 justificam novas investigações, enquanto VIFs superiores a 10 são sinais de multicollinearidade grave que requerem correção.
## Erro com conjunto de testesqrt(mean((conj_teste$preco_m-predict(mod_bic, conj_teste))^2))
#> [1] 41.56818
Aqui vemos que as diferença de resultados entre os dois modelos é muito pequena, mas o modelo com base no BIC é mais parcimonioso, então vamos usá-lo para fazer a previsão.
Comparando valor real vs previsão (conjunto de treino)
conj_treino$Previsoes<-predict(mod_bic, conj_treino)ggplot(conj_treino, aes(x=Previsoes, y=preco_m))+geom_point()+geom_abline(color ="darkblue")+ggtitle("Preço da Casa vs. Previsões do modelo linear")
O modelo está tendendo dar previsões mais altas nas casas com menor preço e previsões mais baixas nas casas com maior preço. Tem duas previsões estão mais afastadas da reta Y = X. Vamos identificar estes pontos.
conj_treino$Previsoes<-predict(mod_bic, conj_treino)ggplot(conj_treino, aes(x=Previsoes, y=preco_m))+geom_point()+geom_abline(color ="darkblue")+ggtitle("Preço da Casa vs. Previsões do modelo linear")+geom_text(aes(label=ifelse(Previsoes>670, rownames(conj_treino), '')), hjust=0, vjust=-0.5)
Comparando valor real vs previsão (conjunto de teste)
conj_teste$Previsoes<-predict(mod_bic, conj_teste)ggplot(conj_teste, aes(x=Previsoes, y=preco_m))+geom_point()+geom_abline(color ="darkblue")+ggtitle("Preço da Casa vs. Previsões do modelo linear")