No estoy seguro de lo que su jefe piensa que significa "más predictivo". Muchas personas creen incorrectamente que los valores más bajos significan un modelo mejor / más predictivo. Eso no es necesariamente cierto (siendo este el caso). Sin embargo, la clasificación independiente de ambas variables de antemano garantizará un valor más bajo . Por otro lado, podemos evaluar la precisión predictiva de un modelo comparando sus predicciones con los nuevos datos generados por el mismo proceso. Lo hago a continuación en un ejemplo simple (codificado con ). ppagspagsR
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"))
La gráfica superior izquierda muestra los datos originales. Existe alguna relación entre e (es decir, la correlación es de alrededor de .) La gráfica superior derecha muestra cómo se ven los datos después de ordenar de forma independiente ambas variables. Puede ver fácilmente que la fuerza de la correlación ha aumentado sustancialmente (ahora es de aproximadamente ). Sin embargo, en las parcelas inferiores, vemos que la distribución de los errores predictivos está mucho más cerca de para el modelo entrenado en los datos originales (sin clasificar). El error predictivo absoluto medio para el modelo que utilizó los datos originales es , mientras que el error predictivo absoluto medio para el modelo entrenado en los datos ordenados esy .31 .99 0 1.1 1.98 y 68 %Xy.31.990 01.11.98—Casi dos veces más grande. Eso significa que las predicciones del modelo de datos ordenados están mucho más lejos de los valores correctos. La gráfica en el cuadrante inferior derecho es una gráfica de puntos. Muestra las diferencias entre el error predictivo con los datos originales y con los datos ordenados. Esto le permite comparar las dos predicciones correspondientes para cada nueva observación simulada. Los puntos azules a la izquierda son momentos en que los datos originales estaban más cerca del nuevo valor , y los puntos rojos a la derecha son momentos en que los datos ordenados arrojan mejores predicciones. Hubo predicciones más precisas del modelo entrenado sobre los datos originales el del tiempo. y68%
El grado en que la clasificación causará estos problemas es una función de la relación lineal que existe en sus datos. Si la correlación entre e ya fuera , la clasificación no tendría ningún efecto y, por lo tanto, no sería perjudicial. Por otro lado, si la correlación fueray 1.0 - 1.0xy1.0−1.0, la clasificación revertiría completamente la relación, haciendo que el modelo sea lo más inexacto posible Si los datos no estuvieran completamente correlacionados originalmente, la clasificación tendría un efecto perjudicial intermedio, pero aún bastante grande, sobre la precisión predictiva del modelo resultante. Como usted menciona que sus datos generalmente están correlacionados, sospecho que ha proporcionado cierta protección contra los daños intrínsecos a este procedimiento. Sin embargo, ordenar primero es definitivamente dañino. Para explorar estas posibilidades, simplemente podemos volver a ejecutar el código anterior con diferentes valores para B1
(usando la misma semilla para la reproducibilidad) y examinar el resultado:
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