SAS 程序冷知识——Q1和Q3的计算原理

         一般人都会用sas算q1和q3,但很少有人知道sas在后台是怎么算的。如果你到网上查寻q1和q3的算法,会发现sas的结果和手算的完全不一样。因为sas程序是封闭的,所以我没有查到具体算法,于是通过程序生成从1-1到1-1000的数据产生1000个q1和q3,再通过找规律的方法,逆推得到了sas的算法(逆推得到的算法最后说)。

       我们计算q1和q3的sas程序是这段:proc univariate data=aaa;var a;run;

       为了快速生成1000个q1和q3,需要用以下程序:

data _null_;

do i=1 to 1000;

call execute('

data aaa;

do a=1 to '||cats(i)||';

output;

end;

run;

proc univariate data=aaa noprint;

var a;

output out=data'||put(i,z4.)||' q1=q1 q2=q2 q3=q3;

run;

');

end;

run;

data all;

set data:;

if int(q2)=q2 and mod(int(q2),2)=1 then qm_1=(q2+1)/2;*中位数为奇数,中位数算进去所以+1除2得第二个中位数;

else if int(q2)=q2 then qm_1=(q2)/2;*中位数为偶数,中位数不算进去所以先-1得下半部数字个数,然后+1除2得第二个中位数;

else qm_1=(int(q2)+1)/2;*中位数为小数,中位数不算进去所以先取整得下半部数字个数,然后+1除2得第二个中位数;

if int(q2)=q2 and mod(int(q2),2)=1 then qm_3=q2-1+qm_1;*中位数为奇数,中位数算进去所以-1退归0位,然后加Q1;

else if int(q2)=q2 then qm_3=q2+qm_1;*中位数为偶数,中位数不算进去,因此中位数处于0位,直接加Q1;

else qm_3=int(q2)+qm_1;*中位数为小数,中位数不算进去,因此中位数取整退归0位,加Q1;

q_3=qm_3=q3;

q_1=qm_1=q1;

run;

proc print;run;

           通过q_3和q_1,我们可以判断生成结果是否与univariate的结果相同。根据生成的记过逆向推导,q1和q3的计算方法如下:

1、当整体数据中位数的秩次为奇数时:先求完整体的中位数,然后继续对上下两部分数据再各自求中位数,上下两部分数据均要包含整体中位数本身。此时这两个中位数依然是各自数据的一部分,都不需要通过平均数来计算。这两个中位数就是q1和q3。

举例来说:1,3,8,13,24,34,42,58,67

中位数为24,他的秩次是5为奇数。故对上下两部分分别求中位数。

上半部(此时包含中位数24):1,3,8,13,24

下半部(此时包含中位数24):24,34,42,58,67

再次计算中位数可得,Q1=8,Q3=42

2、当整体数据中位数的秩次为偶数或者为小数时:计算和前面相同,唯一的区别是再次计算时要排除中位数。

举例来说:1,3,8,13,24,34,42

中位数为13,他的秩次是4为偶数。故对上下两部分分别求中位数。

上半部(此时排除中位数24):1,3,8

下半部(此时排除中位数24):24,34,42

再次计算中位数可得,Q1=3,Q3=34

接下来再举一个中位数的秩次为小数的例子:1,3,8,13,24,34,42,58

中位数为13和24的均值18.5,他的秩次是4.5为小数。故对上下两部分分别求中位数。

上半部(此时排除中位数24):1,3,8,13

下半部(此时排除中位数24):24,34,42 ,58

再次计算中位数可得,Q1=5.5,Q3=38

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容