당신의 상사가 "더 예측 적"이라고 생각하는 것이 확실하지 않습니다. 많은 사람들 은 이 낮을 수록 더 나은 / 예측 모델을 의미 한다고 잘못 믿고 있습니다. 반드시 그런 것은 아닙니다 (이것이 적절한 예입니다). 그러나 두 변수를 독립적으로 사전에 정렬하면 값 이 낮아집니다 . 반면, 동일한 프로세스에서 생성 된 새로운 데이터와 예측을 비교하여 모델의 예측 정확도를 평가할 수 있습니다. 아래의 간단한 예에서 (로 코딩 된 ) 작업을 수행합니다. p피피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"))
왼쪽 상단에 원본 데이터가 표시됩니다. 와 사이에는 약간의 관계가 있습니다 (즉, 상관 관계는 약 입니다). 오른쪽 위 그림은 두 변수를 독립적으로 정렬 한 후의 데이터 모양을 보여줍니다. 상관 관계의 강도가 상당히 증가했음을 쉽게 알 수 있습니다 (현재 약 ). 그러나 더 낮은 도표에서, 예측 오차의 분포 는 원래 (정렬되지 않은) 데이터에 대해 훈련 된 모델에 대해 에 훨씬 가깝다는 것을 알 수 있습니다. 원래 데이터를 사용한 모델의 평균 절대 예측 오차는 이고 정렬 된 데이터를 한 모델의 평균 절대 예측 오차는, Y 0.31 0.99 0 1.1 1.98 예 68 %엑스와이.31.9901.11.98— 거의 두 배나 큽니다. 이는 정렬 된 데이터 모델의 예측이 올바른 값에서 훨씬 더 멀다는 것을 의미합니다. 오른쪽 아래 사분면의 플롯은 도트 플롯입니다. 원래 데이터와 정렬 된 데이터의 예측 오류 간의 차이를 표시합니다. 이를 통해 시뮬레이션 된 각각의 새로운 관측치에 대한 두 개의 해당 예측을 비교할 수 있습니다. 왼쪽의 파란색 점은 원래 데이터가 새로운 값에 가까워진 시간 이고 오른쪽의 빨간색 점은 정렬 된 데이터가 더 나은 예측을 생성 한 시간입니다. 의 시간에 원본 데이터에 대해 훈련 된 모델로부터 더 정확한 예측이 이루어졌습니다 . 와이68 %
정렬로 인해 이러한 문제가 발생하는 정도는 데이터에 존재하는 선형 관계의 함수입니다. 상관 관계 경우 및 있었다 이미 따라서 영향을 미치지 않는다 정렬 및 것은 해로울 수 없다. 한편, 상관 관계가예 1.0 - 1.0엑스와이1.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