如何在Matlab中为lsline生成的最小二乘直线添加95%置信带?
在Matlab中为散点图添加线性拟合线和95%置信带
我之前做数据分析的时候也遇到过这个问题——lsline虽然能快速加拟合线,但确实不返回任何拟合参数,没法直接构建置信带。其实不用纠结非线性的nlpredci,Matlab的统计工具箱里有更适配线性回归的工具,下面给你两种简单可行的方案:
方案一:使用fitlm(推荐,简洁直观)
fitlm是Matlab中用于线性模型拟合的高级函数,返回的模型对象自带预测和置信区间计算功能,非常适合你的需求:
步骤1:准备数据并绘制散点图
% 生成示例散点数据(你可以替换成自己的数据) rng(1); % 固定随机种子,方便结果复现 x = linspace(0, 10, 50)'; y = 2*x + 3 + randn(50,1)*2; % 模拟带噪声的线性数据 scatter(x, y, 'filled'); hold on; % 保持画布,后续添加拟合线和置信带
步骤2:拟合线性模型并获取置信区间
% 拟合线性回归模型 mdl = fitlm(x, y); % 计算预测值和95%置信区间 [predicted_y, ~, confidence_intervals] = predict(mdl, x);
步骤3:绘制拟合线和置信带
% 绘制线性拟合直线 plot(x, predicted_y, 'r-', 'LineWidth', 2); % 绘制95%置信带(填充半透明区域) fill([x; flip(x)], [confidence_intervals(:,1); flip(confidence_intervals(:,2))], ... 'r', 'FaceAlpha', 0.1, 'EdgeColor', 'none'); % 添加图例和标签 legend('原始散点', '线性拟合线', '95%置信带', 'Location', 'best'); xlabel('X'); ylabel('Y'); hold off;
方案二:使用regress(手动计算置信区间,更灵活)
如果你习惯用基础的回归函数,regress也能实现,只是需要手动推导置信区间的计算公式:
% 准备数据 rng(1); x = linspace(0, 10, 50)'; y = 2*x + 3 + randn(50,1)*2; scatter(x, y, 'filled'); hold on; % 构造设计矩阵(包含截距项) X = [ones(length(x), 1), x]; % 执行线性回归 [b, ~, residuals, ~, stats] = regress(y, X); % 计算拟合值 y_fit = X * b; % 手动计算95%置信区间 n = length(y); p = size(X, 2); df = n - p; % 自由度 t_critical = tinv(0.975, df); % 95%置信度对应的t分布临界值 MSE = sum(residuals.^2) / df; % 均方误差 % 计算每个点的预测标准误差 X_inv = inv(X' * X); std_error = sqrt(MSE * diag(X * X_inv * X')); % 得到置信区间上下限 ci_low = y_fit - t_critical * std_error; ci_high = y_fit + t_critical * std_error; % 绘图 plot(x, y_fit, 'r-', 'LineWidth', 2); fill([x; flip(x)], [ci_low; flip(ci_high)], 'r', 'FaceAlpha', 0.1, 'EdgeColor', 'none'); legend('原始散点', '线性拟合线', '95%置信带', 'Location', 'best'); xlabel('X'); ylabel('Y'); hold off;
两种方案都能实现类似Seaborn的置信带效果,fitlm更省心,还能直接查看模型的统计指标(比如R²、p值等);regress则适合需要自定义计算逻辑的场景。
内容的提问来源于stack exchange,提问作者z8080
相关产品推荐
相关产品推荐

