Я не уверен, что твой босс считает «более предсказательным». Многие люди ошибочно полагают, что более низкие значения означают лучшую / более прогнозирующую модель. Это не обязательно верно (это является показательным примером). Однако независимая предварительная сортировка обеих переменных гарантирует более низкое значение . С другой стороны, мы можем оценить прогнозирующую точность модели, сравнивая ее прогнозы с новыми данными, которые были сгенерированы тем же процессом. Я делаю это ниже в простом примере (закодирован ). рппR
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"))
Верхний левый график показывает исходные данные. Существует некоторая взаимосвязь между и (то есть корреляция составляет около .) Верхний правый график показывает, как выглядят данные после независимой сортировки обеих переменных. Вы можете легко увидеть, что сила корреляции существенно возросла (сейчас она составляет около ). Однако на нижних графиках мы видим, что распределение прогнозирующих ошибок намного ближе к для модели, обученной на исходных (несортированных) данных. Средняя абсолютная прогностическая ошибка для модели, в которой использовались исходные данные, составляет , тогда как средняя абсолютная прогностическая ошибка для модели, обученной на отсортированных данных, составляету .31 0,99 0 1,1 1,98 у 68 %ИксY0,31+0,9901,11,98- почти вдвое больше. Это означает, что прогнозы отсортированной модели данных намного дальше от правильных значений. График в правом нижнем квадранте является точечным. Он отображает различия между прогнозирующей ошибкой с исходными данными и с отсортированными данными. Это позволяет сравнивать два соответствующих прогноза для каждого нового смоделированного наблюдения. Синие точки слева - это времена, когда исходные данные были ближе к новому значению , а красные точки справа - времена, когда отсортированные данные давали лучшие прогнозы. Существовали более точные прогнозы по модели, обученной по исходным данным в случаев. Y68 %
Степень, в которой сортировка вызовет эти проблемы, является функцией линейных отношений, существующих в ваших данных. Если корреляция между и были уже, сортировка не будет иметь никакого эффекта и , следовательно , не может быть вредным. С другой стороны, если корреляция былау 1,0 - 1,0ИксY1,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