Ich bin mir nicht sicher, was Ihr Chef unter "prädiktiver" versteht. Viele Menschen glauben fälschlicherweise , dass niedrigere Werte ein besseres / prädiktiveres Modell bedeuten. Das ist nicht unbedingt wahr (dies ist ein typisches Beispiel). Das unabhängige Sortieren beider Variablen im Voraus garantiert jedoch einen niedrigeren Wert. Auf der anderen Seite können wir die Vorhersagegenauigkeit eines Modells beurteilen, indem wir seine Vorhersagen mit neuen Daten vergleichen, die durch denselben Prozess generiert wurden. Ich mache das unten in einem einfachen Beispiel (mit ). 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"))
Das Diagramm oben links zeigt die Originaldaten. Es gibt eine gewisse Beziehung zwischen und (die Korrelation beträgt nämlich etwa ). Das Diagramm oben rechts zeigt, wie die Daten aussehen, nachdem beide Variablen unabhängig voneinander sortiert wurden. Sie können leicht erkennen, dass die Stärke der Korrelation erheblich zugenommen hat (sie liegt jetzt bei ). In den unteren Darstellungen sehen wir jedoch, dass die Verteilung der Vorhersagefehler für das auf den ursprünglichen (unsortierten) Daten trainierte Modell viel näher bei . Der mittlere absolute Vorhersagefehler für das Modell, das die Originaldaten verwendet hat, beträgt , während der mittlere absolute Vorhersagefehler für das auf den sortierten Daten trainierte Modell beträgty .31 .99 0 1.1 1.98 y 68 %Xy.31.9901.11,98- fast doppelt so groß. Dies bedeutet, dass die Vorhersagen des sortierten Datenmodells viel weiter von den korrekten Werten entfernt sind. Das Diagramm im unteren rechten Quadranten ist ein Punktdiagramm. Es zeigt die Unterschiede zwischen dem Vorhersagefehler mit den Originaldaten und den sortierten Daten an. Auf diese Weise können Sie die beiden entsprechenden Vorhersagen für jede neue simulierte Beobachtung vergleichen. Blaue Punkte links sind Zeiten, in denen die ursprünglichen Daten näher am neuen Wert lagen , und rote Punkte rechts sind Zeiten, in denen die sortierten Daten bessere Vorhersagen lieferten. In der Fälle gab es genauere Vorhersagen aus dem Modell, die auf den ursprünglichen Daten beruhten . y68 %
Inwieweit das Sortieren diese Probleme verursacht, hängt von der linearen Beziehung ab, die in Ihren Daten besteht. Wenn die Korrelation zwischen und bereits wäre, hätte die Sortierung keine Auswirkung und wäre daher nicht schädlich. Wenn andererseits die Korrelationy 1,0 - 1,0Xy1,0- 1,0würde die Sortierung die Beziehung vollständig umkehren und das Modell so ungenau wie möglich machen. Wenn die Daten ursprünglich vollständig unkorreliert wären, hätte die Sortierung eine mittlere, aber immer noch ziemlich große nachteilige Auswirkung auf die Vorhersagegenauigkeit des resultierenden Modells. Da Sie erwähnen, dass Ihre Daten normalerweise korreliert sind, habe ich den Verdacht, dass dies einen gewissen Schutz gegen die mit diesem Verfahren verbundenen Schäden bietet. Trotzdem ist es definitiv schädlich, zuerst zu sortieren. Um diese Möglichkeiten zu erkunden, können wir einfach den obigen Code mit unterschiedlichen Werten für B1
(unter Verwendung des gleichen Startwerts für die Reproduzierbarkeit) erneut ausführen und die Ausgabe untersuchen:
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