Je ne suis pas sûr de ce que votre patron pense par "plus prédictif". Beaucoup de gens croient à tort que des valeurs plus basses signifient un modèle mieux / plus prédictif. Ce n'est pas nécessairement vrai (ceci étant un exemple). Cependant, un tri indépendant préalable des deux variables garantira une valeur inférieure . D'autre part, nous pouvons évaluer la précision prédictive d'un modèle en comparant ses prévisions aux nouvelles données générées par le même processus. Je fais cela ci-dessous dans un exemple simple (codé avec ). 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"))
Le graphique en haut à gauche montre les données d'origine. Il existe une relation entre et (à savoir, la corrélation est d'environ ). Le graphique en haut à droite montre à quoi ressemblent les données après avoir trié indépendamment les deux variables. Vous pouvez facilement voir que la force de la corrélation a considérablement augmenté (elle est maintenant d'environ ). Cependant, dans les graphiques inférieurs, nous voyons que la distribution des erreurs prédictives est beaucoup plus proche de pour le modèle formé sur les données d'origine (non triées). L'erreur prédictive absolue moyenne pour le modèle qui a utilisé les données d'origine est de , tandis que l'erreur prédictive absolue moyenne pour le modèle formé sur les données triées est dey .31 .99 0 1.1 1.98 y 68 %Xy.319901.11,98... presque deux fois plus gros. Cela signifie que les prédictions du modèle de données triées sont beaucoup plus éloignées des valeurs correctes. Le graphique du quadrant inférieur droit est un graphique en points. Il affiche les différences entre l'erreur prédictive avec les données d'origine et avec les données triées. Cela vous permet de comparer les deux prédictions correspondantes pour chaque nouvelle observation simulée. Les points bleus à gauche sont les moments où les données d'origine étaient plus proches de la nouvelle valeur , et les points rouges à droite, les moments où les données triées ont produit de meilleures prévisions. Il y avait des prévisions plus précises à partir du modèle formé sur les données d'origine du temps. y68%
Le degré auquel le tri causera ces problèmes dépend de la relation linéaire qui existe dans vos données. Si la corrélation entre et était déjà , le tri n'aurait aucun effet et ne serait donc pas préjudiciable. Par contre, si la corrélation étaity 1,0 - 1,0xy1,0- 1,0, le tri renverserait complètement la relation, rendant le modèle aussi inexact que possible. Si les données étaient complètement non corrélées à l'origine, le tri aurait un effet néfaste intermédiaire, mais néanmoins assez important, sur la précision prédictive du modèle obtenu. Étant donné que vous indiquez que vos données sont généralement corrélées, je suppose que cela a fourni une certaine protection contre les inconvénients inhérents à cette procédure. Néanmoins, le tri en premier lieu est définitivement dangereux. Pour explorer ces possibilités, nous pouvons simplement réexécuter le code ci-dessus avec différentes valeurs pour B1
(en utilisant la même graine pour la reproductibilité) et examiner le résultat:
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