电子产业一站式赋能平台

PCB联盟网

搜索
查看: 310|回复: 0
收起左侧

MATLAB|回归曲线|置信区间|边际图|核密度填充图

[复制链接]

260

主题

260

帖子

1829

积分

三级会员

Rank: 3Rank: 3

积分
1829
发表于 2023-9-7 00:00:00 | 显示全部楼层 |阅读模式
点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!8 L' ^0 x% N; A& W

hlwyoo0casp6405195743.jpg

hlwyoo0casp6405195743.jpg
7 ?1 g% ?; T5 P; @. q/ t
好玩的matlab6 W  _5 [/ G4 H. H" `
带你解锁不一样的matlab新玩法& V4 W7 _1 X- v3 ~4 _4 @4 k8 Q" E& B0 m
$ j4 Y, W0 W  Q: [+ _" T0 P
今天介绍一下怎么绘制回归曲线的置信区间+边际图+核密度填充图,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】
# E+ O7 A- n1 N" r8 j
2 j" A$ f( V7 \: d

gsx1pbogkjd6405195843.png

gsx1pbogkjd6405195843.png

$ Q* e$ l/ \. D1 l% W" Z效果图& S- t: d" N7 v* w9 I

ky504fzhfnt6405195943.gif

ky504fzhfnt6405195943.gif
1 C1 Y1 v1 r+ `) O! B2 }
; H; C! q2 a& P. h2 l1 U. @

cyjoektza4a6405196043.png

cyjoektza4a6405196043.png

0 [  ~- \2 O3 Q% Y4 y6 }, ^/ P, [" p  K  j$ u; z2 l( [- ^/ s& K! L

9 v; K) R' f" }* m0 l$ n8 ]回归线置信区间画法% _9 m, ]' n- W6 ?
% X# F* U) A- v
介绍一下绘制回归线置信区间的两种方式9 ?# W8 [3 R0 W" D( R1 r
一种方法是:7 I; s6 \9 y+ i6 ^, J/ B8 W
  • clc;clear;close all;%--------------------------------------------------------------------------% @Author: 好玩的Matlab% @公众号:好玩的Matlab% @Created: 09,06,2023% @Email:2377389590@qq.com% 尊重劳动成果,转载请备注推文链接和公众号名。% @Disclaimer: This code is provided as-is without any warranty.%--------------------------------------------------------------------------% 使用提供的数据data = repmat([2 2], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];xData = data(:, 1);yData = data(:, 2);% 绘制散点图figure('Position',[383 355 886 507]);scatter(xData, yData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);hold on;% 进行线性回归linearModel = fitlm(xData, yData);% 计算回归曲线和置信区间xFit = linspace(min(xData), max(xData), 200)';[yPred, yConfInterval] = predict(linearModel, xFit, 'Alpha', 0.05); % 95%置信区间% 绘制回归曲线plot(xFit, yPred, 'r', 'LineWidth', 2);% 使用fill函数绘制置信区间fill([xFit; flipud(xFit)], [yConfInterval(:, 1); flipud(yConfInterval(:, 2))], 'g', 'FaceAlpha', 0.3, 'EdgeColor', 'none');defaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);?7 v) C  E, P9 I$ l) n( D, k

    di0qipppk106405196144.png

    di0qipppk106405196144.png
    - n% {5 h, R" |
    另一种方法是:
    * z( m- ]* _+ b/ z0 w6 M: o
  • clc;clear;close all;%--------------------------------------------------------------------------% @Author: 好玩的Matlab% @公众号:好玩的Matlab% @Created: 09,06,2023% @Email:2377389590@qq.com% 尊重劳动成果,转载请备注推文链接和公众号名。% @Disclaimer: This code is provided as-is without any warranty.%--------------------------------------------------------------------------% 使用提供的数据data = repmat([2 2], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];xData = data(:, 1);yData = data(:, 2);% 创建图形窗口并持有当前图figure('Position',[383 355 886 507]);hold on;% 使用polyfit进行线性拟合[polyCoeff, polyStruct] = polyfit(xData, yData, 1);xFit = linspace(min(xData), max(xData), 200);[yFit, fitDelta] = polyval(polyCoeff, xFit, polyStruct);alpha = 0.05;  % 对于95%置信区间zValue = norminv(1 - alpha/2, 0, 1);  % 这将返回1.960% 计算置信区间upperConfInt = yFit + zValue .* fitDelta;lowerConfInt = yFit - zValue .* fitDelta;% 绘制原始数据scatter(xData, yData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);% 绘制拟合曲线plot(xFit, yFit, 'r', 'LineWidth', 2.5);% 使用fill函数绘制置信区间fill([xFit, fliplr(xFit)], [upperConfInt, fliplr(lowerConfInt)], 'g', 'EdgeColor', 'none', 'FaceAlpha', 0.15);defaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);" m8 W0 U( Z/ _, w

    3oqyqnkzxhx6405196244.png

    3oqyqnkzxhx6405196244.png
    7 v& F- d/ R- d! z0 f5 N9 L
    其中defaultAxes是坐标轴的设置函数如下:7 z$ |" B: y. N) l% D5 z0 h
  • function defaultAxesax=gca;ax.Box='on';ax.Color = [1,1,1]*0.95;6 }' H. K1 j- P" C$ S
    % ax.XLim=[-2,15];% ax.YLim=[-4,13];ax.XLabel.String='X-axis';ax.YLabel.String='Y-axis';ax.Title.String='';% legend(ax, 'Data', 'Regression Line', [num2str(z*100),'%'],'Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);ax.FontName='Times New Roman';. W( m1 n  c( J. z- u
    ax.XGrid = 'on'; % 关闭X轴网格线ax.YGrid = 'on';  % 打开Y轴网格线ax.GridLineStyle = '-.'; % 设置网格线样式为虚线ax.GridColor = 'k'; % 设置网格线颜色为红色ax.GridAlpha = 0.2;  % 主要网格线透明度
    9 N& c8 Q) I, o4 O) lax.XMinorGrid = 'off';  % 打开x轴次要网格线ax.YMinorGrid = 'off';  % 打开y轴次要网格线ax.MinorGridLineStyle = '-'; % 设置次要网格线样式ax.MinorGridColor = [0 0 0]; % 设置次要网格线颜色ax.MinorGridAlpha = 0.1; % 设置次要网格线透明度9 l( }9 e2 Y. m0 A- T- C1 G9 W! d
    ax.LineWidth = 1;            % 设置坐标轴线宽ax.XMinorTick = 'on';        % 打开x轴次要刻度线ax.YMinorTick = 'on';        % 打开y轴次要刻度线ax.TickDir = 'in';           % 设置刻度线方向向外ax.FontSize = 16;            % 设置坐标轴字体大小& Y) I1 b& r; J* Y+ \
    end
    + Y, V; y2 k9 ~- V/ ?, ^% H, H. q
    & F) C( v9 t  s0 F) G* o0 a" J
    ! j1 f8 U) n9 \3 d9 q
    原理介绍# W$ p2 }8 j. C
    简单介绍一下这两种方式的不同:
    $ Z; ?8 n& V" T第一组代码使用了 fitlm 和 predict 函数,这是基于更复杂的线性模型拟合。这种方法计算了95%的置信区间,这个区间给出了模型预测响应值的不确定性。第二组代码使用了polyfit和 polyval 函数,用于多项式拟合。这里用的是多项式的一阶(线性)拟合。polyval 返回了拟合值和预测的标准误差,并假设这个标准误差是正态分布的。然后,它使用这个标准误差来计算了一个简化的95%置信区间(yFit + zValue* fitDelta)。其中:在正态分布中,以下是关于置信区间和标准偏差距离均值的规律:
  • 大约 68% 的数据点位于距离均值 1 个标准偏差以内的区间。
  • 大约 95% 的数据点位于距离均值 2 个标准偏差以内的区间。
  • 大约 99.7% 的数据点位于距离均值 3 个标准偏差以内的区间。这些规则是基于正态分布的数学属性,特别是在描述数据集分布的集中趋势和离散程度方面。这些比例也常被称为 "68-95-99.7" 规则或者 "三西格玛(Three-Sigma Rule)"或者“拉依达(Laplace)” 规则。很容易得出要想得到95%的置信区间,则:  ;
    % E' a) l- y6 u' O要得到任意的置信区间则用以下代码计算:
    - W7 w5 q6 P1 d8 p, z) q9 a+ u9 U
  • alpha = 0.05;  % 对于95%置信区间zValue = norminv(1 - alpha/2, 0, 1);  % 这将返回1.960% 计算置信区间upperConfInt = yFit + zValue .* fitDelta;lowerConfInt = yFit - zValue .* fitDelta;由于这两种方法背后的统计模型和假设不同,所以得到的置信区间也可能会不同。具体使用哪一种方法取决于你的数据特性和需求。如果你的数据更适合一个复杂的线性模型,并且你希望考虑更多的变量和相互作用,fitlm 可能会更适合。如果你的数据是简单的并且你只是需要一个快速和简单的拟合,polyfit 和 polyval 可能就足够了。fitlm 方法更全面,计算的置信区间通常更为准确,特别是当数据复杂或存在不确定性时。* c, z3 ]7 w# G7 h+ v2 D% D
    polyfit 方法则更简单和快速,但可能不如 fitlm 那样准确。
    . C4 O6 J+ ]( }7 O8 D总结:两个不同的置信区间,是因为这两种方法用不同的方式来估计这个区间。根据你的具体需求和数据的性质,选择其中一种方法。
    2 U5 A0 a1 F( }' }: A! q! c
    3 i; x5 }$ J0 |5 W8 ]5 m0 k
    ' G6 T/ R. v! J% n, T0 Z调用方式如下
    + h! z6 j) b( K' i/ o我写了个PlotRegConfInt类函数,方便直接调用绘制两种置信区间图。, `  X' r4 V9 W$ R& M" `& B
  • classdef PlotRegConfInt    %--------------------------------------------------------------------------    % @Author: 好玩的Matlab    % @公众号:好玩的Matlab    % @Created: 09,06,2023    % @Email:2377389590@qq.com    % 尊重劳动成果,转载请备注推文链接和公众号名。    % @Disclaimer: This code is provided as-is without any warranty.    %--------------------------------------------------------------------------    properties        XData;  % x数据        YData;      % y数据        Type ='prCI'   % 绘制方法        % =============【PrCI】=====================        % 使用 predict 函数计算置信区间        % 在你给出的 MATLAB 代码中,predict 函数用于计算置信区间,这一计算是基于特定的统计模型(在这里是线性模型)        % 和数据。这个方法考虑了数据的整体分布和模型参数的不确定性,并给出了一个关于预测值可能范围的精确估计。        % 1、全面性:它考虑了模型参数的不确定性和数据的内在变异性。        % 2、准确性:使用模型参数的标准误差和协方差矩阵,它可以非常精确地估计预测值的不确定性。        % 3、灵活性:你可以选择不同的置信级别(例如 95%、99% 等)        %==============【DeCI】==============================        % 使用 yfit +-  zValue x sigma 计算置信区间        % 这种方法更为简单和直观,通常用于快速估计预测值的不确定性。它通常假设误差是正态分布的,        % 并用标准偏差(δ)来量化这种不确定性。        % 1、简单性:不需要复杂的模型或计算。        % 2、快速性:很容易计算。        % 3、局限性:这种方法通常假定误差是正态分布的,并且不考虑模型参数的不确定性。        Alpha  % 置信区间范围' r. |* M$ o5 Q
            FillColor;  % 填充颜色        LineColor;  % 线条颜色        FaceAlpha;  % 透明度        LineStyle;  % 线型        LineWidth;  % 线宽        LineMarker; % 标记    end  P8 F. X7 s# [! P$ I% T; G$ x
        methods        function obj=PlotRegConfInt(sHdl)            obj.XData = get(sHdl,'XData');            obj.YData = get(sHdl,'YData');            obj.Type='PrCI';            obj.Alpha=0.95; %默认置信区间            obj.LineColor=get(sHdl,'CData');  % 线颜色            obj.LineStyle='-';  % 线型            obj.LineWidth=3;            obj.LineMarker='none';            obj.FillColor=get(sHdl,'CData');            obj.FaceAlpha=get(sHdl,'MarkerFaceAlpha') * 0.5;
    # M; U( ?  R5 w; X* i5 x        end        function plotRegConfInt(obj)            % 添加对Alpha值的检查            if obj.Alpha 0 || obj.Alpha >=1                disp('置信区间范围在(0,1)之间,请重新设置.');                return;
    4 n2 X3 ~5 B4 _' B3 W            end
    5 f* y+ h" X+ l2 l9 L$ ^            currentAxes = gcf;            % 在当前 axes 中搜索 scatter 对象            scatterObj = findobj(currentAxes, 'Type', 'Scatter');( b$ @! s. {0 Q0 x
                % 判断是否找到 scatter 对象            if isempty(scatterObj)                scatter(obj.XData, obj.YData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.3);            end            if isequal(lower('PrCI'), lower(obj.Type))
    , q+ Z( y6 [4 j9 R0 T0 l                % 进行线性回归                linearModel = fitlm(obj.XData, obj.YData);                % 计算回归曲线和置信区间                xFit = linspace(min(obj.XData), max(obj.XData), length(obj.XData))';                [yPred, yConfInterval] = predict(linearModel, xFit, 'Alpha', 1-obj.Alpha); % 95%置信区间                % 绘制回归曲线                hold on                plot(gca,xFit, yPred, 'color',obj.LineColor, 'LineWidth', obj.LineWidth,'LineStyle',obj.LineStyle,'Marker',obj.LineMarker);                % 使用fill函数绘制置信区间%'FaceColor',obj.FillColor,                fill(gca,[xFit; flipud(xFit)], [yConfInterval(:, 1); flipud(yConfInterval(:, 2))], obj.FillColor, 'FaceAlpha', obj.FaceAlpha, 'EdgeColor', 'none');            elseif isequal(lower('DeCI'), lower(obj.Type))! n/ m  G  E# o
                    % 使用polyfit进行线性拟合                [polyCoeff, polyStruct] = polyfit(obj.XData, obj.YData, 1);                xFit = linspace(min(obj.XData), max(obj.XData), length(obj.XData));                [yFit, fitDelta] = polyval(polyCoeff, xFit, polyStruct);                %                alpha = 1-obj.Alpha;  % 置信区间                zValue = norminv(1 - alpha/2, 0, 1);  % 这将返回1.960                % 计算置信区间                upperConfInt = yFit + zValue .* fitDelta;                lowerConfInt = yFit - zValue .* fitDelta;                % 绘制拟合曲线                hold on                plot(gca,xFit, yFit, 'color',obj.LineColor, 'LineWidth', obj.LineWidth,'LineStyle',obj.LineStyle,'Marker',obj.LineMarker);                % 使用fill函数绘制置信区间                fill(gca,[xFit, fliplr(xFit)], [upperConfInt, fliplr(lowerConfInt)],obj.FillColor, 'FaceAlpha', obj.FaceAlpha, 'EdgeColor', 'none');            else                disp(['没有此绘制回归+置信区间的属性',obj.Type,'目前只有DeCI 和PrCI绘图方式'])            end        end    endend其中参数如下,详细参数介绍在代码中XData:x数据YData:y数据 Type:绘制方法 Alpha:置信区间范围 FillColor:填充颜色 LineColor: 线条颜色 FaceAlpha:透明度 LineStyle:线型 LineWidth:线宽 LineMarker:标记
    3 O+ j. y! i9 w8 I7 G% [6 T3 k9 u
    PlotRegConfInt函数调用方法; A6 E* w$ t; ^! d) C: @
  • clc;clear;close all;%--------------------------------------------------------------------------% @Author: 好玩的Matlab% @公众号:好玩的Matlab% @Created: 09,06,2023% @Email:2377389590@qq.com% 尊重劳动成果,转载请备注推文链接和公众号名。% @Disclaimer: This code is provided as-is without any warranty.%--------------------------------------------------------------------------% 使用提供的数据data = repmat([2 2], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];xData = data(:, 1);yData = data(:, 2);% 绘制散点图figure('Position',[383 355 886 507]);subplot(1,2,1);sHdl=scatter(xData, yData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);hold onP1=PlotRegConfInt(sHdl);P1.Alpha=0.95;% P1.LineColor='b';% P1.LineWidth=2;P1.plotRegConfInt();defaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);5 ?; H% y) q) t2 a  \$ e+ K
    title('PrCI')subplot(1,2,2);sHdl=scatter(xData, yData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);P2=PlotRegConfInt(sHdl);P2.Type='DeCI'; %设置两种绘制置信区间的方法P2.Alpha=0.95;% 设置置信区间P2.FillColor='g';% 设置之前区间填充的颜色P2.LineColor='k';%回归先颜色P2.LineStyle='-.';%回归先样式P2.LineMarker='none';P2.LineWidth=4;  %回归线粗细P2.plotRegConfInt();
    . ?) J6 F7 S& bdefaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);title('DeCI')- z6 v: S1 L) \1 b2 ~

    0tjiqbi2ano6405196344.png

    0tjiqbi2ano6405196344.png
    $ z6 R/ t; a* ]! }' Y  X! L

    & A7 H! Y( G& G( o: n8 h3 \6 h4 y  D" D& V  A+ `5 {- s" D7 [- A
    添加边际图+核密度图3 V2 T/ D  t$ s! E
  • clc;clear;close all;%--------------------------------------------------------------------------% @Author: 好玩的Matlab% @公众号:好玩的Matlab% @Created: 09,06,2023% @Email:2377389590@qq.com% 尊重劳动成果,转载请备注推文链接和公众号名。% @Disclaimer: This code is provided as-is without any warranty.%--------------------------------------------------------------------------% 使用提供的数据data1 = repmat([2 2], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];data2 = repmat([5 5], 200, 1) + randn(200, 2) * [1 .5; 0 1.32];xData1 = data1(:, 1);yData1 = data1(:, 2);! ]% Z( c2 f3 z6 B3 V) z0 p
    xData2 = data2(:, 1);yData2 = data2(:, 2);% 绘制散点图figure('Position',[383 355 886 507]);hold onsHdl1=scatter(xData1, yData1, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);sHdl2=scatter(xData2, yData2, 'm', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.4);defaultAxes% 绘制回归线置信区间P1=PlotRegConfInt(sHdl1);P1.LineColor='b';P1.LineWidth=2;P1.plotRegConfInt();P2=PlotRegConfInt(sHdl2);P2.Type='DeCI';P2.FillColor=[1,1,0.5]*0.8;P2.LineStyle='--';P2.LineColor='k';P2.LineWidth=2;P2.plotRegConfInt();! G7 J! ]8 p& _4 l3 @/ Z# C
    % 设置边际组图Phdl1=PlotDensFill(sHdl1);Phdl1.plotDensFill();, t7 r& m7 F. K# L6 s0 i
    Phdl2=PlotDensFill(sHdl2);Phdl2.plotDensFill();
    1 a* t- O* N$ j7 P+ H5 p

    h5c2fbv43jh6405196444.png

    h5c2fbv43jh6405196444.png

    . C) A4 ~7 q( c+ I3 h; T1 R( v5 ^, i
    - -THE END- -& z6 Y5 W. [* O
    : a! m5 i% C1 |
    源码下载:gitee下载:https://gitee.com/iDMatlab/PlotRegConfInt
    " a. ?7 G5 Z  S2 p' Y

    rsidfbp34km6405196544.png

    rsidfbp34km6405196544.png
    . z5 w8 c9 l5 U: o9 ^% M
    参考资料:【1】贾俊平《统计学》【2】https://zhuanlan.zhihu.com/p/416569320?ivk_sa=1024320u&utm_id=0【3】https://www.mathworks.com/help/releases/R2021b/stats/fitlm.html【4】https://www.mathworks.com/help/releases/R2021b/matlab/ref/polyfit.html【5】MATLAB|聚类散点图|边际图|核密度填充图
    ) G6 c0 H& s9 o扫一扫加QQ群+ V' v7 H  L/ O7 X# c* G2 z

    2tzs0eaheue6405196644.jpg

    2tzs0eaheue6405196644.jpg
    : ^2 S; e6 L1 F9 ?" B
    扫一扫加管理员微信+ _: ~9 A3 W5 D, b' \% L& r

    zknrlikz0xw6405196744.png

    zknrlikz0xw6405196744.png

    # T4 P7 k# Y+ W; }

    u2mntaxein06405196844.jpg

    u2mntaxein06405196844.jpg
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表