在R中实现正交线性回归后,如何绘图、计算RMSE与R平方?
正交线性回归(全最小二乘)后续操作:绘制拟合线、计算RMSE与R²
先回顾你的现有代码与拟合结果:
# 加载pracma包 library(pracma) # 示例数据 x <- c(1.0, 0.6, 1.2, 1.4, 0.2, 0.7, 1.0, 1.1, 0.8, 0.5, 0.6, 0.8, 1.1, 1.3, 0.9) y <- c(0.5, 0.3, 0.7, 1.0, 0.2, 0.7, 0.7, 0.9, 1.2, 1.1, 0.8, 0.7, 0.6, 0.5, 0.8) # 拟合正交线性回归 odr <- odregress(y, x) c <- odr$coeff
拟合得到的模型为:Y = 0.65145762*X - 0.03328271
1. 绘制拟合直线
在你已绘制的散点图基础上,直接用abline()函数添加拟合直线,注意参数对应模型的截距和斜率:
# 绘制散点图 plot(x, y, pch = 16, col = "steelblue", main = "正交线性回归拟合结果", xlab = "X", ylab = "Y") # 添加拟合直线:a是截距(c[2]),b是斜率(c[1]) abline(a = c[2], b = c[1], col = "red", lwd = 2)
2. 计算RMSE
正交回归的RMSE通常有两种计算方式,根据需求选择:
- 垂直距离RMSE:每个数据点到拟合直线的垂直距离的均方根(这是正交回归的核心误差指标)
- 预测值RMSE:模型预测的Y值与实际Y值的差的均方根(和普通最小二乘的RMSE计算逻辑一致)
代码实现:
# 1. 垂直距离RMSE(直接用odregress返回的残差) rmse_vertical <- sqrt(mean(odr$residuals^2)) cat("垂直距离RMSE:", rmse_vertical, "\n") # 2. 预测值RMSE y_hat <- c[1] * x + c[2] # 根据模型计算预测值 rmse_pred <- sqrt(mean((y - y_hat)^2)) cat("预测值RMSE:", rmse_pred, "\n")
3. 计算R-squared
正交回归的R²没有统一标准定义,推荐两种常用计算方式:
方式一:基于PCA方差贡献率(最贴合正交回归的逻辑)
正交回归本质是通过PCA找到数据的主成分方向,R²可以用第一主成分的方差占总方差的比例:
# 计算X和Y的标准化总方差 total_var <- var(x) + var(y) # 第一主成分的方差(来自odregress的返回值) pc_var <- odr$values[1] r_squared_pca <- pc_var / total_var cat("基于PCA的R²:", r_squared_pca, "\n")
方式二:模仿普通最小二乘的R²计算
用预测值与实际值的相关系数的平方,和普通线性回归的R²逻辑一致:
r_squared_like_lm <- cor(y, y_hat)^2 cat("模仿普通线性回归的R²:", r_squared_like_lm, "\n")
内容的提问来源于stack exchange,提问作者sermomon
相关产品推荐
相关产品推荐

