Предположим, у вас есть данные 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;