我正在编写一个程序来循环访问变量列表,运行 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;
我已经在“详细信息”文本框中描述了所有内容。
你们非常接近。您需要使用
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;