电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

239

主题

239

帖子

1507

积分

三级会员

Rank: 3Rank: 3

积分
1507
发表于 2023-9-7 00:00:00 | 显示全部楼层 |阅读模式
点击上方蓝字和“好玩的MATLAB”一起快乐玩耍吧!
9 M$ o: `) ?4 J7 Y, R0 _2 `$ W" X; V/ x

hlwyoo0casp6405195743.jpg

hlwyoo0casp6405195743.jpg
) @% O$ f9 D7 `' b# [- A" z. ]& ]
好玩的matlab
" U7 g5 e, u  t& ]带你解锁不一样的matlab新玩法
! k) k( U4 H* S8 y* M
  h6 T: T2 U2 D+ v今天介绍一下怎么绘制回归曲线的置信区间+边际图+核密度填充图,喜欢此推文的小伙伴们记得点赞+关注+分享!【尊重作者劳动成果,转载请注明推文链接和公众号名】4 d* {6 B. d& e$ K0 K$ m& B
: Z- b% z7 x: K, O- S; n

gsx1pbogkjd6405195843.png

gsx1pbogkjd6405195843.png
% M- ]4 H6 l1 N6 e. Y/ X2 O' M
效果图
0 Y+ `3 ^5 d  d) ?4 ?5 m

ky504fzhfnt6405195943.gif

ky504fzhfnt6405195943.gif

