我不确定您的老板认为“更具预测性”意味着什么。许多人错误地认为,较低的值意味着更好/更具预测性的模型。 不一定是正确的(这就是一个例子)。但是,事先对两个变量进行独立排序将保证较低的值。另一方面,我们可以通过将模型的预测与同一过程生成的新数据进行比较,来评估模型的预测准确性。我在下面的一个简单示例(用编码)中做到了。 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"))
左上方的图显示了原始数据。和之间存在某种关系(即,相关性约为。)右上方的图显示了对两个变量进行独立排序后数据的外观。您可以轻松地看到,相关强度已经大大提高了(现在约为)。但是,在下面的图中,我们看到,对于使用原始(未排序)数据训练的模型,预测误差的分布更接近于。使用原始数据的模型的平均绝对预测误差为,而在排序数据上训练的模型的平均绝对预测误差为y .31 .99 0 1.1 1.98 y 68 %Xÿ.31.9901.11.98—几乎是原来的两倍。这意味着排序后的数据模型的预测与正确值相距甚远。右下象限中的图是点图。它显示了预测误差与原始数据和排序数据之间的差异。这使您可以针对每个模拟的新观察结果比较两个相应的预测。左边的蓝色点是原始数据接近新值的时间,右边的红色点是排序后的数据产生更好的预测的时间。从原始数据训练的模型中,有的时间有更准确的预测。 ÿ68 %
排序将导致这些问题的程度是数据中存在的线性关系的函数。如果和之间的相关性已经是,则排序将不起作用,因此不会有害。另一方面,如果相关性为ÿ 1.0 - 1.0Xÿ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