Я обнаружил, что вычисление индекса для определения выбросов набора данных в соответствии с тем, как работает блокпост, не дает таких же результатов.Ниже приведен пример, в котором я создаю некоторые данные, извлекаю значения из поля диаграммы (как видно из всплывающих подсказок в окне рисунка) и сравниваю их со значениями, которые я вычислил.
В то время как медиана и квартили совпадают сверхних и нижних соседних значений нет.Согласно справке Matlab в разделе «Whisker», смежные значения рассчитываются как q3 + w*(q3-q1)
, где q3
и q1
- квантили, а w
- указанная длина вискера.
Я неправильно это высчитал или есть другая ошибка?Я хотел бы иметь возможность объяснить ошибку.
Снимок экрана с таблицей результатов (обратите внимание, что результаты могут отличаться из-за случайных данных)
%Boxplot test
% create random, normally distributed dataset
data = round(randn(1000,1)*10,2);
figure(10)
clf
boxplot(data,'Whisker',1.5)
clear stats tmp
% read data from boxplot, same values as can be seen in datatips in the figure window
h = findobj(gcf,'tag','Median');
tmp = get(h,'YData');
stats(1,1) = tmp(1);
h = findobj(gcf,'tag','Box');
tmp = get(h,'YData');
stats(1,2) = tmp(1);
stats(1,3) = tmp(2);
h = findobj(gcf,'tag','Upper Adjacent Value');
tmp = get(h,'YData');
stats(1,4) = tmp(1);
h = findobj(gcf,'tag','Lower Adjacent Value');
tmp = get(h,'YData');
stats(1,5) = tmp(1);
% calculated data
stats(2,1) = median(data);
stats(2,2) = quantile(data,0.25);
stats(2,3) = quantile(data,0.75);
range = stats(2,3) - stats(2,2);
stats(2,4) = stats(2,3) + 1.5*range;
stats(2,5) = stats(2,2) - 1.5*range;
% error calculation
for k=1:size(stats,2)
stats(3,k) = stats(2,k)-stats(1,k);
end %for k
% convert results to table with labels
T = array2table(stats,'VariableNames',{'Median','P25','P75','Upper','Lower'}, ...
'RowNames',{'Boxplot','Calculation','Error'});