跳转至

SAS 分析宏

Table 1 宏程序

%macro table1(data=, strata=, vars=, cat_vars=);

    * 对连续变量计算描述统计;
    %let cont_vars =;
    %let i = 1;
    %let var = %scan(&vars, &i);
    %do %while(&var ne );
        %if %sysfunc(indexw(%str(&cat_vars), %str(&var))) = 0 %then
            %let cont_vars = &cont_vars &var;
        %let i = %eval(&i + 1);
        %let var = %scan(&vars, &i);
    %end;

    * 连续变量;
    proc means data=&data n mean std median q1 q3 min max;
        class &strata;
        var &cont_vars;
    run;

    * 分类变量;
    proc freq data=&data;
        tables &strata * (&cat_vars) / chisq;
    run;

%mend table1;

* 使用示例;
* %table1(data=adsl, strata=treatment, 
*          vars=age bmi sex race prior_med, 
*          cat_vars=sex race prior_med);

MMRM 分析宏

%macro run_mmrm(data=, out=, var=, subject=, treatment=, 
                 visit=, baseline=, cov_type=un);

    proc mixed data=&data method=reml;
        class &subject &treatment &visit;
        model &var = &treatment | &visit &baseline / ddfm=kr solution;
        repeated &visit / subject=&subject type=&cov_type;

        lsmeans &treatment*&visit / slice=&visit diff cl;

        ods output lsmeans=lsmeans
                   diffs=diffs;
    run;

    * 提取治疗效应;
    data &out;
        set diffs;
        where &treatment = 1;  * Placebo 为参考组;
        est = estimate;
        lower = estimate - 1.96 * stderr;
        upper = estimate + 1.96 * stderr;
        pval = probt;
        keep &visit estimate stderr lower upper probt;
    run;

%mend run_mmrm;

* 使用示例;
* %run_mmrm(data=adqs_adam, out=result_mmrm,
*            var=chg, subject=subject,
*            treatment=trt01pn, visit=avisitn,
*            baseline=base, cov_type=un);

生存分析宏

%macro surv_analysis(data=, time=, event=, group=);

    * KM 曲线;
    ods graphics on;
    proc lifetest data=&data plots=survival(atrisk=0 to 24 by 6);
        time &time * &event(0);
        strata &group;
    run;

    * Cox 回归;
    proc phreg data=&data;
        class &group;
        model &time * &event(0) = &group / risklimits;
        hazardratio &group;

        * 比例风险假设检验;
        assess ph / resample;
    run;

%mend surv_analysis;

* 使用示例;
* %surv_analysis(data=adtte, time=avalu, event=event, group=treatment);

森林图数据准备宏

%macro forest_prep(data=, time=, event=, subgroup=);

    * 获取所有亚组水平;
    proc sql;
        select distinct &subgroup into :levels separated by "|"
        from &data
        where &subgroup ne "";
    quit;

    * 循环每个亚组做 Cox;
    %let count = %sysfunc(countw(&levels, |));
    data forest_results;
        length subgroup $40 hr lower upper pval n 8;
        call missing(subgroup, hr, lower, upper, pval, n);
        output;
        stop;
    run;

    * 先做 Overall;
    proc phreg data=&data;
        model &time * &event(0) = treatment / risklimits;
        ods output ParameterEstimates=overall;
    run;

    data overall;
        set overall;
        subgroup = "Overall";
        hr = exp(estimate);
        lower = exp(hazardlower);
        upper = exp(hazardupper);
        keep subgroup hr lower upper probchisq;
    run;

    proc append base=forest_results data=overall; run;

    %do i = 1 %to &count;
        %let level = %scan(&levels, &i, |);

        proc phreg data=&data;
            where &subgroup = "&level";
            model &time * &event(0) = treatment / risklimits;
            ods output ParameterEstimates=sub;
        run;

        data sub;
            set sub;
            subgroup = "&level";
            hr = exp(estimate);
            lower = exp(hazardlower);
            upper = exp(hazardupper);
            keep subgroup hr lower upper probchisq;
        run;

        proc append base=forest_results data=sub; run;
    %end;

%mend forest_prep;

* 使用示例;
* %forest_prep(data=adtte, time=avalu, event=event, subgroup=region);