У меня есть некоторые наблюдения, и я хочу повторить выборку на основе этих наблюдений. Здесь я рассматриваю непараметрическую модель, в частности, я использую сглаживание ядра для оценки CDF из ограниченных наблюдений. Затем я рисую значения случайным образом из полученного CDF. Ниже приведен мой код (идея состоит в том, чтобы случайным образом получить кумулятивный вероятность с использованием равномерного распределения, и принять обратный CDF по отношению к значению вероятности)
x = [randn(100, 1); rand(100, 1)+4; rand(100, 1)+8];
[f, xi] = ksdensity(x, 'Function', 'cdf', 'NUmPoints', 300);
cdf = [xi', f'];
nbsamp = 100;
rndval = zeros(nbsamp, 1);
for i = 1:nbsamp
p = rand;
[~, idx] = sort(abs(cdf(:, 2) - p));
rndval(i, 1) = cdf(idx(1), 1);
end
figure(1);
hist(x, 40)
figure(2);
hist(rndval, 40)
Как показано в коде, я использовал синтетический пример для тестирования моей процедуры, но результат неудовлетворительный, как показано двумя рисунками ниже (первый - для смоделированных наблюдений, а второй - гистограмма, полученная из оценочного CDF) :
Есть кто-нибудь, кто знает, где проблема? Заранее спасибо.
источник
Ответы:
Оценщик плотности ядра (KDE) создает распределение, представляющее собой смесь локаций распределения ядра, поэтому для получения значения из оценки плотности ядра все, что вам нужно сделать, это (1) извлечь значение из плотности ядра, а затем (2) независимо выберите случайным образом одну из точек данных и добавьте ее значение к результату (1).
Вот результат этой процедуры, примененной к набору данных, подобному тому, который указан в вопросе.
Гистограмма слева изображает образец. Для справки, черная кривая показывает плотность, из которой был взят образец. Красная кривая отображает KDE образца (с использованием узкой полосы пропускания). (Это не проблема или даже неожиданность, что красные пики короче, чем черные пики: KDE распределяет вещи, поэтому пики будут уменьшаться для компенсации.)
Гистограмма справа показывает образец (того же размера) из KDE. Черные и красные кривые такие же, как и раньше.
Очевидно, процедура, используемая для отбора проб из плотины работает. Это также чрезвычайно быстро: приведенная
R
ниже реализация генерирует миллионы значений в секунду из любого KDE. Я прокомментировал это сильно, чтобы помочь в портировании на Python или другие языки. Сам алгоритм выборки реализован в функцииrdens
со строкамиrkernel
рисуетn
образцы из функции ядра, аsample
рисуетn
образцы с заменой из данныхx
. Оператор «+» добавляет два массива выборок компонент за компонентом.как утверждено.
источник
Вы сначала делаете выборку из CDF, переворачивая ее. Обратный CDF называется функцией квантиля; это отображение из [0,1] в область RV. Затем вы выбираете случайные однородные RV в виде процентилей и передаете их в функцию квантиля, чтобы получить случайную выборку из этого распределения.
источник
Здесь я также хочу опубликовать код Matlab, следуя идее, описанной whuber, чтобы помочь тем, кто лучше знаком с Matlab, чем с R.
Ниже приводится результат:
Пожалуйста, скажите мне, если кто-нибудь обнаружит какие-либо проблемы с моим пониманием и кодом. Спасибо.
источник
Не смотря слишком близко к вашей реализации, я не в полной мере понимаю вашу процедуру индексации из ICDF. Я думаю, что вы черпаете из CDF, а не наоборот. Вот моя реализация:
источник