Printing 如何输出SAS IML值以进行打印
我想获取在IML中计算的值,以便在SAS的打印功能%PRNTINIT中使用。此功能用于从数据库中提供每周报告,以便进行更新 我有一些遗留代码,使用Printing 如何输出SAS IML值以进行打印,printing,sas,Printing,Sas,我想获取在IML中计算的值,以便在SAS的打印功能%PRNTINIT中使用。此功能用于从数据库中提供每周报告,以便进行更新 我有一些遗留代码,使用proc sql声明稍后调用的宏类型值,例如: 声明变量:tot1-tot4 调用变量tot1-tot4进行打印 如果可能的话,我希望能够从IML调用类似的值 示例数据: data test ; input age type gender $; cards; 1 1 m 1 1 m 1 1 m 1 1 f 1 1 f 1 2 f 2 1 m 2
proc sql
声明稍后调用的宏类型值,例如:
声明变量:tot1-tot4
调用变量tot1-tot4进行打印
如果可能的话,我希望能够从IML调用类似的值
示例数据:
data test ;
input age type gender $;
cards;
1 1 m
1 1 m
1 1 m
1 1 f
1 1 f
1 2 f
2 1 m
2 1 f
2 2 m
2 2 m
2 2 m
2 2 m
2 2 m
2 2 f
2 2 f
2 2 f
;
proc freq data = test;
tables type*age / chisq norow nocol nopercent outexpect out=out1 ;
tables type*gender / chisq norow nocol nopercent outexpect out=out2 ;
run;
options missing=" ";
proc iml;
reset print;
use out2;
read all var {count} into count;
type1 = count[1:2] ;
type2 = count[3:4] ;
tab = type1 || type2 ;
cols = tab[+,] ;
rows = tab[,+] ;
tot = sum(tab) ;
perc = round(cols / tot, .01) ;
cell_perc = round(tab / (cols//cols) , .01) ;
expect = (rows * cols) / tot ;
chi_1 = sum((tab - expect)##2/expect) ;
p_chi_1 = 1-CDF('CHISQUARE',chi_1, ((ncol(tab)-1)*(nrow(tab)-1)));
print tab p_chi_1 perc cell_perc;
out_sex = tab || (. // p_chi_1);
print out_sex;
print out_sex[colname={"1","2"}
rowname={"f" "m" "p-value"}
label="Table of Type by Gender"];
call symput(t1_sum, cols[1,1]) ;
%let t2_sum = put(cols[1,2]) ;
%let t1_per = perc[1,1] ;
%let t2_per = perc[1,2] ;
%let t1_f = tab[1,1] ;
%let t1_m = tab[2,1] ;
%let t2_f = tab[1,2] ;
%let t2_m = tab[2,2] ;
%let t1_f_p = cell_perc[1,1] ;
%let t1_m_p = cell_perc[2,1] ;
%let t2_f_p = cell_perc[1,2] ;
%let t2_m_p = cell_perc[2,2] ;
%let p_val = p_chi_1 ;
***** is it possible to list output values here for use in table building ??? ;
* like: %let t1_f = tab[1,1]
%let t2_f = tab[2,1] etc... ;
quit;
因此,我想声明如下打印语句:
%print( "(N=&tab[1,1], column = 1, just=center, lines = bottom:none);
%print( "(N=&tab[1,2], column = 2, just=center, lines = bottom:none);
etc...
非常感谢您在这方面的任何帮助
更新:无法从IML中提取声明的宏值 我已经能够计算出正确的值并成功地格式化表格 但是,我无法提取打印宏中使用的值 我在IML中创建了一些矩阵和计算值,但当我试图声明宏变量以供以后使用时,返回的唯一内容是我声明变量为的文本值。。。e、 g: 及 你可以在表中看到我想要的数字,但到目前为止还没有成功。我尝试过使用
%let
、put
、symput
和symputx
,但没有成功
call symput(t1_sum, cols[1,1]) ;
%let t2_sum = put(cols[1,2]) ;
%let t1_per = perc[1,1] ;
%let t2_per = perc[1,2] ;
%let t1_f = tab[1,1] ;
%let t1_m = tab[2,1] ;
%let t2_f = tab[1,2] ;
%let t2_m = tab[2,2] ;
%let t1_f_p = cell_perc[1,1] ;
%let t1_m_p = cell_perc[2,1] ;
%let t2_f_p = cell_perc[1,2] ;
%let t2_m_p = cell_perc[2,2] ;
Blerg…SAS/IML矩阵必须全部为数字或全部为字符,这就是您的尝试失败的原因。但是,SAS/IML PRINT语句有几个选项,可用于标记列和行以及应用格式。看见 与global SAS OPTIONS语句一起,我认为您可以获得所需的输出 1) 使用全局语句
options missing=" ";
告诉SAS将缺少的值打印为空白
2) 您的目标是在2x2选项卡矩阵中附加一列。对于没有数据的行,可以使用(数字)缺失值:
out_age = tab || (. // p_chi_1);
3) 现在可以打印此2x3表,并使用COLNAME=和ROWNAME=选项显示行标题:
print out_age[rowname={"1","2"}
colname={"f" "m" "p-value"}
label="Table of Type by Gender"];
如果您真的想使用旧式宏,可以使用SYMPUTX语句将SAS/IML中的值复制到宏变量中,如本文所示:经过大量搜索,并找到一些帮助,我能够将答案拼凑在一起
symputx
,以便修剪额外的空白(与symput
相比)将IML值提取到宏变量的代码
用于使用旧SAS%PRNTINIT宏生成表的部分代码
预期结果:
你到底想在这里完成什么?%PRINT不是SAS中的内置宏,因此您使用的是一些自定义宏(可能是这一个?;如果是这样的话,那篇论文是在1996年写的(!!),而且已经过时,与此无关)。现在你会用ODS来做你建议的事情。您要查找的输出究竟是什么样子的?这是文本文件、PDF、RTF/Word文件、HTML吗?@Joe同意这是一项非常古老的技术,您提到的网站是我唯一能找到它的参考资料的地方。目标是生成一个RTF文件,我们可以将其编译成一份周报。然而,所有需要的表格都是由研究团队“勾勒出来的”(类似于网站上的图5)。因此,我们使用
%print
功能按指定构建表。它相当乏味,但很稳定。我当然愿意接受其他建议。在没有看到“草图”的情况下,我不能具体地说什么,但一般来说,通过ODS RTF和PROC报告或打印,或者ODS文本,你应该能够提出任何合理的建议[或者至少足够接近研究人员通常认为是可以的],或过程模板和一个FREQ/tablate/etc.PROC。这是一个很好的起点——它有一个很好的PROC模板示例,可以让您的颜色和表格格式正确,并且具有很大的灵活性。我想,一旦你学会了,就应该少很多乏味的东西。我已经尝试了你的建议,但我仍然对如何从IML中获得数字感到困惑。我已经用我迄今为止尝试过的方法更新了上面的代码,但是没有用。正如你所看到的,我已经让print宏运行良好,只需要填写数字…按照博客文章中的说明使用SYMPUTX,而不是%LET。例如,调用symputx(“t1_sum”,cols[1,1]);
out_age = tab || (. // p_chi_1);
print out_age[rowname={"1","2"}
colname={"f" "m" "p-value"}
label="Table of Type by Gender"];
call symputx('t1_sum', char(cols[1,1])) ;
call symputx('t2_sum', char(cols[1,2])) ;
call symputx('t1_per', char(perc[1,1])) ;
call symputx('t2_per', char(perc[1,2])) ;
call symputx('t1_f' , char(tab[1,1])) ;
call symputx('t1_m' , char(tab[2,1])) ;
call symputx('t2_f' , char(tab[1,2])) ;
call symputx('t2_m' , char(tab[2,2])) ;
call symputx('t1_f_p' , char(cell_perc[1,1])) ;
call symputx('t1_m_p' , char(cell_perc[2,1])) ;
call symputx('t2_f_p' , char(cell_perc[1,2])) ;
call symputx('t2_m_p' , char(cell_perc[2,2])) ;
call symputx('p_val' , char(round(p_chi_1, .001))) ;
...
%print("Female", column = 1, just = center );
%print("&t1_f (&t1_f_p)", column = 2, just = center );
%print("&t2_f (&t2_f_p)", column = 3, just = center );
%print(, column = 4, just = center );
%print(proc = newrow);
%print("Male", column = 1, just = center );
%print("&t1_m (&t1_m_p)", column = 2, just = center );
%print("&t2_m (&t2_m_p)", column = 3, just = center );
%print("&p_val", column = 4, just = center );
...