ฉันไม่แน่ใจว่าหัวหน้าของคุณคิดว่า "คาดการณ์ได้มากกว่า" หมายความว่าอย่างไร หลายคนเชื่ออย่างไม่ถูกต้องว่าค่าต่ำกว่าหมายถึงรูปแบบการทำนายที่ดีขึ้น นั่นคือไม่จำเป็นจริง (เป็นกรณีในจุดนี้) อย่างไรก็ตามการเรียงลำดับตัวแปรทั้งสองอย่างเป็นอิสระล่วงหน้าจะรับประกันค่าต่ำกว่า ในอีกทางหนึ่งเราสามารถประเมินความแม่นยำในการทำนายของแบบจำลองโดยการเปรียบเทียบการทำนายกับข้อมูลใหม่ที่สร้างขึ้นโดยกระบวนการเดียวกัน ฉันทำอย่างนั้นในตัวอย่างง่ายๆ (เขียนด้วย) พีพีพี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"))
พล็อตซ้ายบนแสดงข้อมูลดั้งเดิม มีความสัมพันธ์ระหว่างและ (กล่าวคือมีความสัมพันธ์กันประมาณ ) พล็อตขวาบนแสดงให้เห็นว่าข้อมูลมีลักษณะอย่างไรหลังจากเรียงลำดับตัวแปรทั้งสองอย่างเป็นอิสระ คุณสามารถเห็นได้อย่างง่ายดายว่าความแข็งแรงของความสัมพันธ์เพิ่มขึ้นอย่างมาก (ตอนนี้ประมาณ ) อย่างไรก็ตามในแปลงที่ต่ำกว่าเราจะเห็นว่าการแจกแจงข้อผิดพลาดการทำนายนั้นใกล้เคียงกับสำหรับโมเดลที่ได้รับการฝึกอบรมกับข้อมูลดั้งเดิม (ไม่ได้เรียง) ข้อผิดพลาดการคาดการณ์ค่าสัมบูรณ์แบบสัมบูรณ์สำหรับแบบจำลองที่ใช้ข้อมูลดั้งเดิมคือในขณะที่ค่าความผิดพลาดแบบสัมบูรณ์แบบทำนายค่าเฉลี่ยสำหรับแบบจำลองที่ฝึกบนข้อมูลที่เรียงลำดับคือyxy0.99 0 1.1 1.98 Y 68 %.31.9901.11.98- ใหญ่เป็นสองเท่า นั่นหมายถึงการทำนายของตัวแบบข้อมูลที่เรียงลำดับนั้นมากไปกว่าค่าที่ถูกต้อง พล็อตในด้านล่างขวาคือพล็อตจุด จะแสดงความแตกต่างระหว่างข้อผิดพลาดการคาดการณ์กับข้อมูลต้นฉบับและข้อมูลที่เรียงลำดับ สิ่งนี้ช่วยให้คุณเปรียบเทียบการทำนายที่สอดคล้องกันสองแบบสำหรับการสังเกตการณ์ใหม่แต่ละครั้ง จุดสีฟ้าทางด้านซ้ายเป็นเวลาที่ข้อมูลต้นฉบับใกล้เคียงกับค่าใหม่และจุดสีแดงทางด้านขวาเป็นเวลาที่ข้อมูลที่เรียงลำดับให้การคาดการณ์ที่ดีขึ้น มีการทำนายที่แม่นยำจากแบบจำลองที่ฝึกกับข้อมูลดั้งเดิมของเวลา y68%
ระดับที่การเรียงลำดับจะทำให้เกิดปัญหาเหล่านี้คือฟังก์ชันของความสัมพันธ์เชิงเส้นที่มีอยู่ในข้อมูลของคุณ หากความสัมพันธ์ระหว่างและเป็นแล้วการเรียงลำดับจะไม่มีผลและไม่เป็นอันตราย ในทางตรงกันข้ามถ้าความสัมพันธ์เป็นy ที่1.0 - 1.0xy1.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