使用R语言绘制拟合值点和实际数据点之间的线段表示残差大小

90 篇文章 ¥59.90 ¥99.00
本文介绍了如何使用R语言通过绘制拟合值点与实际数据点间的线段来展示残差大小,帮助理解模型拟合效果和残差分布。首先创建数据,然后拟合线性回归模型,接着绘制散点图及回归线,最后画出表示残差的线段,以此进行模型评估。

使用R语言绘制拟合值点和实际数据点之间的线段表示残差大小

在数据分析和建模中,评估模型的好坏是非常重要的。其中之一的评估指标是残差(residual),即模型预测值与实际观测值之间的差异。为了更直观地理解残差的大小和分布情况,我们可以使用R语言绘制拟合值点和实际数据点之间的线段来表示残差的大小。

下面将介绍如何使用R语言进行绘制,并提供相应的源代码。

首先,我们需要准备一些数据来进行演示。假设我们有一组自变量x和因变量y的数据,我们使用线性回归模型进行拟合,然后绘制拟合值点和实际数据点之间的线段表示残差大小。

# 准备数据
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 5, 4, 6)

# 拟合线性回归模型
model <- lm(y ~ x)

# 获取拟合值和残差
fitted <- fitted(model)
residuals <- residuals(model)

# 绘制残差图
plot(x, y, ylim = range(y, fitted), pch = 16, xlab = "x", ylab = "y", main = "拟合值和实际数据点之间的残差图")
abline(model, col = "blue")  # 绘制回归线
segments(x, fitted, x, y, col = "red")  # 绘制拟合值点和实际数据点之间的线段

上述代码首先准备了一组自变量x和因变量y的数据。然后使用lm函数拟合了一个线性回归模型,并分别获取了拟合值和残差。

接下来,使用

