欢迎光临散文网 会员登陆 & 注册

北太天元上用脚本简单实现qqplot的基本功能

2023-09-08 04:41 作者:卢朓  | 我要投稿

北太天元目前还没有实现qqplot画图函数,在很多软件中,这个函数往往属于统计工具箱的一部分。 我先简单实现了一下这个函数, 供大家参考。

qqplot(z)  会画出多个图来,每个图对应z的一列, 每个图的横坐标是标准正态分布的分位数,纵坐标是 z 的每一列数据 分位数, 虚线是线性拟合得到结果。

qqplot(x,y) 假设 x 和 y 是长度一致的向量, 横坐标和纵坐标分别对应 x 和 y 的分位数。

下面是是qqplot 的qqplotEx1.m 的北太天元脚本,含有两个子函数,一个用来实现qqplot, 另一个是

求数据的线性拟合曲线。

在北太天元下运行,得到qqplot图如下

北太天元上qqplot画图



clf

close all

clear all


M=100;N=1;

x=normrnd(0,1,M,N);

y=rand(M,N);

z=[x,y];


figure(1)

qqplot(z);

xlabel('标准正态样本的Quantile');

ylabel('输入样本的Quantile');

title('Quantile-Quantile图');

legend('正态分布数据','均匀分布数据');


%生成两个正态分布样本


x=normrnd(0,1,100,1);

y=normrnd(0.5,2,100,1);

figure(2);

qqplot(x,y);

xlabel('输入样本x的Quantile');

ylabel('输入样本y的Quantile');

title('Quantile-Quantile图');



function qqplot(x,y)

if (nargin == 1)

z = x;

[m,n] = size(z);

t = (double(1:m) -0.5)/m;  %分位数

x = norminv(t);  % norminv 是 标准正态分布的累积分布函数的逆

z = sort(z)

for k=1:n

    plot(x, z(:,k) )

    hold on

    yy = linear_polyfit(x, z(:,k), x);

    plot(x, yy, 'r--')

end

hold off

elseif (nargin == 2)

x = sort(x(:) );

y = sort(y(:) );

length_x = length(x); length_y =  length(y);

if ( length_x ~= length_y )

        error("qqplot(x,y) 的 x 和y 的长度不一样, 需要改成一样");

end


yy = linear_polyfit(x, y, x);

plot(x, y) ;

hold on

plot(x,yy, 'r--')

hold off

else

error("qqplot 目前仅仅处理一个输入参数或者两个输入参数的情况");

end


end

   

function yy =  linear_polyfit(x,y, xx)

p =polyfit(x(:),y(:),1);

yy = p(1)*xx + p(2) ;

end


北太天元上用脚本简单实现qqplot的基本功能的评论 (共 条)

分享到微博请遵守国家法律