修改SAS宏以打印二分变量信息

Modification of a SAS macro to print dichotomous variable information

我正在尝试修改以下 SAS 宏,以便它包含变量 CHD 的百分比,当它同时等于 0 和 1 时。目前此宏仅设置为打印出基线变量的结果当 CHD(慢性心脏病)等于 1 时。我认为需要在 data routfreq&i 步骤中进行修改,但我不太确定如何设置它。然后我还需要一个额外的列来打印出“没有冠心病 * % (n)”。

%macro categ(pred,i);
 proc freq data = heart;
 tables &pred * chd / chisq sparse outpct out = outfreq&i ;
 output out = stats&i chisq;
 run;
 proc sort data = outfreq&i;
 by &pred;
 run;


proc means data = outfreq&i noprint;
 where chd ne . and &pred ne .;
 by &pred;
 var COUNT;
 output out=moutfreq&i(keep=&pred total rename=(&pred=variable)) sum=total;
 run;

data routfreq&i(rename = (&pred = variable));
 set outfreq&i;
 length varname .;
if chd = 1 and &pred ne .;
rcount = put(count,8.);
 rcount = "(" || trim(left(rcount)) || ")";
 pctnum = round(pct_row,0.1) || " " || (rcount);
index = &i;
 varname = vlabel(&pred);
 keep &pred pctnum index varname;
 run;

data rstats&i;
 set stats&i;
 length p_value .;
 if P_PCHI <= 0.05 then do;
 p_value = round(P_PCHI,0.0001) || "*";
 if P_PCHI < 0.0001 then p_value = "<0.0001" || "*";
 end;
 else p_value = put(P_PCHI,8.4);
 keep p_value index;
 index = &i;
 run;


data _null_;
 set heart;
 call symput("fmt",vformat(&pred));
run;

proc sort data = moutfreq&i;
 by variable;
 run;
 proc sort data = routfreq&i;
 by variable;
 run;
 data temp&i;
 merge moutfreq&i routfreq&i;
 by variable;
 run;

data final&i;
 merge temp&i rstats&i;
 by index;
 length formats .;
 formats=put(variable,&fmt);
 if not first.index then do;
varname = " ";
p_value = " ";
 end;
 drop variable;
 run;
%mend;


%categ(gender,1);
%categ(smoke,2);
%categ(age_group,3);

%macro names(j,k,dataname);
 %do i=&j %to &k;
 &dataname&i
 %end;
 %mend names;

data categ_chd;
 set %names(1,3,final);
 label varname = "Demographic Characteristic"
 total = "Total"
pctnum = "Coronary Heart Disease * % (n)"
 p_value = "p-value * (2 sided)"
formats = "Category";
 run;

ods listing close;
ods rtf file = "c:\nesug\table1a.rtf" style = forNESUG;
proc report data = categ_chd nowd split = "*";
 column index varname formats total pctnum p_value;
 define index /group noprint;
compute before index;
 line ' ';
endcomp;
 define varname / order = data style(column) = [just=left] width = 40;
 define formats / order = data style(column) = [just=left];
 define total / order = data style(column) = [just=center];
 define pctnum / order = data style(column) = [just=center];
 define p_value / order = data style(column) = [just=center];
 title1 " NESUG PRESENTATION: TABLE 1A (NESUG 2004)";
 title2 " CROSSTABS OF CATEGORICAL VARIABLES WITH CORONARY HEART DISEASE OUTCOME";
run;
ods rtf close;
ods listing; 

另外,这段代码在运行时出现如下错误:

NOTE: PROCEDURE MEANS used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


NOTE: Character values have been converted to numeric values at the places given by:
      (Line):(Column).
      1:2
NOTE: Numeric values have been converted to character values at the places given by:
      (Line):(Column).
      3:111

我认为这个宏需要修改,以便它在 运行 带有 categorical/character 变量时不会崩溃。

if chd = 1 and &pred ne .;

是什么导致您的输出只有 CHD =“1”。您可以将其更改为:

if chd = 1 and &pred ne .;

我不明白你要求增加专栏。也许 post 当前输出和您想要的输出的示例?

至于"errors"(实际上是注释,因为它们不会导致系统停止处理),当变量自动从数字转换为字符时发生,反之亦然。它提供了发生的代码行以及发生的次数。我宁愿尽可能多地删除这些注释,以避免不当强制的意外后果。为此,您将使用 PUT 和 INPUT 函数。