# 如果解释变量和响应变量在回归之前被独立排序会怎样？

302

120

56

36
“科学就是我们想要的。” -Leo Spaceman博士。
Sycorax 2015年

52

47

dsaxton

147

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))
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"))

1. 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
2. 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
3. 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

12

Ilmari Karonen

3

gung

13
+1这仍然是解决所建议情况的唯一答案：当两个变量已经表现出一定的正相关性时，回归独立排序的值仍然是错误的。所有其他答案均假定没有关联或实际上是负关联。尽管它们是很好的例子，但由于它们不适用，因此不会令人信服。但是，我们仍然缺少一个直观的，真实的，真实世界的数据示例例如此处模拟的数据，其中错误的性质十分明显。
whuber

8
1是不为正统并且使用“=”为分配在R.摇摆
dsaxton

@dsaxton，我<-有时使用，但是我在CV上的目标是编写R代码，使其尽可能接近伪代码，以便对不熟悉R的人更具可读性。=在编程语言中，作为赋值运算符非常普遍。
gung

103

$x,y$$x,y$

n <- 1000

y<- runif(n)
x <- runif(n)

linearModel <- lm(y ~ x)

x_sorted <- sort(x)
y_sorted <- sort(y)

linearModel_sorted <- lm(y_sorted ~ x_sorted)

par(mfrow = c(2,1))
plot(x,y, main = "Random data")
abline(linearModel,col = "red")

plot(x_sorted,y_sorted, main = "Random, sorted data")
abline(linearModel_sorted,col = "red")


8

17
@arbitraryuser：好吧，排序后的数据将始终显示正（正，非负）相关性，无论原始数据具有什么相关性（如果有）。如果您知道原始数据始终始终具有正相关性，那么它是“偶然校正”的，但是，为什么，即使您已经知道相关性和正相关性，为什么还要费心检查相关性呢？您的经理正在执行的测试有点像“空气质量检测器”，始终显示“检测到可呼吸的空气”-只要您从未将其放在没有可呼吸空气的任何地方，它就可以完美运行。
Ilmari Karonen

2
@arbitraryuser您可能会发现更多说服力的另一个示例是，采用x = 0：50和y = 0：-50（斜率为-1的完美线）。如果对它们进行排序，则关系将变成一条斜率为1的完美直线。如果事实是您的变量在完全对立的情况下变化，并且您基于对它们在完全一致的范围内变化的错误理解而制定了政策规定，做错了事。
John Rauser

99

$\left(X=age,Y=height\right)$$(X = age, Y = height)$

$x,y$$x, y$

25
+1，但我会放弃“本质上”并重新强调“无意义”。

12

3
$x$$x$$y$$y$

12
@amoeba琐碎的数据集：一般的青少年，30多岁的NBA中心，平均年龄的女性。排序后，预测算法是最早的是最高的。
d0rmLife 2015年

1
@amoeba，我将说明如何理解它。
d0rmLife 2015年

40

${V}_{i}$$V_i$${t}_{i}$$t_i$

$\left({t}_{i},{V}_{i}\right)$$(t_i, V_i)$

$\left(0,1.0\right),\left(1,0.9\right),\left(2,0.8\right),\left(3,0.7\right),\left(4,0.6\right),\left(5,0.5\right).$
$\left(0,0.5\right),\left(1,0.6\right),\left(2,0.7\right),\left(3,0.8\right),\left(4,0.9\right),\left(5,1.0\right).$

5

Jongsma

22

12

$\begin{array}{cc}\text{chocolate}& \text{no happiness}\\ \text{no chocolate}& \text{happiness}\end{array}$

$t$$t$$N$$N$$t$$t$

$i$$i$$X$$X$$i$$i$$Y$$Y$

8

1

Nick Cox

8

> powerball_last_number = scan()
1: 69 66 64 53 65 68 63 64 57 69 40 68
13:
> #Nov. 18, 14, 11, 7, 4
> #Oct. 31, 28, 24, 21, 17, 14, 10
> #These are powerball dates.  Stock opening prices
> #are on same or preceding day.
>
> appl_stock_open = scan()
1: 115.76  115.20 116.26  121.11  123.13
6: 120.99  116.93  116.70  114.00  111.78
11: 111.29  110.00
13:
> hold = lm(appl_stock_open ~ powerball_last_number)
> summary(hold)

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept)           112.08555    9.45628  11.853 3.28e-07 ***
powerball_last_number   0.06451    0.15083   0.428    0.678
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 4.249 on 10 degrees of freedom
Multiple R-squared:  0.01796,   Adjusted R-squared:  -0.08024
F-statistic: 0.1829 on 1 and 10 DF,  p-value: 0.6779


>
> vastly_improved_regression = lm(sort(appl_stock_open)~sort(powerball_last_number))
> summary(vastly_improved_regression)

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept)                 91.34418    5.36136  17.038 1.02e-08 ***
sort(powerball_last_number)  0.39815    0.08551   4.656    9e-04 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.409 on 10 degrees of freedom
Multiple R-squared:  0.6843,    Adjusted R-squared:  0.6528
F-statistic: 21.68 on 1 and 10 DF,  p-value: 0.0008998


6

${X}_{i}$$X_i$${Y}_{i}$$Y_i$$X$$X$$Y$$Y$$i$$i$$i$$i$${X}_{1}$$X_1$${Y}_{1}$$Y_1$${X}_{2}$$X_2$${Y}_{2}$$Y_2$$X$$X$$Y$$Y$${X}_{1}$$X_1$${Y}_{1}$$Y_1$${X}_{1}$$X_1$${Y}_{1}$$Y_1$

