对数据进行子分组并在循环内使用宏来绘制直方图

Sub grouping the data and using macro inside a loop to draw a histogram

我正在使用 sas 9.4

我有一个 10000x7 的数据集,看起来像这样

survtime cont Trial SurvI Treat PatID Sim
1 2.271536 2.6398586 1 1 0 1 1
2 2.920410 -0.1787789 1 1 0 2 1
3 1.328392 -2.1513527 1 1 0 3 1
4 11.433881 2.2132001 1 1 0 4 1
5 20.264126 0.9029487 1 0 1 5 1
6 19.827590 0.3236216 1 0 1 6 1

最后一列是 'Sim' 取值 1 到 10,每 1000 次更改一次, 像 1 到 1000 sim=1 1001 到 2000 模拟=2 . . 9001 到 10000 模拟=10

然后我有一个宏

%NORMSURV(data=prostate,true=survtime,trueind=survind,surrog=psa,treat=treat,center=trial,patientid=patid,copula=houggard,adjustment=weighted,imagefmt=eps);

我想 运行 这个宏为每个 sim 值得到两个值 TAU 和 R2

我想澄清一点假设没有 'sim',只有 1000x6 我可以获得这些值

proc print data=sur_measure_clay ;
VAR TAU R2;
run;

使用 运行 那个代码。

现在我有 10 个,我可以手工完成,但我将有 100 个来绘制直方图 我想 运行 保留这 2 个值以获得直方图。 'data=sur_measure_clay' 是来自宏的默认名称。 谢谢

在我看来,完成此任务的正确方法是修改宏以在整个数据集中绘制直方图。 假设宏 %NORMSURV 像您描述的那样工作,可以按如下方式完成:


/*  there is no need to use proc sql
if you know how much of iteration do you have */

proc sql noprint;
    select distinct max(sim)  
        into : max_iter 
        from prostate;
    quit;

%put Maximum value of Sim Variable : &max_iter;


然后你可以把你的宏放在另一个循环里

%macro sim_iterate;

    %do iter  =  1 %to &max_iter;
        data tmp;
            set prostate;
                where sim = &max_iter;
        run;

        /* Run your instructions */

    %end;
%mend;

%sim_iterate;