如何转换数据框x、y值使拟合线与对角线重合?
问题:如何转换数据框的x、y值,使拟合线与截距0、斜率1的对角线重合?
给定如下R语言数据框,如何“旋转”x和y值,让最佳拟合线与y=x对角线重合?
df <- data.frame(x=sample(1:100, 50, replace = T), y=sample(1:100, 50, replace = T)) ggplot(df, aes(x=x, y=y)) + geom_point() + geom_smooth(se = FALSE, method = glm, linetype = "dashed") + geom_abline(intercept = 0, slope = 1)

解决方案
核心思路是:先拟合原数据的线性模型,通过平移消除截距,再计算合适的旋转角度对数据进行正交变换,最终让原拟合线与y=x重合。
步骤1:拟合原数据的线性模型
先通过线性回归得到原数据的拟合线参数(截距和斜率):
set.seed(123) # 设置种子保证结果可复现 df <- data.frame(x=sample(1:100, 50, replace = T), y=sample(1:100, 50, replace = T)) # 拟合线性模型 model <- lm(y ~ x, data = df) intercept <- coef(model)[1] # 提取截距 slope <- coef(model)[2] # 提取斜率
步骤2:平移数据消除截距
原拟合线是y = intercept + slope*x,我们先平移y值,让拟合线过原点:
df$x_shifted <- df$x df$y_shifted <- df$y - intercept
此时平移后的拟合线变为y_shifted = slope*x_shifted,不再有截距。
步骤3:计算旋转角度
我们需要找到旋转角度theta,使得平移后的拟合线y_shifted = slope*x_shifted旋转后变为y'=x',计算方式如下:
theta <- atan((1 - slope)/(1 + slope))
步骤4:对数据应用旋转变换
使用正交旋转变换公式,得到旋转后的x、y值:
# 旋转变换 df$x_rotated <- df$x_shifted * cos(theta) + df$y_shifted * sin(theta) df$y_rotated <- -df$x_shifted * sin(theta) + df$y_shifted * cos(theta)
步骤5:验证结果
用ggplot绘制旋转后的数据,查看拟合线是否与y=x重合:
library(ggplot2) ggplot(df, aes(x=x_rotated, y=y_rotated)) + geom_point() + geom_smooth(se = FALSE, method = glm, linetype = "dashed") + geom_abline(intercept = 0, slope = 1, color = "red", linewidth = 1)
运行后你会看到,拟合的虚线几乎和红色的y=x对角线完全重合,达到了预期效果。
内容的提问来源于stack exchange,提问作者Algorithman
相关产品推荐
相关产品推荐

