为什么 geom_smooth 中的斜率取决于 R 中的变量顺序?
Why differing slope in geom_smooth depending on variable order in R?
当我在 ggplot 中绘制数据并添加回归线时,我得到不同的斜率,具体取决于哪个变量被定义为 x 和 y。我希望这些情节只是镜像,但事实并非如此。
我错过了什么吗?
# create example data
v1 <- c(0.5, 0.8, 0.8, 0.8, 0.7, 0.9, 0.8, 0.7, 0.8, 0.7, 0.5, 0.6, 0.6, 0.6, 0.7,
0.3, 0.5, 0.8, 0.9, 0.5, 0.8, 0.9, 0.8, 0.7, 0.6, 0.6, 0.8, 0.6, 0.4, 0.6)
v2 <- c(0.6, 0.9, 0.8, 0.8, 0.7, 0.8, 0.9, 0.3, 0.9, 0.7, 0.4, 0.7, 0.6, 0.7, 0.7,
0.0, 0.5, 0.7, 0.7, 0.4, 0.8, 0.8, 0.8, 0.8, 0.7, 0.4, 0.8, 0.5, 0.6, 0.6)
test1 <- data.frame(cbind(v1,v2))
# plot once with v1 as x and v2 as y and visa versa
ggplot(test1, aes(x=v1, y=v2)) +
geom_point() +
geom_smooth(data= test1, method=lm,aes(x=v1, y=v2)) +
xlim(c(0,1))+ylim(c(0,1)) +
geom_abline(col = "black")
ggplot(test1, aes(x=v2, y=v1)) +
geom_point() +
geom_smooth(data= test1, method=lm,aes(x=v2, y=v1)) +
xlim(c(0,1))+ylim(c(0,1)) +
geom_abline(col = "black")
简答
当您调用 geom_smooth()
时,它会计算形式为 y = a + bx
的简单线性回归(或 OLS 回归)的斜率。
OLS 就是在给定 x
变量值的情况下,尝试对 y
变量做出最佳预测。给定 y
变量的值,这与尝试对 x
变量做出最佳预测是不同的目标。
因此,如果您将 aes(x = v1, y = v2)
的顺序更改为 aes(x = v2, y = v1)
,您将使用 geom_smooth()
来完成两个不同的、截然不同的目标。
插图
假设您有以下数据集:
当您 运行 y ~ x
的 OLS 回归时,您会得出以下模型
y = 0.167 + 1.5*x
这通过进行以下预测来优化 y
的预测,这些预测存在相关错误:
OLS 回归的预测是最佳的,因为最右边列中的值之和(即平方和)尽可能小。
当您 运行 x ~ y
的 OLS 回归时,您会得出一个不同的模型:
x = -0.07 + 0.64*y
这通过进行以下预测优化了 x 的预测,并带有相关错误。
同样,从最右边列的值之和尽可能小(等于 0.071
)的意义上说,这是最佳选择。
现在,假设您尝试使用代数反转第一个模型 y = 0.167 + 1.5*x
,得到模型 x = -0.11 + 0.67*x
。
这会给你以下预测和相关错误:
最右边一列中值的总和是 0.074
,它大于从对 y 回归 x 得到的模型的相应总和,即 x ~ y
模型。换句话说,"inverted" 模型比简单的 x ~ y
回归模型做得更差。
当我在 ggplot 中绘制数据并添加回归线时,我得到不同的斜率,具体取决于哪个变量被定义为 x 和 y。我希望这些情节只是镜像,但事实并非如此。 我错过了什么吗?
# create example data
v1 <- c(0.5, 0.8, 0.8, 0.8, 0.7, 0.9, 0.8, 0.7, 0.8, 0.7, 0.5, 0.6, 0.6, 0.6, 0.7,
0.3, 0.5, 0.8, 0.9, 0.5, 0.8, 0.9, 0.8, 0.7, 0.6, 0.6, 0.8, 0.6, 0.4, 0.6)
v2 <- c(0.6, 0.9, 0.8, 0.8, 0.7, 0.8, 0.9, 0.3, 0.9, 0.7, 0.4, 0.7, 0.6, 0.7, 0.7,
0.0, 0.5, 0.7, 0.7, 0.4, 0.8, 0.8, 0.8, 0.8, 0.7, 0.4, 0.8, 0.5, 0.6, 0.6)
test1 <- data.frame(cbind(v1,v2))
# plot once with v1 as x and v2 as y and visa versa
ggplot(test1, aes(x=v1, y=v2)) +
geom_point() +
geom_smooth(data= test1, method=lm,aes(x=v1, y=v2)) +
xlim(c(0,1))+ylim(c(0,1)) +
geom_abline(col = "black")
ggplot(test1, aes(x=v2, y=v1)) +
geom_point() +
geom_smooth(data= test1, method=lm,aes(x=v2, y=v1)) +
xlim(c(0,1))+ylim(c(0,1)) +
geom_abline(col = "black")
简答
当您调用 geom_smooth()
时,它会计算形式为 y = a + bx
的简单线性回归(或 OLS 回归)的斜率。
OLS 就是在给定 x
变量值的情况下,尝试对 y
变量做出最佳预测。给定 y
变量的值,这与尝试对 x
变量做出最佳预测是不同的目标。
因此,如果您将 aes(x = v1, y = v2)
的顺序更改为 aes(x = v2, y = v1)
,您将使用 geom_smooth()
来完成两个不同的、截然不同的目标。
插图
假设您有以下数据集:
当您 运行 y ~ x
的 OLS 回归时,您会得出以下模型
y = 0.167 + 1.5*x
这通过进行以下预测来优化 y
的预测,这些预测存在相关错误:
OLS 回归的预测是最佳的,因为最右边列中的值之和(即平方和)尽可能小。
当您 运行 x ~ y
的 OLS 回归时,您会得出一个不同的模型:
x = -0.07 + 0.64*y
这通过进行以下预测优化了 x 的预测,并带有相关错误。
同样,从最右边列的值之和尽可能小(等于 0.071
)的意义上说,这是最佳选择。
现在,假设您尝试使用代数反转第一个模型 y = 0.167 + 1.5*x
,得到模型 x = -0.11 + 0.67*x
。
这会给你以下预测和相关错误:
最右边一列中值的总和是 0.074
,它大于从对 y 回归 x 得到的模型的相应总和,即 x ~ y
模型。换句话说,"inverted" 模型比简单的 x ~ y
回归模型做得更差。