利用MATLAB绘制置信区域

摘要:
<MATLAB的二十四个技巧:用MATLAB绘制置信区域>****************。x=正常值;子图置信区域子图置信区的效果图如下图所示:绘制置信椭圆。生成三元正态分布随机数矩阵,并绘制样本数据的95%置信椭球区域。

<MATLAB小技巧之二十四:利用MATLAB绘制置信区域>

***************************************

统计中经常会遇到求置信区间、置信区域(如置信椭圆、置信椭球)等,有时候需要把置信区域画出来,这样看起看更为直观,下面结合具体案例介绍调用自编函数ConfidenceRegion绘制置信区域。

【例1】绘制置信区间。产生一元正态分布随机数向量,绘制样本数据的95%置信区间。

x = normrnd(10,4,100,1);
subplot(1,2,1)
ConfidenceRegion(x)
subplot(1,2,2)
ConfidenceRegion(x,'exp')

效果图如下图所示:

【例2】绘制置信椭圆。产生二元正态分布随机数矩阵,绘制样本数据的95%置信椭圆区域。

x = mvnrnd([1;2],[1 4;4 25],100);
subplot(1,2,1)
ConfidenceRegion(x)
subplot(1,2,2)
ConfidenceRegion(x,'exp')

果图如下图所示:

【例3】绘制置信椭球。产生三元正态分布随机数矩阵,绘制样本数据的95%置信椭球区域。
x = mvnrnd([1;2;3],[3 0 0;0 5 -1;0 -1 1],100);
subplot(1,2,1)
ConfidenceRegion(x)
subplot(1,2,2)
ConfidenceRegion(x,'exp')

效果图如下图所示:

自编函数ConfidenceRegion程序代码如下:

