SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 4201|回复: 12
打印 上一主题 下一主题

如何求百分位

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-9-15 18:56:29 | 只看该作者

如何求百分位

有个数据集有个5个变量a b c d e f,我想求出五个变量都拍在所在列前30%的观测值,请问有什么方法可以快速实现呢,谢谢。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-9-16 05:26:24 | 只看该作者

Re: 如何求百分位

[code:2e4p1ytq]proc rank data = have out = rank_out groups = 100;
        var a b c d e f;
        ranks rank_a rank_b rank_c rank_d rank_e rank_f;
run;

data final;
        set rank_out;
        if max(of rank_:) < 30;
run;[/code:2e4p1ytq]
对排行的定义受对ties 如何处理的影响。对百分位的定义当然和proc univariate的定义也不同,虽然本质上差异不大。假定你的列前是从小往大数。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-9-16 09:25:37 | 只看该作者

Re: 如何求百分位

函数PCTL也可以。
proc univariate也不错。

ps:jingju测试过么?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2010-9-16 12:07:00 | 只看该作者

Re: 如何求百分位

我的理解是:pctl() 和univarite有同样的对percentile定义。rank此处在本质上有标定顺序的感觉。如果说univariate的percentile可以不是数列中的某个数,而在rank里是不可能造数的。他的问题应该不会是需要对百分数的精确定义的。
话说回来,univariate里的定义应该就是sas在统计角度上对percentile的定义。所以你的建议是属于精益求精一类的。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2010-9-16 22:23:15 | 只看该作者

Re: 如何求百分位

你给的方法已经很方便了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2010-9-17 07:08:01 | 只看该作者

Re: 如何求百分位

to jingju11
I usually do this:
******************************************;
data _null_;
       set original nobs=ntotal;
       setn=int(ntotal*0.3);
       call symput('nextr', setn);
run;

ods select none;
ods output  ExtremeObs=ExtrObs;
proc univariate data=original  nextrobs=&nextr   def=1;
        var v1-v5;
run;
ods select all;

proc datasets library=work  nolist;
        modify ExtrObs;
        index create indexLow=(VarName LowObs)
                                   indexHigh=(VarName HighObs);
run;quit;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2010-9-17 10:04:49 | 只看该作者

Re: 如何求百分位

我总是忘我的,一次又一次充当先发言的,小学生。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2010-9-17 11:18:05 | 只看该作者

Re: 如何求百分位

<!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) --> 只能说是Lz似乎没描述得很清楚,
“百分位的前30%” 与 “前30%”之间有差异的。


[code:hlkz11hn]data ex;
input x1-x10;
x=pctl(30,of x1-x10);
cards;
1 2 3 4 5 6 7 8 9 10
1 3 3 3 5 6 7 8 9 10
1 3 3 3 3 6 7 8 9 10
;
run;
proc print;run;[/code:hlkz11hn]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2010-9-17 19:51:03 | 只看该作者

Re: 如何求百分位

用函数的方法,30%百分位以前(含)数。
ps:貌似sql不支持PCTL函数。

[code:zz5x9bgp]data original;
input v1-v5;
cards;
1        1        1        1        3
2        2        2        3        3
3        3        3        3        3
4        3        3        3        3
5        5        3        3        3
6        6        6        6        3
7        7        7        7        7
8        8        8        8        8
9        9        9        9        9
10        10        10        10        10
;
run;
proc transpose data=original out=ex(drop=_name_)  prefix=x;
run;
data ex2(keep=v);
   set ex;
        v=pctl(30,of x1-x10);
run;
proc transpose data=ex2 out=ex3(drop=_name_) prefix=c;
run;
data re;
     set original ;
     if _n_=1 then   set ex3;
         array c&#91;*&#93; c1-c5;
                 array v&#91;*&#93; v1-v5;
                 sum=0;
                 do i=1 to 5;
            sum+(c&#91;i&#93; ge v&#91;i&#93;);
                 end;
                 if sum eq 5 then output;
run;[/code:zz5x9bgp]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2010-9-17 23:44:02 | 只看该作者

Re: 如何求百分位

[quote=&quot;jingju11&quot;:mdgylakc]我总是忘我的,一次又一次充当先发言的,小学生。[/quote:mdgylakc]
支持以下版主,对错我从来不在乎,但你的方法完全满足楼猪"快速"的要求。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-3-3 03:45 , Processed in 0.246651 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表