这个data有37747个关于付款的数据,现在已经按照大小排序好,最少付款额是1块,最高是61125.21,现在想从这37747个数据里面选出600个sample在付款额上代表整个数据。一种想法是因为这些钱数都比较分散,并不是平均分布的,所以用SRS的方法不太合理。所以想到既然是要对钱数做sample,那就索性做10个strata,每一个strata里面包含10%的total payment,这样的话,落在0-10%的数据最多,然后10%-20%里面其次,这样下去,90%-100%里面数据最少,然后按照一定比例,在每个strata里面抽取一定量的sample,最后合成600个。
我现在的想法是既然要取600个sample,那我可以直接做600个strata,这样的话,每个strata里面随机取一个数据去表征这一个strata,然后把这600个sample合并起来。但是实际操作中发现,因为数据是付款大小排列,最高的金额61125.21可能已经占到整个付款额的1%左右,那样第600个或者第599个strata里面只会有一个数据,那样选的话,最大的几个值一定会选中,这样就会使整个sample的有些skew to the right.
proc sql;
create table sum as
select sum(payment) as total from sorted
;
quit;
data sort1;
if _n_=1 then set sum;
set sorted;
cum+payment;
strata=ceil((cum/total)*600);
run;
有时候用这种方法都不一定能够得到600个strata,可能差了1-2个,所以我的想法就是把最后几个里面只有一个数据的strata合并成一个新的strata,然后倒着推上去,重新把剩下的数据按照付款额再分599个strata,把最后几个里面只有一个数据的strata合并成一个新的strata,然后以此从下往上类推上去,直到里面所有的strata里面都至少含有两个数据以上,然后再用SRS的方法每个strata里面取出一个数据来。
我自己试了一下,可能是我自己写程序的时候逻辑还不是很清楚,所以折腾了好半天也不行,不知道版上有没有哪位兄弟可以一起与我讨论一下,甚至提出一些更好的方法来呢?



雷达卡




京公网安备 11010802022788号







