How to pick the j-th percentile of a vector?
4 次查看(过去 30 天)
显示 更早的评论
Hi, I have a matrix A nx1, e.g.
A=randn(200,1);
II want to pick the element of A which is the 25th percentile above the minimum in A. How can I do it?
2 个评论
Siddhartha
2016-4-7
function val = SpecialPercentile(arr, pct)
len = length(arr);
ind = floor(pct/100*len);
newarr = sort(arr);
val = newarr(ind);
end
Then call this function p = SpecialPercentile(A, 25);
采纳的回答
Star Strider
2014-5-2
If you don’t have the Statistics Toolbox, this doesn’t replicate the prctile results exactly, but it’s close:
pctl = @(v,p) interp1(linspace(0.5/length(v), 1-0.5/length(v), length(v))', sort(v), p*0.01, 'spline');
where v is the data vector and p is the percentile. You would call it as:
p = pctl(A, 25);
in your example.
0 个评论
更多回答(2 个)
Image Analyst
2014-5-2
Do you mean like this:
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 30;
A=randn(200,1);
sortedA = sort(A)
minA = min(A) % Just for information - not used
% Get cumulative distribution function
cdf = cumsum(sortedA - sortedA(1))
bar(cdf);
% Normalize
normalizedCdf = cdf / cdf(end)
% Plot it.
plot(sortedA,normalizedCdf, 'LineWidth', 2); % Show in plot.
grid on;
title('Cumulative Distribution Function', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
% Find index where it exceeds 25% for the first time
indexOf25Percentile = find(normalizedCdf > 0.25, 1, 'first')
% Find value where it exceeds 25% for the first time
valueOf25Percentile = sortedA(indexOf25Percentile)
% Plot vertical bar there
line([valueOf25Percentile, valueOf25Percentile], [0, .25],...
'Color', 'r', 'LineWidth', 2);
% Plot horizontal bar there
xl = xlim;
line([xl(1), valueOf25Percentile], [0.25, .25],...
'Color', 'r', 'LineWidth', 2);
message = sprintf('25 Percentile happens at %f (index %d)',...
valueOf25Percentile, indexOf25Percentile);
uiwait(msgbox(message));

4 个评论
Image Analyst
2014-5-2
You can do it that way if you want. It's like I'm taking the rank of the y values and you're taking the rand of the x values. Notice on the red lines that my 25% is 25% of the y (which happens at an x of -0.17), and yours would be the 25% of the x (-2.25) and you'd read off the y that you get at x = -2.25 (which is like 0.01 or something). If the cdf is linear, like you'd get with a uniform distribution, then they'll give the same value. If not, then they'll be different.
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Descriptive Statistics 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!