${X}_{a}$$X_a$${X}_{b}$$X_b$${X}_{a}$$X_a$$X$$X$${Y}_{a}$$Y_a$${X}_{z}$$X_z$$X$$X$${Y}_{z}$$Y_z$$Y$$Y$${X}_{a}$$X_a$${Y}_{a}$$Y_a$${X}_{z}$$X_z$${Y}_{z}$$Y_z$${X}_{1}$$X_1$${Y}_{1}$$Y_1$

6

$f\left(x\right)=g\left(\left(y-a\right)/b\right)$$f(x) = g((y-a)/b)$$a$$a$$b>0$$b>0$

4

$Y=-X$$Y = -X$

$\stackrel{^}{Y}\approx X$$\hat Y \approx X$

ub

KT。

${R}^{2}=1$$R^2=1$

${R}^{2}$$R^2$

1
${R}^{2}$$R^2$$Y=-X$$Y = -X$

3

3

$x\sim {x}^{2}$$x \sim x^2$$x$$x$${x}^{2}$$x^2$$x$$x$

2

${x}_{1},{x}_{2},\cdots ,{x}_{n}$$x_1, x_2,\cdots, x_n$${x}_{i}<{x}_{i+1}$$x_i$f:\mathrm{\Re }↦\mathrm{\Re }$$f:\Re\mapsto\Re$${y}_{i}=f\left({x}_{i}\right)+{\epsilon }_{i}$$y_i = f(x_i) + \varepsilon_i$${\epsilon }_{i}$$\varepsilon_i$

${\epsilon }_{i}=f\left({x}_{i+\delta }\right)-f\left({x}_{i}\right)$
$\delta$$\delta$$\left\{-\mathrm{\Delta },-\mathrm{\Delta }+1,\cdots \mathrm{\Delta }-1,\mathrm{\Delta }\right\}$$\{-\Delta,-\Delta+1, \cdots \Delta-1, \Delta\}$$\mathrm{\Delta }\in \mathbb{N}$$\Delta\in\mathbb{N}$$\mathrm{\Delta }=0$$\Delta=0$$\mathrm{\Delta }=n$$\Delta=n$

$f$$f$

${\epsilon }_{i}$$\varepsilon_i$

PS：我感到很惊讶，一个看似简单的问题如何导致重新思考标准模型的有趣新方法。请老板谢谢！

1
${x}_{i+\delta }$$x_{i+\delta}$$i+\delta <1$$i+\delta<1$$i+\delta >n$$i+\delta>n$

2

import pandas as pd
s1 = [(-5, 0), (-4, -3), (-4, 3), (-3, -4), (-3, 4), (0, 5), (0, -5), (3, -4), (3, 4), (4, -3), (4, 3), (5, 0)]
df1 = pd.DataFrame(s1, columns=["x", "y"])
print(df1.corr())

x  y
x  1  0
y  0  1


s2 = [(-5, -5), (-4, -4), (-4, -4), (-3, -3), (-3, -3), (0, 0), (0, 0), (3, 3), (3, 3), (4, 4), (4, 4), (5, 5)]
df2 = pd.DataFrame(s2, columns=["x", "y"])
print(df2.corr())

x  y
x  1  1
y  1  1


1

x <- read.csv ("https://vincentarelbundock.github.io/Rdatasets/csv/car/Davis.csv", header=TRUE)

plot (weight ~ height, data=x)

lm1 <- lm (weight ~ height, data=x)

xx <- x
xx$weight <- sort (xx$weight)
xx$height <- sort (xx$height)

plot (weight ~ height, data=xx)

lm2 <- lm (weight ~ height, data=xx)

plot (weight ~ height, data=x)
abline (lm1)
abline (lm2, col="red")


plot (x$height, x$weight)
points (xx$height, xx$weight, col="red")


1

ub

2
@whuber：第二张图怎么样？在我看来，如果原始数据具有高度相关性，则对它们进行排序可能只会稍微改组值，基本上保持原始关系+/-。在几个离群值的情况下，事情会重新排列，但是...对不起，我没有数学上的突破。

1

ub

2
@whuber我认为这里的主要区别是OP表示必须“完全销毁”数据。通常，您接受的答案将详细说明这种情况。您无法以这种方式处理数据，也不知道结果是否有意义。但是，经理以前可能已经处理过类似我的（反）示例的示例，并且发现这种误导的转换实际上可以改善结果，这也是事实。因此，我们可以同意，经理从根本上来说是错误的，但也可能很幸运-在幸运的情况下，它可以正常工作。

@whuber：我已经对答案的引言进行了编辑，以使其与讨论相关。我认为，承认老板的程序可能对他有帮助，这可能是更具说服力的论点的第一步，这一论点与老板的经验格格不入。供您考虑。

-7

4
Cook在该博客文章中讨论的内容与将x和y彼此独立排序，然后将回归模型拟合到排序后的变量不同。
gung

4
OP的老板所做的不是“用FInverse（G（x））预测yhat，其中F和G是Y和X的ecdf”。您可以在我的答案的代码中看到该过程。
gung

4

Juho Kokkala 2015年

2
1.参考：-Dawes，RM“决策中不正确的线性模型的强大美感”。阿米尔。Psychol。34号 7（1979）：571。-Wainer，H.“线性模型中的估计系数：没关系。” 心理 公牛。83号 2（1976）：213。-Dawes，RM和Corrigan，B.“决策中的线性模型”。心理 Bull。，81 95-106（1974）2. Dawes和Wainer均表明，有了真实的数据和真实的预测问题，从X预测未来Y且偏离其均值或通过匹配等级，效果很好。对斜坡不敏感。

2

Scortchi

-8

14

ub

5

ub

@whuber：请看我的新答案，它有一个真实的数据集可以满足您的问题……我想。