2011-02-09 3 views
2

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

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

+0

Возможно, я должен описать, что это такое 'findInterval'! Учитывая значение x и вектор отсортированных точек доступа vec, он находит те точки пересечения, которые находятся между ними, т. Е. Какой интервал x попадает. Точнее, если 'vec [i]

ответ

1

Являются ли ваши разрывы равномерными (равной вероятности) или нет? Для равномерных разрывов вы можете использовать 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

+0

Да, это должно сделать трюк. Благодаря! –

+0

Кстати, SAS 9.3 представил функцию BIN на языке SAS/IML. См. Http://blogs.sas.com/content/iml/2013/07/15/cut-pts-and-uneven-bins/ – Rick

Смежные вопросы