Я не впевнений, що ваш начальник вважає "більш передбачувальним". Багато людей неправильно вважають, що більш низькі значення означають кращу / більш прогнозовану модель. Це не обов'язково правда (це вже справа). Однак незалежне сортування обох змінних заздалегідь гарантуватиме нижчу величину. З іншого боку, ми можемо оцінити прогностичну точність моделі, порівнявши її прогнози з новими даними, що були сформовані тим самим процесом. Я роблю це нижче на простому прикладі (закодовано ). рppR
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"))
Лівий верхній графік показує вихідні дані. Існує деяка залежність між і (а саме, кореляція становить приблизно .) Правий верхній графік показує, як виглядають дані після незалежного сортування обох змінних. Можна легко побачити, що сила кореляції значно зросла (зараз це приблизно ). Однак на нижніх графіках ми бачимо, що розподіл помилок прогнозування набагато ближче до для моделі, навченої за вихідними (несортованими) даними. Середня абсолютна помилка прогнозування для моделі, яка використовувала вихідні дані, становить , тоді як середня абсолютна помилка прогнозування для моделі, тренуваної на відсортованих даних, становитьy .31 .99 0 1.1 1.98 y 68 %ху.31.9901.11.98—Порожньо вдвічі більше. Це означає, що передбачення моделі відсортованої моделі даних значно відрізняються від правильних значень. Сюжет у правому нижньому квадранті - це крапка. Він відображає відмінності між помилкою прогнозування з вихідними даними та з відсортованими даними. Це дозволяє порівняти два відповідних прогнози для кожного модельованого нового спостереження. Сині точки зліва - це часи, коли вихідні дані були ближче до нового значення , а червоні точки праворуч - це часи, коли відсортовані дані давали кращі прогнози. Були більш точні прогнози моделі, яка навчалася за вихідними даними часу. у68 %
Ступінь сортування спричинить ці проблеми - це функція лінійної залежності, яка існує у ваших даних. Якби кореляція між і вже становила , сортування не матиме ефекту і, таким чином, не буде згубним. З іншого боку, якби кореляція булаy 1,0 - 1,0ху1,0- 1,0, сортування повністю змінило б взаємозв'язок, зробивши модель максимально неточною. Якби дані були спочатку непов'язаними, сортування мало б проміжний, але все ще досить великий, шкідливий вплив на прогнозовану точність отриманої моделі. Оскільки ви згадуєте, що ваші дані, як правило, співвідносяться, я підозрюю, що це забезпечило певний захист від шкоди, властивої цій процедурі. Тим не менш, сортування спочатку, безумовно, шкідливо. Щоб вивчити ці можливості, ми можемо просто запустити вищезазначений код з різними значеннями для B1
(використовуючи одне і те ж насіння для відтворюваності) та вивчити вихід:
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