Nie jestem pewien, co twój szef uważa za „bardziej przewidywalny”. Wiele osób błędnie uważa, że niższe wartości oznaczają lepszy / bardziej przewidywalny model. To niekoniecznie jest prawdą (jest to przypadek). Jednak wcześniejsze samodzielne sortowanie obu zmiennych zagwarantuje niższą wartość . Z drugiej strony możemy ocenić dokładność predykcyjną modelu, porównując jego prognozy z nowymi danymi wygenerowanymi przez ten sam proces. Robię to poniżej w prostym przykładzie (zakodowanym ). 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"))
Górny lewy wykres pokazuje oryginalne dane. Istnieje pewna zależność między i (viz., Korelacja wynosi około ). W prawym górnym fabuła pokazuje, co dane wyglądać po niezależnie sortowania obu zmiennych. Łatwo można zauważyć, że siła korelacji znacznie wzrosła (obecnie wynosi około ). Jednak na niższych wykresach widzimy, że rozkład błędów predykcyjnych jest znacznie bliższy dla modelu wyuczonego na oryginalnych (nieposortowanych) danych. Średni bezwzględny błąd predykcyjny dla modelu wykorzystującego oryginalne dane wynosi , podczas gdy średni bezwzględny błąd predykcyjny dla modelu wyuczonego na posortowanych danych wynosiY 0,31 0,99 0 1,1 1,98 R 68 %xy.31.9901.11.98- prawie dwa razy większy. Oznacza to, że prognozy posortowanego modelu danych są znacznie dalej od prawidłowych wartości. Wykres w prawym dolnym kwadrancie jest wykresem kropkowym. Wyświetla różnice między błędem predykcyjnym w przypadku danych oryginalnych i danych posortowanych. Umożliwia to porównanie dwóch odpowiednich prognoz dla każdej nowej symulowanej obserwacji. Niebieskie kropki po lewej to czasy, w których oryginalne dane były bliższe nowej wartości , a czerwone kropki po prawej to czasy, w których posortowane dane dały lepsze prognozy. Dokładniejsze prognozy z modelu przeszkolonego na oryginalnych danych czasu. y68%
Stopień, w jakim sortowanie spowoduje te problemy, jest funkcją zależności liniowej istniejącej w danych. Jeżeli zależność między a był już nie sortowanie nie ma to znaczenia, a więc są szkodliwe. Z drugiej strony, gdyby korelacja wynosiłay 1,0 - 1,0xy1.0−1.0, sortowanie całkowicie odwróciłoby związek, czyniąc model tak niedokładnym, jak to możliwe. Gdyby dane były pierwotnie całkowicie nieskorelowane, sortowanie miałoby pośredni, ale wciąż dość duży, szkodliwy wpływ na dokładność predykcyjną wynikowego modelu. Ponieważ wspominasz, że Twoje dane są zwykle skorelowane, podejrzewam, że zapewniło pewną ochronę przed szkodami nieodłącznie związanymi z tą procedurą. Niemniej jednak sortowanie jako pierwsze jest zdecydowanie szkodliwe. Aby zbadać te możliwości, możemy po prostu ponownie uruchomić powyższy kod z różnymi wartościami dla B1
(używając tego samego materiału źródłowego dla odtwarzalności) i zbadać dane wyjściowe:
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