Модификация макроса SAS для вывода информации о дихотомических переменных - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь изменить следующий макрос 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 $20.;
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 $8.;
 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 $20.;
 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

Я думаю, что этот макрос необходимо изменить, чтобы он не зависал при работе с категориальными / символьными переменными.

1 Ответ

0 голосов
/ 05 марта 2019

Строка

if chd = 1 and &pred ne .;

Это то, что заставляет ваш вывод иметь только CHD = "1" .. Вы бы изменили это на:

if chd = 1 and &pred ne .;

Я не понимаю вашузапрос на дополнительный столбец.Возможно, опубликуете пример текущего вывода и вывода, который вам нужен?

Что касается «ошибок» (на самом деле примечания, поскольку они не приводят к остановке системы), они возникают, когда переменная автоматически преобразуетсяот числового к символьному или наоборот.Он предоставляет строку кода, где это происходит и сколько раз это происходило.Я предпочитаю исключать эти записи как можно чаще, чтобы избежать непреднамеренных последствий ненадлежащего принуждения.Для этого вы должны использовать функции PUT и INPUT.

...