2016-12-23 5 views
0

루프의 모든 값을 저장하지 않고 5 백분위 수와 95 백분위 수를 계산하는 방법이 있습니까?SAS에서 루프의 값을 저장하지 않고 백분위 수를 계산할 수 있습니까?

%let it=10000; 
data test; 
    length arrayStore$32767; 
    arrayStore=''; 
    sum=0; 
    min=99999; 
    max=-99999; 
    do i=1 to ⁢ 
     number=rand('Uniform'); 
     sum + number; 
     if number<min then min=number; 
     if number>max then max=number; 
     arrayStore=catx(' ',arrayStore,round(number,0.1)); 
    end; 
    mean=sum/&it; 

    P5=0; *?; 
    p95=0; *?; 

    * count numbers in arrayStore; 
    do j=1 to countw(arrayStore, ' ', 's'); 
    end; 
run; 

나는 이것이 가능하다고 생각하지 않지만, 이것을 달성하는 최선의 선택은 무엇인가?

문자열에 값을 저장하고 정렬하여 x 번째 포스팅을 찾으십니까? 10k 숫자 변수에 저장 하시겠습니까?

이미 다른 레코드 (행)에 숫자를 저장하려고했지만 34Gb 데이터 세트로 이어 지므로 정렬에 오랜 시간이 걸리고 평균과 P2_5 및 P97_5 값만 필요합니다. 더 적은 값을 저장하여 컴퓨팅 속도를 높이려고합니다.

감사합니다.

+0

proc 수단 또는 단 변수를 사용하는 대신 데이터 단계에서 요약 통계를 계산하려는 이유가 있습니까? – Reeza

+0

@Reeza 예, 정렬 할 필요없이 2.5와 97.5 백분위 수 (프로 시저 의미가 아님)를 원합니다 (단 일산 변수가 아님) –

+0

proc은 무엇을 의미합니까? 작업에 가장 적합한 도구 – Reeza

답변

2

임시 배열에 임의의 숫자를 저장하고 SAS 기술 통계 함수를 사용하면 더 직접적으로 원하는 것을 얻을 수 있다고 생각합니다.

%let it=10000; 
data test; 
    call streaminit(811486001); 
    array x[&it] _temporary_; 
    do i=1 to &it; 
     x[i] = round(rand('Uniform'),.01); 
     end; 
    mean = mean(of x[*]); 
    p05 = pctl(5,of x[*]); 
    p95 = pctl(95,of x[*]); 
    put 'NOTE: ' (p:)(=); 
    run; 
%put NOTE: &=sysrandom; 
0

Proc 단 변수가 더 나은 방법입니다.

proc univariate data=sashelp.class noprint; 
var weight; 
output out=want pctlpts=2.5 97.5 PCTLPRE=P; 
run; 

proc print data=want; 
run;