Não sei ao certo o que seu chefe acha "mais preditivo". Muitas pessoas acreditam incorretamente que valores mais baixos de significam um modelo melhor / mais preditivo. Isso não é necessariamente verdade (sendo esse o caso). No entanto, classificar independentemente as duas variáveis de antemão garantirá um valor- menor . Por outro lado, podemos avaliar a precisão preditiva de um modelo comparando suas previsões com novos dados que foram gerados pelo mesmo processo. Eu faço isso abaixo em um exemplo simples (codificado com ). pppR
options(digits=3) # for cleaner output
set.seed(9149) # this makes the example exactly reproducible
B1 = .3
N = 50 # 50 data
x = rnorm(N, mean=0, sd=1) # standard normal X
y = 0 + B1*x + rnorm(N, mean=0, sd=1) # cor(x, y) = .31
sx = sort(x) # sorted independently
sy = sort(y)
cor(x,y) # [1] 0.309
cor(sx,sy) # [1] 0.993
model.u = lm(y~x)
model.s = lm(sy~sx)
summary(model.u)$coefficients
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 0.021 0.139 0.151 0.881
# x 0.340 0.151 2.251 0.029 # significant
summary(model.s)$coefficients
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 0.162 0.0168 9.68 7.37e-13
# sx 1.094 0.0183 59.86 9.31e-47 # wildly significant
u.error = vector(length=N) # these will hold the output
s.error = vector(length=N)
for(i in 1:N){
new.x = rnorm(1, mean=0, sd=1) # data generated in exactly the same way
new.y = 0 + B1*x + rnorm(N, mean=0, sd=1)
pred.u = predict(model.u, newdata=data.frame(x=new.x))
pred.s = predict(model.s, newdata=data.frame(x=new.x))
u.error[i] = abs(pred.u-new.y) # these are the absolute values of
s.error[i] = abs(pred.s-new.y) # the predictive errors
}; rm(i, new.x, new.y, pred.u, pred.s)
u.s = u.error-s.error # negative values means the original
# yielded more accurate predictions
mean(u.error) # [1] 1.1
mean(s.error) # [1] 1.98
mean(u.s<0) # [1] 0.68
windows()
layout(matrix(1:4, nrow=2, byrow=TRUE))
plot(x, y, main="Original data")
abline(model.u, col="blue")
plot(sx, sy, main="Sorted data")
abline(model.s, col="red")
h.u = hist(u.error, breaks=10, plot=FALSE)
h.s = hist(s.error, breaks=9, plot=FALSE)
plot(h.u, xlim=c(0,5), ylim=c(0,11), main="Histogram of prediction errors",
xlab="Magnitude of prediction error", col=rgb(0,0,1,1/2))
plot(h.s, col=rgb(1,0,0,1/4), add=TRUE)
legend("topright", legend=c("original","sorted"), pch=15,
col=c(rgb(0,0,1,1/2),rgb(1,0,0,1/4)))
dotchart(u.s, color=ifelse(u.s<0, "blue", "red"), lcolor="white",
main="Difference between predictive errors")
abline(v=0, col="gray")
legend("topright", legend=c("u better", "s better"), pch=1, col=c("blue","red"))
O gráfico superior esquerdo mostra os dados originais. Existe alguma relação entre e (ou seja, a correlação é de cerca de .) O gráfico superior direito mostra a aparência dos dados após a classificação independente de ambas as variáveis. Você pode ver facilmente que a força da correlação aumentou substancialmente (agora é de cerca de ). No entanto, nas parcelas mais baixas, vemos que a distribuição dos erros preditivos está muito mais próxima de para o modelo treinado nos dados originais (não classificados). O erro preditivo médio absoluto para o modelo que usou os dados originais é , enquanto o erro preditivo médio absoluto para o modelo treinado nos dados classificados éy 0,31 0,99 0 1,1 1,98 y 68 %xy.31.990 01.11,98Quase duas vezes maior. Isso significa que as previsões do modelo de dados classificados estão muito mais longe dos valores corretos. A plotagem no quadrante inferior direito é uma plotagem de pontos. Ele exibe as diferenças entre o erro preditivo com os dados originais e com os dados classificados. Isso permite comparar as duas previsões correspondentes para cada nova observação simulada. Pontos azuis à esquerda são momentos em que os dados originais estavam mais próximos do novo valor e pontos vermelhos à direita são momentos em que os dados classificados produziram melhores previsões. Havia previsões mais precisas do modelo treinado nos dados originais em do tempo. y68 %
O grau em que a classificação causará esses problemas é uma função do relacionamento linear que existe em seus dados. Se a correlação entre e já fosse , a classificação não teria efeito e, portanto, não seria prejudicial. Por outro lado, se a correlação fossey 1,0 - 1,0xy1.0- 1,0, a classificação reverteria completamente o relacionamento, tornando o modelo o mais impreciso possível. Se os dados fossem completamente não correlacionados originalmente, a classificação teria um efeito deletério intermediário, mas ainda bastante grande, na precisão preditiva do modelo resultante. Como você menciona que seus dados normalmente estão correlacionados, suspeito que tenha fornecido alguma proteção contra os danos intrínsecos a esse procedimento. No entanto, classificar primeiro é definitivamente prejudicial. Para explorar essas possibilidades, podemos simplesmente executar novamente o código acima com valores diferentes para B1
(usando a mesma semente para reprodutibilidade) e examinar a saída:
B1 = -5
:
cor(x,y) # [1] -0.978
summary(model.u)$coefficients[2,4] # [1] 1.6e-34 # (i.e., the p-value)
summary(model.s)$coefficients[2,4] # [1] 1.82e-42
mean(u.error) # [1] 7.27
mean(s.error) # [1] 15.4
mean(u.s<0) # [1] 0.98
B1 = 0
:
cor(x,y) # [1] 0.0385
summary(model.u)$coefficients[2,4] # [1] 0.791
summary(model.s)$coefficients[2,4] # [1] 4.42e-36
mean(u.error) # [1] 0.908
mean(s.error) # [1] 2.12
mean(u.s<0) # [1] 0.82
B1 = 5
:
cor(x,y) # [1] 0.979
summary(model.u)$coefficients[2,4] # [1] 7.62e-35
summary(model.s)$coefficients[2,4] # [1] 3e-49
mean(u.error) # [1] 7.55
mean(s.error) # [1] 6.33
mean(u.s<0) # [1] 0.44