北太天元学习45:分位数-分位数画图(qqplot)简介
今天要介绍的分位数有一个特列是中位数,这个大家在初中就学过了,中位数是分位数的是对应0.5的分位数。
设X是一个随机变量,累积分布函数(Cumulative Distribution Function,CDF)
是一个用来描述概率分布的函数,它通常被用来描述一个实随机变量的概率分布情况。
CDF的定义是,对于一个给定的实随机变量X,其累积分布函数定义为
F(x)=P(X<=x)
其中 P(X<=x) 表示随机变量X小于或等于x]的概率。
在很多情况下,F(x) 是一个单调递增的函数,因此可以找到它的反函数( 或者称为
F(x) 的逆, the inverse of the CDF). alpha = F(x) 的逆
x = F^{-1} (alpha),
例如 设f(t)是标准正态分布的概率密度函数, 那么F(x) = \int_{-\infty}^ x f(t) d t 是标准正态分布的累积分布函数, 我们要求 x 使得 F(x) = 0.975,
通过查表或者使用北太天元软件的命令 norminv(0.975), 可以求得 x = 1.9600 。
概率统计的文献中经常用 Z_{0.975} = 1.9600, 说 1.9600 是 Z 值,
也1.9600就是正态分布在 0.975 的分位数。
标准正态分布在 0 的分位数是负无穷,在1的分位数是正无穷, 在0.5的分位数是0,
对应0.5的分位数有一个大家熟悉的名字: 中位数。
上面谈到的分位数对概率密度函数是已知的情况下给出的,如果仅仅给我们一些数据,
如
x = [ -0.8222 0.3757 0.0385 0.5831 -0.9786]
如何确定它的中位数呢? 我们在初中的时候就学习了,如果数据的个数n 是个奇数,
那么 把数据从小到大排序,排序后的 第 (n+1)/2 个数就是中位数,如果
n是个偶数, 那么定义 第 n/2 和 n/2 + 1 个数的平均数定义为中位数。
针对我们这个例子, 我们可以用下面的代码求出中位数
(>> 表示在北太天元命令行窗口输入的命令, 然后回车,执行的结果显示在命令下边)
>> x = [-0.8222 0.3757 0.0385 0.5831 -0.9786]
x =
-0.8222 0.3757 0.0385 0.5831 -0.9786
>> xx =sort(x) % 从小到大排序
xx =
-0.9786 -0.8222 0.0385 0.3757 0.5831
>> n = length(x) %向量的长度,也就是数据的个数
n =
5
>> xx( (n+1)/2) %排序后的第 (n+1)/2 个数是中位数
ans =
0.0385
我们还是以下面的数据为例子来介绍如何计算分位数,
x = [ -0.8222 0.3757 0.0385 0.5831 -0.9786]
注意,现在我们不知道这组数据是服从哪个分布的随机变量的采样。
我们首先对它从小到大排序得到
xx = [ -0.9786 -0.8222 0.0385 0.3757 0.5831]
我们还想通过它的累积分布函数的反函数来求分位数似乎有点困难了,
因为它的累积分布函数是什么我们也不知道, 我们似乎只能猜测X
是一个离散随机变量,只能取值 xx(1), ..., xx(5),
而且只能猜测是等概率的, 也就是
P( X = xx(i) ) = 1/5, i = 1, 2, 3, 4, 5.
有了上面的概率分布,我们就可以累积概率密度函数了
F(x) = P(X<=x)
这是一个阶梯一样的函数,
在x < xx(1)的时候,F(x) = 0 ,
在 x = xx(1) 的时候 , F(x) = 1/5
在 x > xx(1) 且 x < xx(2) 时 F(x) = 1/5 ,
在 x = xx(2) 的时候 , F(x) = 2/5
在 x > xx(2) 且 x < xx(3) 时 F(x) = 2/5 ,
在 x = xx(3) 的时候 , F(x) = 3/5
...
...
在 x >= xx(5) 的时候 , F(x) = 5/5.
显然,这个累积分布函数是一个分片常数的函数,不是严格单调函数,
因此是没有反函数的, 因此也无法用累积分布函数来反函数来求分位数了。
但是根据这个分布函数来定义下面的分位数还是有一定合理的性的
定义
1/10 的分位数是 xx(1)
3/10 的分位数是 xx(2)
5/10 的分位数是 xx(3)
7/10 的分位数是 xx(4)
9/10 的分位数是 xx(5)
这个定义和我们前面讨论的中位数的定义是相吻合的,恰好 5/10的分位数是 xx(3).
这个定义的来源,我们可以稍微探究一下,我们可以把上面得到离散随机变量X改造为
一个连续随机变量Y. 为此,我们先定义
d(2) = xx(2)-x(1), ... , d(5) = xx(5)-xx(4),
定义好上面的相邻点之间的距离之后,我们再定义
d(1) = d(2) / 2 , d(6) = d(5)/2


然后我们定义Y的概率密度
P(Y < xx(1) - d(1) ) = 0 ,
P(xx(1)-d(1) <= Y < xx(1) ) = ( 1/10 ) / d(1) ,
P(xx(1) <= Y < xx(2) ) = ( 1/5 ) / d(2) ,
P(xx(2) <= Y < xx(3) ) = ( 1/5 ) / d(3) ,
...
P(xx(4) <= Y < xx(5) ) = ( 1/5 ) / d(5) ,
P(xx(5) <= Y <= xx(5)+d(6) ) = ( 1/10 ) / d(5).

Y的累积分布函数在区间 [xx(1)-d(1), xx(5)+d(6)] 上是一个严格单调递增的
函数,因此是有反函数的,我们就用连续随机变量Y的分位数代替离散随机变量
X 的分位数。
我们可以用下面的北太天元的下面的脚本cdfEx1.m 来画Y 得累积分布函数的图像