0 Z( X! V; C0 w9 T! m6 e- W/ Z# F, m4 x9 M: q

cyjoektza4a6405196043.png

cyjoektza4a6405196043.png
" u) ?, Q" W; G5 [
6 L. |' k4 d9 y6 f* h' ?

! U' U0 B* V( D$ g& }回归线置信区间画法
6 s3 D4 r! _; y" s, q
7 {  \0 P3 b' Z& o" a介绍一下绘制回归线置信区间的两种方式  p3 k/ R, n2 i1 O& s; C3 |$ L
一种方法是:
, ^1 T. i  P- R
  • 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);?2 r4 k" U+ P" Z5 Y) @. v, b# k

    di0qipppk106405196144.png

    di0qipppk106405196144.png

    6 z5 `& y# q2 b% c8 M另一种方法是:
    7 {5 M2 B( q1 V
  • 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);5 V. G, o+ ?6 e! o7 A5 t# g

    3oqyqnkzxhx6405196244.png

    3oqyqnkzxhx6405196244.png

    2 L6 }" a- Y! F5 J其中defaultAxes是坐标轴的设置函数如下:
    ) h) _: B* p1 _3 M5 f7 }$ t$ t- V
  • function defaultAxesax=gca;ax.Box='on';ax.Color = [1,1,1]*0.95;
    8 s6 i" @1 _( |9 O8 A% 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';! L& s, z3 S0 R/ N1 N* a
    ax.XGrid = 'on'; % 关闭X轴网格线ax.YGrid = 'on';  % 打开Y轴网格线ax.GridLineStyle = '-.'; % 设置网格线样式为虚线ax.GridColor = 'k'; % 设置网格线颜色为红色ax.GridAlpha = 0.2;  % 主要网格线透明度
    2 u+ h; r/ B2 A5 V' bax.XMinorGrid = 'off';  % 打开x轴次要网格线ax.YMinorGrid = 'off';  % 打开y轴次要网格线ax.MinorGridLineStyle = '-'; % 设置次要网格线样式ax.MinorGridColor = [0 0 0]; % 设置次要网格线颜色ax.MinorGridAlpha = 0.1; % 设置次要网格线透明度5 u8 f2 u3 z$ I: y' Q9 V, m
    ax.LineWidth = 1;            % 设置坐标轴线宽ax.XMinorTick = 'on';        % 打开x轴次要刻度线ax.YMinorTick = 'on';        % 打开y轴次要刻度线ax.TickDir = 'in';           % 设置刻度线方向向外ax.FontSize = 16;            % 设置坐标轴字体大小
    2 u9 q0 N9 S1 s6 Yend( n9 t. x& {! O; O/ d" c8 H2 U1 O
    * t7 x1 U3 A4 x- r* W' y
    % p3 k: L; O: p! s
    原理介绍
    & K$ k7 P) d) z简单介绍一下这两种方式的不同:
    $ U7 ~. `7 @. M- c: T) Z1 h) c第一组代码使用了 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%的置信区间,则:  ;
    / Q* C9 {( a4 I# q要得到任意的置信区间则用以下代码计算:9 y0 ?( D  {5 u" G2 R- T5 P$ y
  • 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 方法更全面,计算的置信区间通常更为准确,特别是当数据复杂或存在不确定性时。
    - s% g8 l& }) w, t+ B. }& xpolyfit 方法则更简单和快速,但可能不如 fitlm 那样准确。
    + p$ p/ ~3 o/ F$ C& F& j6 a9 f总结:两个不同的置信区间,是因为这两种方法用不同的方式来估计这个区间。根据你的具体需求和数据的性质,选择其中一种方法。" P5 K2 R' u/ ~) c0 I2 C/ C( |3 H

    0 R' h1 Y3 w" Z, `! M# a+ n8 v
    % O4 P$ d% b! M0 R  T% A调用方式如下# R' W+ g$ [) _! w1 m! t
    我写了个PlotRegConfInt类函数,方便直接调用绘制两种置信区间图。
    6 r- D( R9 H/ i9 f
  • 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  % 置信区间范围' f" t& h- [  k& [0 [* s: I" Y' K
            FillColor;  % 填充颜色        LineColor;  % 线条颜色        FaceAlpha;  % 透明度        LineStyle;  % 线型        LineWidth;  % 线宽        LineMarker; % 标记    end
    + s- e' }# E+ S    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;
    8 E5 X, X; ^" T* Z' l        end        function plotRegConfInt(obj)            % 添加对Alpha值的检查            if obj.Alpha 0 || obj.Alpha >=1                disp('置信区间范围在(0,1)之间,请重新设置.');                return;2 x. }$ \5 K$ x/ F
                end6 x$ L6 r; U3 ?) R/ O! K/ n
                currentAxes = gcf;            % 在当前 axes 中搜索 scatter 对象            scatterObj = findobj(currentAxes, 'Type', 'Scatter');
    1 A% Z( P  C2 ?; h. p+ F            % 判断是否找到 scatter 对象            if isempty(scatterObj)                scatter(obj.XData, obj.YData, 'r', 'filled', 'MarkerEdgeColor', 'none', 'MarkerFaceAlpha', 0.3);            end            if isequal(lower('PrCI'), lower(obj.Type))
    $ D* O9 N1 X9 }' {                % 进行线性回归                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))
    / u. o  \0 b& C1 q0 x: g                % 使用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:标记1 p* i: b1 @- @9 S: A& f: R
    & z. v! ^. r/ r$ ?6 {
    PlotRegConfInt函数调用方法
    % ]9 g9 }/ D; |' a) P2 F1 r
  • 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);# k. ~4 w9 e' z/ P
    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();
    9 ^0 r, `/ d1 J* Q: fdefaultAxeslegend(gca, 'Data', 'Regression Line','95%','Confidence Interval','box','on','Location','best','EdgeColor', [1 1 1]*0.8);title('DeCI')! n. t" p2 ^* P  R/ I$ R

    0tjiqbi2ano6405196344.png

    0tjiqbi2ano6405196344.png

    ! g3 Z; x  b  ^6 [% b
    . S1 f6 A/ S  x% ?: F- p% C' {3 Q& ^' [6 z
    添加边际图+核密度图. Q" X4 s: u  H$ y$ W2 ?7 I
  • 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);1 P. ^& ^, Y  R- Y) {2 U
    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();
    2 U  f0 L) v3 v/ X  I, [% 设置边际组图Phdl1=PlotDensFill(sHdl1);Phdl1.plotDensFill();; _  ?' h8 r1 a* U8 r
    Phdl2=PlotDensFill(sHdl2);Phdl2.plotDensFill();* ]( j! O4 [# F

    h5c2fbv43jh6405196444.png

    h5c2fbv43jh6405196444.png
    3 _: Y0 m, p/ g+ a9 t8 J

    0 q+ h& b: o2 |0 d! P# b- -THE END- -
    0 P. m( Z* N0 V2 S* b' R
    , j. h- {( I# }0 C& M% ~8 N源码下载:gitee下载:https://gitee.com/iDMatlab/PlotRegConfInt- G/ U0 w  `: t3 ]$ Q, M' a5 O

    rsidfbp34km6405196544.png

    rsidfbp34km6405196544.png

    - ^% S2 X) L8 a/ t' A& Z参考资料:【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|聚类散点图|边际图|核密度填充图
    . j. x( f4 g% P5 X' Y扫一扫加QQ群! `; i; J, q; m1 t/ t6 N8 [

    2tzs0eaheue6405196644.jpg

    2tzs0eaheue6405196644.jpg
    , u6 Z1 @0 I( W8 h
    扫一扫加管理员微信
    5 M( r" h) h2 L' K5 U+ q

    zknrlikz0xw6405196744.png

    zknrlikz0xw6405196744.png

    & \- S+ W1 r8 V* |( D% o! L

    u2mntaxein06405196844.jpg

    u2mntaxein06405196844.jpg
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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