Присоединение к SAS по флагу для обозначения процентиля

Я хочу объединить два стола вместе

Таблица 1 - Набор данных о бейсболе

DATA baseball;
    SET sashelp.baseball
        (KEEP = crhits);
RUN;

Таблица 2 - Таблица, содержащая процентили CRhits

PROC STDIZE 
    DATA = baseball
    OUT=_NULL_      
    PCTLMTD=ORD_STAT
    PCTLDEF=5
    OUTSTAT=STDLONGPCTLS
        (WHERE = (SUBSTR(_TYPE_,1,1) = "P"))
    pctlpts = 1 TO 99 BY 1;
RUN;

Я хотел бы объединить эти таблицы вместе, чтобы создать таблицу, содержащую значения для crhits, а затем столбец, определяющий, к какому процентилю относится это значение, как показано ниже.

crhits    percentile    percentile_value
54        p3            54
66        p5            66
825       p63           825
1134      p76           1133

Последний столбец указывает значение процентиля, заданное stdlongpctls.

В настоящее время я использую следующий код для вычисления процентилей и цикл для подсчета процентилей числа «событий» на каждый фактор.

Я пробовал перекрестное соединение, но у меня возникли проблемы с визуализацией того, как объединить эти две таблицы без явного ключа.

PROC SQL;
    CREATE TABLE cross_join_table   AS
    SELECT
          a.crhits
        , b._TYPE_
        , CASE WHEN
            a.crhits < b.type       THEN b._TYPE_   END AS percentile
    FROM
        baseball                    a
    CROSS JOIN
        stdlongpctls                b;
QUIT;

Если есть другой более простой / более эффективный способ найти количество наблюдений и количество зависимых переменных (например, я моделирую флаговое событие по умолчанию в моем фактическом наборе данных, поэтому сумма 1 процентильной группы, я был бы признателен)


person 78282219    schedule 27.05.2019    source источник


Ответы (1)


Используйте вместо этого PROC RANK, чтобы сгруппировать его в процентили.

proc rank data=sashelp.baseball out=baseball_ranks group=100;
var crhits;
rank rank_crhits;
run;

Затем вы можете резюмировать это с помощью PROC MEANS.

person Reeza    schedule 27.05.2019
comment
Я надеялся найти другой способ, поскольку провожу этот анализ по более чем 500 переменным. Proc rank неправильно вычисляет процентили, если данные не отсортированы в первую очередь, где, поскольку proc stdize производит процентили сразу для всех переменных, вы по-прежнему рекомендуете этот метод? - person 78282219; 27.05.2019
comment
@ 78282219 'PROC RANK вычисляет процентили неточности, если данные не отсортированы первыми' Я никогда не видел никаких указаний на это. Не могли бы вы привести пример или ссылку? - person Reeza; 27.05.2019
comment
Я использовал proc rank для более чем 500 переменных, чтобы вычислить ранги всех сразу, я заметил, что есть числа, не расположенные в порядке возрастания в соответствии с их рангами; К сожалению, я не могу показать вам свой набор данных - person 78282219; 27.05.2019
comment
Числа не будут располагаться в порядке возрастания, потому что каждая переменная выполняется отдельно. Если бы вы могли воспроизвести это с данными SASHELP, это было бы полезно, но я почти уверен, что этого не произойдет. Я не знаю, сможете ли вы получить функцию PCTLDEF, но я бы сказал, что это, вероятно, не имеет значения для того, что вы делаете в этом масштабе. В противном случае можно сделать это с помощью макроса или вручную. Я написал макрос, который автоматизирует такую ​​сортировку, чтобы вы могли просто предоставить список. В конечном счете, это должно соответствовать вашим требованиям. gist.github.com/statgeek/7cffd06ebc3bc9c78b4f6a5 - person Reeza; 27.05.2019
comment
Я проверю ваш макрос, спасибо, когда я отсортировал данные в порядке возрастания, значения не были монотонными - person 78282219; 27.05.2019
comment
Покажите, пожалуйста, пример. Я искренне не понимаю, как такое могло произойти. - person Reeza; 27.05.2019