如何计算SAS中频率表的分位数据?

时间:2013-12-30 19:25:08

标签: sas frequency quantile

我有兴趣将我的数据划分为三分之一,但我只有一个州的计数汇总表。具体来说,我估计了州的入学人数,我想计算哪些州占所有入学人数的前三分之一。所以,前三分之一应该包括至少总累计百分比为.33333 ......

我尝试过各种方法来指定.33333和.40000之间的累积百分比,但没有成功指定一般情况。 PROC RANK也无法使用,因为数据被组织为频率表......

我在下面列出了一些虚拟(但具有代表性)的数据。


data state_counts;
input state $20.  enrollment;
cards;
CALIFORNIA                   440233
TEXAS                        318921
NEW YORK                     224867
FLORIDA                      181517
ILLINOIS                     162664
PENNSYLVANIA                 155958
OHIO                         141083
MICHIGAN                     124051
NEW JERSEY                   117131
GEORGIA                      104351
NORTH CAROLINA               102466
VIRGINIA                      93154
MASSACHUSETTS                 80688
INDIANA                       75784
WASHINGTON                    73764
MISSOURI                      73083
MARYLAND                      73029
WISCONSIN                     72443
TENNESSEE                     71702
ARIZONA                       69662
MINNESOTA                     66470
COLORADO                      58274
ALABAMA                       54453
LOUISIANA                     50344
KENTUCKY                      49595
CONNECTICUT                   47113
SOUTH CAROLINA                46155
OKLAHOMA                      43428
OREGON                        42039
IOWA                          38229
UTAH                          36476
KANSAS                        36469
MISSISSIPPI                   33085
ARKANSAS                      32533
NEVADA                        27545
NEBRASKA                      24571
NEW MEXICO                    22485
WEST VIRGINIA                 21149
IDAHO                         20596
NEW HAMPSHIRE                 19121
MAINE                         18213
HAWAII                        16304
RHODE ISLAND                  13802
DELAWARE                      12025
MONTANA                       11661
SOUTH DAKOTA                  11111
VERMONT                       10082
ALASKA                         9770
NORTH DAKOTA                   9614
WYOMING                        7457
DIST OF COLUMBIA               6487
;
run;

*****  calculating the cumulative frequencies by hand  ;


proc sql;
    create table dummy_3 as
        select

            state,
            enrollment,
            sum(enrollment) as total_enroll,
            enrollment / calculated total_enroll as percent_total

    from    state_counts

    order by percent_total desc ;
quit;    



data dummy_4; set dummy_3;
if first.percent_total then cum_percent = 0;
cum_percent + percent_total;
run;

根据cum_percent的值,构成登记前三分之一的州是:加利福尼亚州,德克萨斯州,纽约州,佛罗里达州和伊利诺伊州。

有没有办法以编程方式执行此操作?我最终想指定一个用于选择状态的标志变量。

...谢谢

3 个答案:

答案 0 :(得分:1)

好像你有90%的路在那里。如果你只是需要一种方法将cum_percent放入标记的桶中,那么设置格式非常简单。

proc format;
    value pctile
    low-0.33333 = 'top third'
    0.33333<-.4 = 'next bit'
    0.4<-high = 'the rest'
    ;
run;
options fmtsearch=(work);

在datastep的末尾添加一条语句:

pctile_flag = put(cum_percent,pctile.);

答案 1 :(得分:1)

重写您的上一个数据步骤:

data dummy_4(drop=found); 
set dummy_3;
retain cum_percent 0 found 0;
cum_percent + percent_total;
if cum_percent < (1/3) then do;
    top_third = 1;
end;
else if ^found then do; 
    top_third = 1;
    found =1;
end;
else
    top_third = 0;
run;

注意:您的first.语法不正确。 first.last。仅适用于BY组。您可以通过cum_percent + percent_total;语句在CUM_PERCENT中获得正确的值。

我不知道PROC会为你做这件事。

答案 2 :(得分:1)

您可以使用带有WEIGHT语句的PROC FREQ轻松计算百分比,然后使用LAG函数选择前三分之一:

proc freq data=state_counts noprint order=data;
   tables state / out=state_counts2;
   weight enrollment;
run;

data top3rd;
   set state_counts2;
   cum_percent+percent;
   if lag(cum_percent)<100/3 then top_third=1;
run;