Как рассчитать процентильные доли в Matlab

У меня есть данные, содержащие информацию о переменной под названием «богатство».

Я хочу подсчитать доли тех, кто находится в верхней части распределения, в середине и внизу. Именно столько богатства принадлежит богатым, средним и бедным.

Аналогичный пример - получить 10000 случайных величин из гамма-распределения. Предположим, что это распределение:

wealth = gamrnd(shape,scale,n,1);

Итак, как я могу вычислить, какая часть этой переменной идет на верхние 10%, нижние 90% и т. д.

Может ли кто-нибудь помочь мне, как я могу это сделать в Matlab?

Для вычисления процентилей вы можете использовать функцию Matlab prctile. Это может помочь делать то, что вы хотите.

mrbolichi 05.04.2018 10:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
425
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать следующую функцию, основанную на сортировке ваших данных:

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% и т. д.? Итак, в вашем примере я должен взять среднее значение вычисленных значений и разделить их на совокупность этого вектора, или нет ??

msh855 05.04.2018 09:25

Вам просто нужно заменить x на богатство

ibezito 05.04.2018 09:33

Спасибо. Но если мне нужно быть более гибким, чтобы видеть другие процентильные группы, такие как 20%, нижние 40%, я не уверен, что точно понимаю, как я должен это делать.

msh855 05.04.2018 09:57

Я отредактировал свой ответ, вы можете использовать описанную там функцию

ibezito 05.04.2018 10:05

Еще раз извините, хотя я получаю свои результаты правильно, появляется раздражающее сообщение «Предупреждение: для оператора двоеточия требуются целочисленные операнды при использовании в качестве индекса» ... Я все еще могу делать то, что хочу, но я отмечаю это, чтобы проверить, есть ли у вас функция может быть дополнительно обобщена.

msh855 05.04.2018 10:18

Пожалуйста, взгляните на мой ответ. Он использует встроенную функцию, что всегда предпочтительнее.

mrbolichi 05.04.2018 10:24

Для вычисления процентилей вы можете использовать функцию 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)

обратите внимание, что для этого требуется набор инструментов статистики и машинного обучения.

ibezito 05.04.2018 10:26

Вам нужно использовать (..) вместо скобок [...]. Кроме того, я также считаю, что для получения доли совокупного богатства необходимо разделить на «сумму (X)». Итак, sum (X (X> tenPercentTop)) / sum (X) ..... что вы думаете?

msh855 05.04.2018 12:15

@ msh855 ага. Оба ваших комментария верны. Я соответствующим образом отредактирую свой ответ

mrbolichi 05.04.2018 14:48

Другие вопросы по теме