北太天元上用腳本簡單實現(xiàn)qqplot的基本功能
北太天元目前還沒有實現(xiàn)qqplot畫圖函數(shù),在很多軟件中,這個函數(shù)往往屬于統(tǒng)計工具箱的一部分。 我先簡單實現(xiàn)了一下這個函數(shù), 供大家參考。
qqplot(z)? 會畫出多個圖來,每個圖對應(yīng)z的一列, 每個圖的橫坐標是標準正態(tài)分布的分位數(shù),縱坐標是 z 的每一列數(shù)據(jù) 分位數(shù), 虛線是線性擬合得到結(jié)果。
qqplot(x,y) 假設(shè) x 和 y 是長度一致的向量, 橫坐標和縱坐標分別對應(yīng) x 和 y 的分位數(shù)。
下面是是qqplot 的qqplotEx1.m 的北太天元腳本,含有兩個子函數(shù),一個用來實現(xiàn)qqplot, 另一個是
求數(shù)據(jù)的線性擬合曲線。
在北太天元下運行,得到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('標準正態(tài)樣本的Quantile');
ylabel('輸入樣本的Quantile');
title('Quantile-Quantile圖');
legend('正態(tài)分布數(shù)據(jù)','均勻分布數(shù)據(jù)');
%生成兩個正態(tài)分布樣本
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; ?%分位數(shù)
x = norminv(t); ?% norminv 是 標準正態(tài)分布的累積分布函數(shù)的逆
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 目前僅僅處理一個輸入?yún)?shù)或者兩個輸入?yún)?shù)的情況");
end
end
? ?
function yy = ?linear_polyfit(x,y, xx)
p =polyfit(x(:),y(:),1);
yy = p(1)*xx + p(2) ;
end