<think>我们将整合之前的两部分代码:生成匹配拟合直线。 完整流程: 1. 用户输入终纵坐标Ye,第一组横坐标X1,第二组横坐标X2。 2. 根据起(xs,ys)(xe,Ye)生成线段,并计算第一组P1(在原始线段上)。 3. 使用相同的纵坐标(来自P1)第二组横坐标X2生成集P2。 4. 对P2集进行直线拟合,得到拟合直线的斜率截距,并绘制拟合结果。 我们将创建一个主函数,该函数调用之前的两部分功能,并展示完整流程。</think>### 完整算法:从线段生成到直线拟合 #### 算法流程概述 1. **输入阶段**:获取用户输入的线段参数集坐标 2. **集生成**:基于线段参数计算原始集P1 3. **匹配生成**:基于P1纵坐标生成新集P2 4. **直线拟合**:使用最小二乘法对P2集进行直线拟合 5. **结果输出**:可视化结果并输出拟合参数 ```matlab function [P1, P2, slope, intercept, R2] = fullLineFittingPipeline() % 阶段1:用户输入集生成 % 固定起 xs = 0.69762; % 起横坐标 ys = 0; % 起纵坐标 xe = 8.607; % 终横坐标 % 获取终纵坐标 ye = input('请输入终纵坐标 Ye: '); if ~isscalar(ye) || ~isnumeric(ye) error('终纵坐标必须是标量数'); end % 获取第一组横坐标 X1 = input('请输入第一组横坐标数组 (如 [1, 3, 5]): '); if ~isvector(X1) || any(X1 < xs) || any(X1 > xe) error('X1 必须是向量且在起横坐标之间'); end n = numel(X1); % 计算斜率 slope_original = (ye - ys) / (xe - xs); % 生成原始集 P1 Y1 = ys + slope_original * (X1 - xs); P1 = [X1(:), Y1(:)]; % 确保列向量格式 % 获取第二组横坐标 prompt = sprintf('请输入第二组横坐标 (需包含 %d 个): ', n); X2 = input(prompt); if numel(X2) ~= n error('第二组横坐标数必须第一组相同!'); end if any(X2 < xs) || any(X2 > xe) warning('部分X2超出线段范围,结果可能不准确'); end % 生成匹配集 P2 (保持原始纵坐标) P2 = [X2(:), Y1(:)]; % 阶段2:直线拟合 X = P2(:, 1); Y = P2(:, 2); % 最小二乘法计算 X_mean = mean(X); Y_mean = mean(Y); numerator = sum((X - X_mean) .* (Y - Y_mean)); denominator = sum((X - X_mean).^2); if abs(denominator) < eps slope = 0; intercept = Y_mean; else slope = numerator / denominator; intercept = Y_mean - slope * X_mean; end % 计算拟合值R² Y_fit = slope * X + intercept; SS_res = sum((Y - Y_fit).^2); SS_tot = sum((Y - Y_mean).^2); R2 = 1 - (SS_res / SS_tot); % 阶段3:综合可视化 figure('Name', '完整线段生成拟合流程', 'Position', [100, 100, 1200, 800]); % 子1:原始线段集 subplot(2, 2, [1, 3]); % 绘制原始线段 x_ref = linspace(xs, xe, 100); y_ref = ys + slope_original * (x_ref - xs); plot(x_ref, y_ref, 'k-', 'LineWidth', 1.5, 'DisplayName', '原始线段'); hold on; % 绘制原始集P1 plot(P1(:,1), P1(:,2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r', ... 'DisplayName', '原始集P1'); % 绘制集P2 plot(P2(:,1), P2(:,2), 'bs', 'MarkerSize', 10, 'MarkerFaceColor', 'b', ... 'DisplayName', '新集P2'); % 标记端 plot(xs, ys, 'gp', 'MarkerSize', 15, 'MarkerFaceColor', 'g', ... 'DisplayName', '起'); plot(xe, ye, 'mp', 'MarkerSize', 15, 'MarkerFaceColor', 'm', ... 'DisplayName', '终'); % 添加标签 text(P1(:,1), P1(:,2), cellstr(num2str((1:n)')), ... 'VerticalAlignment', 'bottom', 'FontSize', 10); text(P2(:,1), P2(:,2), cellstr(num2str((1:n)')), ... 'VerticalAlignment', 'top', 'FontSize', 10); title('原始线段集生成'); xlabel('X坐标'); ylabel('Y坐标'); legend('Location', 'best'); grid on; axis equal tight; % 子2:拟合结果 subplot(2, 2, 2); % 绘制P2集 scatter(X, Y, 100, 'b', 'filled', 'DisplayName', 'P2集'); hold on; % 绘制拟合直线 x_fit = linspace(min(X), max(X), 100); y_fit = slope * x_fit + intercept; plot(x_fit, y_fit, 'r-', 'LineWidth', 2, ... 'DisplayName', sprintf('拟合直线: y = %.4fx + %.4f', slope, intercept)); % 绘制残差 for i = 1:n plot([X(i), X(i)], [Y(i), slope*X(i)+intercept], 'k:', 'HandleVisibility', 'off'); end title(sprintf('P2集直线拟合 (R² = %.4f)', R2)); xlabel('X坐标'); ylabel('Y坐标'); legend('Location', 'best'); grid on; axis tight; % 子3:拟合参数展示 subplot(2, 2, 4); axis off; % 创建信息文本 infoText = { '==== 原始线段参数 ====' sprintf('起: (%.5f, %.1f)', xs, ys) sprintf('终: (%.3f, %.3f)', xe, ye) sprintf('斜率: %.6f', slope_original) '' '==== 集信息 ====' sprintf('P1数: %d', n) sprintf('P2数: %d', n) '' '==== 拟合结果 ====' sprintf('拟合斜率: %.6f', slope) sprintf('拟合截距: %.6f', intercept) sprintf('决定系数 R²: %.6f', R2) sprintf('拟合方程: y = %.4fx + %.4f', slope, intercept) }; % 显示文本 text(0.1, 0.5, infoText, 'FontSize', 12, 'VerticalAlignment', 'middle'); % 阶段4:结果输出 fprintf('\n==== 完整流程结果 ====\n'); fprintf('原始线段: 起(%.5f, %.1f) -> 终(%.3f, %.3f)\n', xs, ys, xe, ye); fprintf('原始斜率: %.6f\n', slope_original); fprintf('P1集: %d个\n', n); fprintf('P2集: %d个\n', n); fprintf('拟合斜率: %.6f\n', slope); fprintf('拟合截距: %.6f\n', intercept); fprintf('决定系数 R²: %.6f\n', R2); end ``` #### 算法详解 1. **输入集生成阶段** - 固定起`(0.69762, 0)`横坐标`8.607` - 用户输入终纵坐标`Ye` - 计算原始线段斜率:`(Ye - 0)/(8.607 - 0.69762)` - 根据用户输入的`X1`生成原始集`P1` - 根据用户输入的`X2`生成匹配集`P2`(复用`P1`的纵坐标) 2. **直线拟合阶段** - 使用最小二乘法拟合`P2`集 - 计算斜率:`Σ((x_i - x̄)(y_i - ȳ))/Σ((x_i - x̄)²)` - 计算截距:`ȳ - slope * x̄` - 计算决定系数R²:`1 - (残差平方/总平方)` 3. **可视化阶段** - **左上子**:原始线段、P1P2集 - 连续原始线段 - P1集(红色)P2集(蓝色)带索引标签 - 起(绿色)(紫色)标记 - **右上子**:P2拟合结果 - 拟合直线(红色) - 残差线(黑色虚线) - R²显示 - **右下子**:参数汇总 - 原始线段参数 - 集信息 - 拟合结果参数 4. **输出阶段** - 命令行输出完整参数 - 返回生成拟合参数 - 综合可视化展示全流程 #### 算法特 1. **端到端流程** - 从用户输入到最终拟合结果的全流程解决方案 - 自动处理中间计算数据传递 2. **健壮性设计** - 全面的输入验证 - 除零错误处理 - 超出范围警告 3. **信息可视化** - 多子展示不同阶段结果 - 集索引标签 - 参数汇总面板 - 残差可视化 4. **结果分析** - 原始线段斜率拟合斜率对比 - R²评估拟合质量 - 命令行详细输出 #### 使用示例 ```matlab % 执行完整流程 [P1, P2, slope_fit, intercept_fit, R2] = fullLineFittingPipeline(); % 示例输入: % Ye = 1.5 % X1 = [1, 3, 5, 7] % X2 = [0.5, 2, 4.5, 8] % 使用拟合结果进行预测 newX = 3.5; predictedY = slope_fit * newX + intercept_fit; fprintf('在X=%.1f处的预测值: %.4f\n', newX, predictedY); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值