Non sono sicuro di cosa significhi il tuo capo "più predittivo". Molte persone credono erroneamente che valori inferiori significhino un modello migliore / più predittivo. Questo non è necessariamente vero (questo è un caso emblematico). Tuttavia, l'ordinamento indipendente di entrambe le variabili in anticipo garantirà un valore inferiore . D'altra parte, possiamo valutare l'accuratezza predittiva di un modello confrontando le sue previsioni con i nuovi dati generati dallo stesso processo. Lo faccio di seguito in un semplice esempio (codificato con ). 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"))
La trama in alto a sinistra mostra i dati originali. V'è una certa relazione tra ed (viz., La correlazione è circa .) Il grafico in alto a destra mostra come i dati assomigliano dopo la cernita indipendentemente entrambe le variabili. Si può facilmente vedere che la forza della correlazione è aumentata sostanzialmente (ora è di circa ). Tuttavia, nei grafici inferiori, vediamo che la distribuzione degli errori predittivi è molto più vicina a per il modello addestrato sui dati originali (non ordinati). L'errore predittivo assoluto medio per il modello che utilizzava i dati originali è , mentre l'errore predittivo assoluto medio per il modello addestrato sui dati ordinati èy .31 .99 0 1.1 1.98 y 68 %Xy.31.9901.11.98- quasi due volte più grande. Ciò significa che le previsioni del modello di dati ordinati sono molto più lontane dai valori corretti. La trama nel quadrante in basso a destra è una trama a punti. Visualizza le differenze tra l'errore predittivo con i dati originali e con i dati ordinati. Ciò consente di confrontare le due previsioni corrispondenti per ogni nuova osservazione simulata. I punti blu a sinistra sono momenti in cui i dati originali erano più vicini al nuovo valore , mentre i punti rossi a destra sono momenti in cui i dati ordinati hanno prodotto previsioni migliori. Ci sono state previsioni più accurate dal modello addestrato sui dati originali il delle volte. y68 %
Il grado in cui l'ordinamento causerà questi problemi è una funzione della relazione lineare esistente nei dati. Se la correlazione tra ed erano già, smistamento non avrebbe alcun effetto e quindi non essere dannosa. D'altra parte, se la correlazione fossey 1,0 - 1,0Xy1.0- 1.0, l'ordinamento invertirebbe completamente la relazione, rendendo il modello il più impreciso possibile. Se i dati fossero completamente non correlati in origine, l'ordinamento avrebbe un effetto intermedio, ma comunque piuttosto ampio, deleterio sull'accuratezza predittiva del modello risultante. Dato che dici che i tuoi dati sono generalmente correlati, sospetto che abbia fornito una certa protezione contro i danni intrinseci a questa procedura. Tuttavia, l'ordinamento per primo è decisamente dannoso. Per esplorare queste possibilità, possiamo semplicemente rieseguire il codice sopra con valori diversi per B1
(usando lo stesso seme per la riproducibilità) ed esaminare l'output:
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