如何在 %DO 宏循环内进行条件处理? (SAS)

问题描述 投票:0回答:1

我正在编写一个程序来循环访问变量列表,运行 procsurveyfreq 和 procsurveylogistic,提取并格式化 ODS 输出,然后将这些全部附加到最终表中。我正在使用宏循环(下面的截断示例)来单独处理我的变量列表,运行我的过程并从 ODS 输出中提取我需要的内容(不包括 ODS 输出的数据步骤格式,这对我的问题来说不是必需的)。一旦我将 Surveyfreq 和 SurveyLogisitic 输出合并并修剪为最终表所需的内容,所有内容都会被强制附加到最终数据集。

这是我的问题:我需要分叉程序以便为不同的变量运行不同的回归模型。我需要使用“第一个”参考组运行一些副变量,而其他副变量则需要“2”参考组。我尝试过使用如下所示的 %IF/%THEN/%DO 语句,但它不起作用。

是否有某种方法可以让 %IF/%THEN 语句与沿着我的变量列表扫描的 &BYVAR 宏变量一起使用?您将如何解决分叉程序的问题?感谢任何建议。

%let ds=dataset;

%let outcome=nonadhere;

%let wgt=rxsewt;

%let repwgt=RXSE1--RXSE100;

%let covars=age_gp65;

%let &byvars= race sex adi income diabetes heart_any;
%macro loop;
  %global byvar i;
  %do i=1 %to %sysfunc(countw(&byvars));
    %let byvar =%scan(&byvars,&i);'

proc surveyfreq data=&ds method=brr(fay=0.3);       
        title 'Weighted / Unweighted n';    
    weight &wgt;    
    repweight &repwgt;  
    table &byvar*&outcome / row chisq ;
    ods output  CrossTabs = _ctab;
run;
title;

BUNCH OF DATA STEP PROCESSING HERE

%if &byvar in(race, sex, adi, income) %then %do;

PROC SURVEYLOGISTIC data=&ds method=brr(fay=0.30);
    weight &wgt;    
    repweight &repwgt;
    CLASS &byvar(Ref=first) &covars &outcome;
    MODEL &outcome (event='1')= &byvar &covars;
    ODS OUTPUT ParameterEstimates =_pe OddsRatios =_or;
RUN;

BUNCH OF DATA STEP PROCESSING HERE

%else %if &byvar in(diabetes, heart_any) %then %do;

PROC SURVEYLOGISTIC data=&ds method=brr(fay=0.30);
    weight &wgt;    
    repweight &repwgt;
    CLASS &byvar(Ref='2') &covars &outcome;
    MODEL &outcome (event='1')= &byvar &covars;
    ODS OUTPUT ParameterEstimates =_pe OddsRatios =_or;
RUN;

BUNCH OF DATA STEP PROCESSING HERE

%end;

/**Append to final dataset**/
proc append
    base=final
    data=output_clean force;
run;

  %end;
%mend;

%loop;

我已经在“详细信息”文本框中描述了所有内容。

sas macros do-loops
1个回答
0
投票

你们非常接近。您需要使用

in
minoperator
选项为宏启用
mindelimiter=
运算符。

%macro loop / minoperator mindelimiter=',';
...

%if &byvar in(race, sex, adi, income) %then %do;
...

%else %if &byvar in(diabetes, heart_any) %then %do;
...

%mend;
© www.soinside.com 2019 - 2024. All rights reserved.