Saya tidak yakin apa yang menurut atasan Anda "lebih prediktif". Banyak orang salah percaya bahwa nilai- yang lebih rendah berarti model yang lebih baik / lebih prediktif. Itu belum tentu benar (ini menjadi contohnya). Namun, menyortir kedua variabel secara independen sebelumnya akan menjamin nilai lebih rendah . Di sisi lain, kita dapat menilai akurasi prediksi model dengan membandingkan prediksinya dengan data baru yang dihasilkan oleh proses yang sama. Saya melakukannya di bawah ini dalam contoh sederhana (diberi kode dengan ). phalhalR
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"))
Plot kiri atas menunjukkan data asli. Ada beberapa hubungan antara dan (yaitu, korelasinya sekitar .) Plot kanan atas menunjukkan seperti apa data setelah mengurutkan kedua variabel secara independen. Anda dapat dengan mudah melihat bahwa kekuatan korelasinya telah meningkat secara substansial (sekarang sekitar ). Namun, di plot yang lebih rendah, kita melihat bahwa distribusi kesalahan prediksi jauh lebih dekat dengan untuk model yang dilatih pada data asli (tidak disortir). Mean predictive absolute absolute untuk model yang menggunakan data asli adalah , sedangkan mean predictive absolute absolute untuk model yang dilatih pada data yang diurutkan adalahy .31 .99 0 1.1 1.98 y 68 %xy.31.9901.11.98- Hampir dua kali lebih besar. Itu berarti prediksi model data yang diurutkan jauh dari nilai yang benar. Plot di kuadran kanan bawah adalah plot titik. Ini menampilkan perbedaan antara kesalahan prediksi dengan data asli dan dengan data yang diurutkan. Ini memungkinkan Anda membandingkan dua prediksi yang sesuai untuk setiap simulasi pengamatan baru. Titik-titik biru ke kiri adalah saat-saat ketika data asli lebih dekat dengan nilai- baru , dan titik-titik merah ke kanan adalah saat-saat ketika data yang diurutkan menghasilkan prediksi yang lebih baik. Ada prediksi yang lebih akurat dari model yang dilatih tentang data asli dari waktu. y68 %
Sejauh mana penyortiran akan menyebabkan masalah ini adalah fungsi dari hubungan linear yang ada di data Anda. Jika korelasi antara dan sudah , penyortiran tidak akan berpengaruh sehingga tidak merugikan. Di sisi lain, jika korelasinya adalahy 1.0 - 1.0xy1.0- 1.0, penyortiran akan sepenuhnya membalikkan hubungan, membuat model seakurat mungkin. Jika data benar-benar tidak berkorelasi pada awalnya, penyortiran akan memiliki efek menengah, tetapi masih cukup besar, yang merusak pada akurasi prediksi model yang dihasilkan. Karena Anda menyebutkan bahwa data Anda biasanya berkorelasi, saya menduga itu telah memberikan perlindungan terhadap bahaya intrinsik pada prosedur ini. Meskipun demikian, memilah terlebih dahulu pasti berbahaya. Untuk mengeksplorasi kemungkinan ini, kita cukup menjalankan kembali kode di atas dengan nilai yang berbeda untuk B1
(menggunakan seed yang sama untuk reproduktifitas) dan memeriksa hasilnya:
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