У меня есть данные, содержащие информацию о переменной под названием «богатство».
Я хочу подсчитать доли тех, кто находится в верхней части распределения, в середине и внизу. Именно столько богатства принадлежит богатым, средним и бедным.
Аналогичный пример - получить 10000 случайных величин из гамма-распределения. Предположим, что это распределение:
wealth = gamrnd(shape,scale,n,1);
Итак, как я могу вычислить, какая часть этой переменной идет на верхние 10%, нижние 90% и т. д.
Может ли кто-нибудь помочь мне, как я могу это сделать в Matlab?





Вы можете использовать следующую функцию, основанную на сортировке ваших данных:
function [ topVals, bottomVals ] = calcPercentile( x, percentile )
sortedX = sort(x,'descend');
m = int16(percentile*length(x));
topVals = sortedX(1:m);
bottomVals = sortedX(m+1:end);
end
Пример использования:
%getting top 10% and bottom 90%
[ topVals, bottomVals ] = calcPercentile(x,0.1);
%getting top 40% and bottom 60%
[ topVals, bottomVals ] = calcPercentile(x,0.4);
Полученные результаты:
topVals = 10
bottomVals = 9 8 7 6 5 4 3 2 1
topVals = 10 9 8 7
bottomVals = 6 5 4 3 2 1
Но теперь это не учитывает доли? Что касается данных о богатстве, которые у меня есть, я хочу задать вопрос такого типа: какова доля совокупного богатства, приходящаяся на верхние 10%, нижние 90% и т. д.? Итак, в вашем примере я должен взять среднее значение вычисленных значений и разделить их на совокупность этого вектора, или нет ??
Вам просто нужно заменить x на богатство
Спасибо. Но если мне нужно быть более гибким, чтобы видеть другие процентильные группы, такие как 20%, нижние 40%, я не уверен, что точно понимаю, как я должен это делать.
Я отредактировал свой ответ, вы можете использовать описанную там функцию
Еще раз извините, хотя я получаю свои результаты правильно, появляется раздражающее сообщение «Предупреждение: для оператора двоеточия требуются целочисленные операнды при использовании в качестве индекса» ... Я все еще могу делать то, что хочу, но я отмечаю это, чтобы проверить, есть ли у вас функция может быть дополнительно обобщена.
Пожалуйста, взгляните на мой ответ. Он использует встроенную функцию, что всегда предпочтительнее.
Для вычисления процентилей вы можете использовать функцию Matlab prctile. Один из способов вызвать функцию -
prctile(X,p)
где X - ваш вектор, а p - процент в диапазоне [0-100]. Обратите внимание, что это будет то, что вы называете «нижним процентом».
В вашем случае вы можете получить нижние n% следующим образом:
ninetyPercentBottom = prctile(X,n)
ninetyPercentBottomShare = sum(X(X<ninetyPercentBottom))/sum(X)
Если вам нужен «верхний процент», обратите внимание, что «нижний процент» n% совпадает с «верхним процентом» 100-n%, поэтому вы можете использовать эту идею, чтобы получить долю верхних n%.
topPercentile = 10
tenPercentTop = prctile(X,100-topPercentile)
tenPercentTopShare = sum(X(X>tenPercentTop))/sum(X)
обратите внимание, что для этого требуется набор инструментов статистики и машинного обучения.
Вам нужно использовать (..) вместо скобок [...]. Кроме того, я также считаю, что для получения доли совокупного богатства необходимо разделить на «сумму (X)». Итак, sum (X (X> tenPercentTop)) / sum (X) ..... что вы думаете?
@ msh855 ага. Оба ваших комментария верны. Я соответствующим образом отредактирую свой ответ
Для вычисления процентилей вы можете использовать функцию Matlab
prctile. Это может помочь делать то, что вы хотите.