Макрос SAS: Как мне записать про c означает вывод в одном наборе данных? - PullRequest
0 голосов
/ 12 апреля 2020

[У меня есть этот кусок кода. Тем не менее, макрос в pro c univariate генерирует слишком много отдельных наборов данных из-за l oop t от 1 до 310. Как я могу изменить этот код, чтобы включить все pro c одномерный вывод в один набор данных, а затем изменить остальные кода для более эффективного запуска?]


%let L=10; %* 10th percentile *;
%let H=%eval(100 - &L); %* 90th percentile*;
%let wlo=V1&L V2&L V3&L ;
%let whi=V1&H V2&H V3&H ;
%let wval=wV1 wV2 wV3 ;
%let val=V1 V2 V3;

%macro winsorise();

%do v=1 %to %sysfunc(countw(&val));
%do t=1 %to 310;
proc univariate data=regressors noprint;
var &val;
output out=_winsor&t._V&v pctlpts=&H &L
prtlpre=&val&t._V&v;
where time_count<=&t;run;
%end;
data regressors (drop=__:);
set regressors;
if _n_=1 then set _winsor&t._V&v;
&wval&t._V&v=min(max(&val&t._V&v,&wlo&t._V&v),&whi&t._V&v);
run;
%end;
%mend;

Спасибо.

1 Ответ

0 голосов
/ 13 апреля 2020

Предположим, у вас есть данные time_count, x1, x2, x3 с выборками на каждые 0,5 единицы времени.

data regressors;
  call streaminit(123);
  do time_count = 0 to 310 by .5;
    x1 = 2 ** (sin(time_count/6) * log(time_count+1));
    x2 = log2 (time_count+1) + log(time_count/10+.1);
    x3 = rand('normal', 
    output;
  end;
  format x: 7.3;
run;

Сгруппируйте данные в группы на основе целочисленных уровней time_count. Стек составлен из полного внешнего соединения с критериями меньше (<=). Каждая группа идентифицируется top time_count в группе.

proc sql;
  create table stack as
  select 
    a.time_count
  , a.x1
  , a.x2
  , a.x3
  , b.time_count as time_count_group            /* save top value in group variable */
  from      regressors as a
  full join regressors as b                     /* self full join */
  on a.time_count <= b.time_count               /* triangular criteria */
  where
  int(b.time_count)=b.time_count                /* select integer top values */
  order by
  b.time_count,  a.time_count
  ;
quit;

Теперь вычислите ВСЕ ваши статистические данные для ВСЕХ ваших переменных для ВСЕХ ваших групп в одном go. Без макроса, без суеты, без суеты.

proc univariate data=stack noprint;
 by time_count_group;
 var x1 x2 x3;
 output out=_winsor n=group_size pctlpts=90 10 pctlpre=x1_ x2_ x3_; 
run;
...