Эквивалент функции R findInterval () в SAS IML - PullRequest
2 голосов
/ 09 февраля 2011

Есть ли что-нибудь похожее на R * findInterval (или cut) в SAS, особенно в IML?

Я конвертирую мою программу R, которая выполняет симуляции Монте-Карло, в IMLиспользует findInterval для преобразования чисел из генератора случайных чисел в состояние вывода.Я могу написать что-то в IML, чтобы заменить это, но это ужасно медленно по сравнению с оригиналом.Это потому, что findInterval использует преимущества скомпилированного кода C;Есть ли что-нибудь подобное, что я могу использовать в SAS?

1 Ответ

1 голос
/ 19 февраля 2011

Ваши перерывы одинаковы (одинаковая вероятность) или нет? Для равномерных разрывов вы можете использовать ceil (k * u), где u - вектор или случайные равномерные числа. Например, если вы хотите, чтобы 10 наблюдений случайным образом присваивались числам 1-4 с равной вероятностью, вы можете сказать

y = ceil(4*ranuni(j(10,1)));

или, если вы хотите использовать более новый генератор случайных чисел,

u = j(10,1); /** allocate **/
call randgen(u, "uniform"); /** fill with U[0,1] **/
y = ceil(4*u);

Для неравной вероятности используйте «табличное» распределение. Например,

p = {0.1 0.5 0.2 0.2}; /** four categories with given probabilities **/
y = j(10, 1); 
call randgen(y, "Table", p); /** fills with 1-4 with probability p **/

Вас может заинтересовать использование модуля SampleWithReplace из главы 13 моей книги, Статистическое программирование с помощью программного обеспечения SAS / IML . Вы можете скачать код и посмотреть пример его использования на http://blogs.sas.com/iml/index.php?/archives/75-Hey!-Those-Two-People-Have-the-Same-Initials!.html

Обе эти методики устраняют необходимость в findInterval, поскольку они создают категории напрямую. Если вы ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО думаете, что вам нужно скопировать случайные числа, вы можете использовать алгоритм, который я описал здесь: http://blogs.sas.com/iml/index.php?/archives/80-Count-the-Number-of-Points-in-Bins-Efficiently.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...