function ConfidenceRegion(xdat,alpha,distribution)
% 绘制置信区域(区间、椭圆区域或椭球区域)
% ConfidenceRegion(xdat,alpha,distribution)
% xdat:样本观测值矩阵,p*N 或 N*p的矩阵,p = 1,2 或 3
% alpha:显著性水平,标量,取值介于[0,1],默认值为0.05
% distribution:字符串('norm'或'experience'),用来指明求置信区域用到的分布类型,
% distribution的取值只能为字符串'norm'或'experience',分别对应正态分布和经验分布
% CopyRight:xiezhh(谢中华)
% date:2011.4.14
%
% example1:x = normrnd(10,4,100,1);
% ConfidenceRegion(x)
% ConfidenceRegion(x,'exp')
% example2:x = mvnrnd([1;2],[1 4;4 25],100);
% ConfidenceRegion(x)
% ConfidenceRegion(x,'exp')
% example3:x = mvnrnd([1;2;3],[3 0 0;0 5 -1;0 -1 1],100);
% ConfidenceRegion(x)
% ConfidenceRegion(x,'exp')
% 设定参数默认值
if nargin == 1
distribution = 'norm';
alpha = 0.05;
elseif nargin == 2
if ischar(alpha)
distribution = alpha;
alpha = 0.05;
else
distribution = 'norm';
end
end
% 判断参数取值是否合适
if ~isscalar(alpha) || alpha>=1 || alpha<=0
error('alpha的取值介于0和1之间')
end
if ~strncmpi(distribution,'norm',3) && ~strncmpi(distribution,'experience',3)
error('分布类型只能是正态分布(''norm'')或经验分布(''experience'')')
end
% 检查数据维数是否正确
[m,n] = size(xdat);
p = min(m,n); % 维数
if ~ismember(p,[1,2,3])
error('应输入一维、二维或三维样本数据,并且样本容量应大于3')
end
% 把样本观测值矩阵转置,使得行对应观测,列对应变量
if m < n
xdat = xdat';
end
xm = mean(xdat); % 均值
n = max(m,n); % 观测组数
% 分情况绘制置信区域
switch p
case 1 % 一维情形(置信区间)
xstd = std(xdat); % 标准差
if strncmpi(distribution,'norm',3)
lo = xm - xstd*norminv(1-alpha/2,0,1); % 正态分布情形置信下限
up = xm + xstd*norminv(1-alpha/2,0,1); % 正态分布情形置信上限
%lo = xm - xstd*tinv(1-alpha/2,n-1); % 正态分布情形置信下限
%up = xm + xstd*tinv(1-alpha/2,n-1); % 正态分布情形置信上限
TitleText = '置信区间(基于正态分布)';
else
lo = prctile(xdat,100*alpha/2); % 经验分布情形置信下限
up = prctile(xdat,100*(1-alpha/2)); % 经验分布情形置信上限
TitleText = '置信区间(基于经验分布)';
end
% 对落入区间内外不同点用不同颜色和符号绘图
xin = xdat(xdat>=lo & xdat<=up);
xid = find(xdat>=lo & xdat<=up);
plot(xid,xin,'.')
hold on
xout = xdat(xdat<lo | xdat>up);
xid = find(xdat<lo | xdat>up);
plot(xid,xout,'r+')
h = refline([0,lo]);
set(h,'color','k','linewidth',2)
h = refline([0,up]);
set(h,'color','k','linewidth',2)
xr = xlim;
yr = ylim;
text(xr(1)+range(xr)/20,lo-range(yr)/20,'置信下限',...
'color','g','FontSize',15,'FontWeight','bold')
text(xr(1)+range(xr)/20,up+range(yr)/20,'置信上限',...
'color','g','FontSize',15,'FontWeight','bold')
xlabel('观测序号')
ylabel('观测值')
title(TitleText)
hold off
case 2 % 二维情形(置信椭圆)
x = xdat(:,1);
y = xdat(:,2);
s = inv(cov(xdat)); % 协方差矩阵
xd = xdat-repmat(xm,[n,1]);
rd = sum(xd*s.*xd,2);
if strncmpi(distribution,'norm',3)
r = chi2inv(1-alpha,p);
%r = p*(n-1)*finv(1-alpha,p,n-p)/(n-p)/n;
TitleText = '置信椭圆(基于正态分布)';
else
r = prctile(rd,100*(1-alpha));
TitleText = '置信椭圆(基于经验分布)';
end
plot(x(rd<=r),y(rd<=r),'.','MarkerSize',16) % 画样本散点
hold on
plot(x(rd>r),y(rd>r),'r+','MarkerSize',10) % 画样本散点
plot(xm(1),xm(2),'k+'); % 椭圆中心
h = ellipsefig(xm,s,r,1); % 绘制置信椭圆
xlabel('X')
ylabel('Y')
title(TitleText)
hold off;
case 3 % 三维情形(置信椭球)
x = xdat(:,1);
y = xdat(:,2);
z = xdat(:,3);
s = inv(cov(xdat)); % 协方差矩阵
xd = xdat-repmat(xm,[n,1]);
rd = sum(xd*s.*xd,2);
if strncmpi(distribution,'norm',3)
r = chi2inv(1-alpha,p);
%r = p*(n-1)*finv(1-alpha,p,n-p)/(n-p)/n;
TitleText = '置信椭球(基于正态分布)';
else
r = prctile(rd,100*(1-alpha));
TitleText = '置信椭球(基于经验分布)';
end
plot3(x(rd<=r),y(rd<=r),z(rd<=r),'.','MarkerSize',16) % 画样本散点
hold on
plot3(x(rd>r),y(rd>r),z(rd>r),'r+','MarkerSize',10) % 画样本散点
plot3(xm(1),xm(2),xm(3),'k+'); % 椭球中心
h = ellipsefig(xm,s,r,2); % 绘制置信椭球
xlabel('X')
ylabel('Y')
zlabel('Z')
title(TitleText)
hidden off;
hold off;
end
%--------------------------------------------------
% 子函数:用来绘制置信区域(椭圆或椭球)
%--------------------------------------------------
function h = ellipsefig(xc,P,r,tag)
% 画一般椭圆或椭球:(x-xc)'*P*(x-xc) = r
[V, D] = eig(P);
if tag == 1
aa = sqrt(r/D(1));
bb = sqrt(r/D(4));
t = linspace(0, 2*pi, 60);
xy = V*[aa*cos(t);bb*sin(t)]; % 坐标旋转
h = plot(xy(1,:)+xc(1),xy(2,:)+xc(2), 'k', 'linewidth', 2);
else
aa = sqrt(r/D(1,1));
bb = sqrt(r/D(2,2));
cc = sqrt(r/D(3,3));
[u,v] = meshgrid(linspace(-pi,pi,30),linspace(0,2*pi,30));
x = aa*cos(u).*cos(v);
y = bb*cos(u).*sin(v);
z = cc*sin(u);
xyz = V*[x(:)';y(:)';z(:)']; % 坐标旋转
x = reshape(xyz(1,:),size(x))+xc(1);
y = reshape(xyz(2,:),size(y))+xc(2);
z = reshape(xyz(3,:),size(z))+xc(3);
h = mesh(x,y,z); % 绘制椭球面网格图
end

免责声明:文章转载自《利用MATLAB绘制置信区域》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle中如何查询CLOB字段类型的内容增强运放的驱动能力下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Matlab/Simulink仿真中如何将Scope转化为Figure?

1.只需要在运行仿真后,在命令窗口内输入: set(0,'ShowHiddenHandle','on'); set(gcf,'menubar','figure'); scope最上方会出现一个菜单栏,选择Tools->Edit Plot,即可修改图像所有属性。 2.双击Scope->Parameters->Data History...

如何利用MATLAB并行计算缩短程序运行时间

本来CPU就是双核,不过以前一直注重算法,没注意并行计算的问题。今天为了在8核的dell服务器上跑程序才专门看了一下。本身写的程序就很容易实现并行化,因为beamline之间并没有考虑相互作用。等于可以拆成n个线程并行,要是有550核的话,估计1ms就算完了。。。 先转下网上找到的资料。 一、Matlab并行计算原理梗概Matlab的并行计算实质还是主从...

【Matlab】线性调频信号LFM 仿真

【知识点】 生成序列 i = a:step:b 举例:i = 1:1:9 画图(子图) subplot(m,n,p)或者subplot(m n p) 总结起来就是,画一个m行n列的图。 p表示在第p个位置。 subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如...

如何解决 Matlab 画图时中文显示乱码的问题?

使用的是win10系统,从前几个月某一天,我的matlab的figure里的中文都变成了口口。很是郁闷,还以为是动到了什么配置引起的。 前几天更新了matlab 2018b,发现还有这个问题。就觉得不是自身配置引起的。 就去网上搜索了这个问题,发现了不错的解答: 如何解决 Matlab 画图时中文显示乱码的问题? - Bridgoon的回答 - 知乎 这里...

Matlab图像处理系列4———傅立叶变换和反变换的图像

注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理。这些方法称为变换域方法,最常见的变换域是频域。 使用Fourier变换把图像从空间域变换到频域。在频域内做对应增强处理,再从频域变换到空间域得到处理后的图像。...

matlab 工具之各种降维方法工具包,下载及使用教程,有PCA, LDA, 等等。。。

最近跑深度学习,提出的feature是4096维的,放到我们的程序里,跑得很慢,很慢。。。。 于是,一怒之下,就给他降维处理了,但是matlab 自带的什么pca( ), princomp( )函数,搞不清楚怎么用的,表示不大明白,下了一个软件包: 名字:Matlab Toolbox for Dimensionality Reduction 链接:http...