其中用的m函数cdf_y的代码我放在帖子的后面, 我就得到Y得累积分布函数,可以看到Y得累积分布函数是一个分片线形函数,而且在单调递增,而且在一个区间内是严格单调递增的,其函数图像如下:

数据
x = [ -0.8222 0.3757 0.0385 0.5831 -0.9786]
排序成了
xx = [ -0.9786 -0.8222 0.0385 0.3757 0.5831]
我们按照第一个定义,
1/10 的分位数是 xx(1)
3/10 的分位数是 xx(2)
5/10 的分位数是 xx(3)
7/10 的分位数是 xx(4)
9/10 的分位数是 xx(5)
我们仅仅能定义 alpha = 1/10, 3/10, ..., 9/10 处的分位数, 有了第二个定义,
我们把x看成离散随机变量X的取值, 然后定义连续随机变量 Y,
然后用Y的分位数来定义X的分位数,这个定义允许我们定义alpha 为任何值的
分位数. 例如,alpha = 1/5 的分位数是 ( xx(1)+xx(2) )/ 2, 我将在配套视频
讲一讲如何计算的。
会求分位数之后,我再讲讲如何画分位数-分位数图(qqplot).
下面我以北太天元代码来给出步骤:
x = randn(1000,1); % 这是我们的数据
xx = sort(x) ; % 对x 进行排序
m = length(xx); % 得到数据包含的样本点的个数
alpha = ( double(1:m) - 0.5)/m ; % 两种定义都可以定义分位数的点alpha
% xx 就是alpha点处的分位数
heng = norminv(alpha); % 正态分布在这些alpha值处的分位数
plot(heng, xx, 'LineWidth', 5)
%分位数-分位数图,其中横坐标是正态分布的分位数, 纵坐标是数据x的分位数.
还可以参考我前面的帖子《北太天元上用脚本简单实现qqplot的基本功能》
https://www.bilibili.com/read/cv26381520/?spm_id_from=333.999.0.0
这些分位数在数据分析和决策制定中被广泛应用,因为它们可以帮助我们更好地理解和解释数据集。例如,在金融领域中,分位数可以用来评估投资组合的风险和收益之间的关系;在医学领域中,分位数可以用来描述病情的严重程度和治疗效果等等。
总之,分位数是数学和统计学中重要的概念,它们可以提供关于概率分布的有用信息,帮助我们更好地理解和解释数据。
------------
北太天元代码: prob_y.m
% 北太天元根据数据生成一个连续分布的随机变量Y 的概率密度函数
% x [input] 是一个向量,长度大于或者等于2
% y 要计算概率密度的点 , 要求y是一个向量
function py = prob_y( x , y )
% 假设 x 是长度大于等于2的向量, 这里就不检查了
if nargin == 0
x = rand(1,5);
y = 0.5;
end
n = length(x);
x = sort(x); % 对x 排序
x = ( x(:) )' ; %把数据转成行向量
d = zeros(1,n+1);
for k= 2: n
d(k) = x(k)-x(k-1);
end
d(1) = d(2)/2;
d(n+1) = d(n)/2;
fendian = [ x(1)-d(1), x , x(n) + d(n+1)];
gailv = [ 0.5*1/n, 1/n * ones(1,n-1), 0.5*1/n];
概率密度 = [0, gailv ./ d, 0];
序号 = sum( y(:) > fendian, 2) ; %按行方向求和
py = 概率密度( 序号+1) ;
py = reshape(py, size(y)); % 转成和y一样形状
end
-------
cdfEx1.m 的北太天元代码
clf
close all
clear
x = [-0.8222 0.3757 0.0385 0.5831 -0.9786];
t = min(x)-1 : 0.01 : max(x) + 1 ;
ct = cdf_y(x,t);
plot(t ,ct, '-*', 'LineWidth', 5)
hold on
scatter(x, zeros(size(x)), 600, 'o','filled')
for i=1:length(x)
line( [x(i), x(i)] , [0,1])
end
hold off
title("Y的累积分布函数")
-----------
% 北太天元根据数据生成一个连续分布的随机变量Y 的概率密度函数
% x [input] 是一个向量,长度大于或者等于2
% y 要计算累积分布函数概(cdf)的点 , 要求y是一个向量
function py = cdf_y( x , y )
% 假设 x 是长度大于等于2的向量, 这里就不检查了
if nargin == 0
x = [0, 0.2, 0.4, 0.6, 0.8,1];
y = 0.5;
end
n = length(x);
x = sort(x); % 对x 排序
x = ( x(:) )' ; %把数据转成行向量
d = zeros(1,n+1);
for k= 2: n
d(k) = x(k)-x(k-1);
end
d(1) = d(2)/2;
d(n+1) = d(n)/2;
fendian = [ x(1)-d(1), x , x(n) + d(n+1)];
gailv = [ 0.5*1/n, 1/n * ones(1,n-1), 0.5*1/n];
概率密度 = [0, gailv ./ d, 0];
ind = y(:) > fendian ; %
[r, c] = size(ind);
py =zeros(length(y), 1);
for m = 1:r
nz = sum(ind(m,:) );
if nz == 0
py(m) = 0;
elseif nz == length(fendian)
py(m) = 1;
else
py(m) = gailv(nz) * ( y(m) - fendian(nz) ) / (fendian(nz+1) - fendian(nz) ) ;
if (nz>1)
py(m) = py(m) + sum( gailv(1:nz-1) );
end
end
end
py = reshape(py, size(y)); % 转成和y一样形状
end