如何在SAS不同过程步间复用输出变量?新手技术问询
解决SAS中PROC IML变量传递到其他PROC的问题
嘿,作为SAS新手碰到这种跨过程传递变量的问题太正常啦!我来帮你捋清楚怎么把PROC IML里生成的u变量用到后续的PROC UNIVARIATE中~
问题根源
PROC IML的工作空间是独立的,里面生成的变量(比如你的u)默认不会自动保存到SAS的数据集里,所以后续的PROC UNIVARIATE根本找不到这个变量。核心解决思路就是:把IML里的变量导出到一个SAS数据集,然后其他PROC就可以直接调用这个数据集了。
修改后的完整代码
我给你调整了原代码,关键是在PROC IML里添加导出u的语句,然后在PROC UNIVARIATE里引用新生成的数据集:
/* 假设你的FA2数据集已经存在,原代码里的DATA FA2; SET FA2;可以去掉,除非要修改原数据集 */ proc iml; start main; use FA2; read all var {Close}; s = Close; u = j(nrow(s)-1,1,0); do i=2 to nrow(s); u[i-1]=log(s[i]/s[i-1]); end; n=nrow(s)-1; rsigma=sqrt(252/n*(u'*u)); mu = mean(u); call qntl(q, u); print q[rowname={"P05", "P95"}]; s_quart = quartile(u); /* 这里把变量名改成s_quart,避免和原s变量重名覆盖 */ PRINT mu, rsigma, s_quart; /* 关键步骤:把IML中的u变量导出到SAS数据集u_data */ create u_data var {u}; append; close u_data; finish; run; /* 现在可以直接用新生成的u_data数据集来跑PROC UNIVARIATE */ PROC UNIVARIATE DATA = u_data; var u; /* 这里可以加你需要的其他选项,比如histogram、qqplot等 */ run;
额外小技巧:如果想把u和原数据集合并
如果你希望把差分后的u和原FA2数据集放在一起(注意:u的行数比FA2少1行,因为是相邻两行的对数差分),可以这样调整导出逻辑:
/* 在PROC IML的finish前添加:创建包含原Close和u的数据集,给第一行的u补缺失值 */ fa2_u = j(nrow(s), 2, .); /* 创建n行2列的矩阵,初始为缺失值 */ fa2_u[2:nrow(s), 1] = s[2:nrow(s)]; /* 原Close变量从第二行开始 */ fa2_u[2:nrow(s), 2] = u; /* u对应到第二行及以后 */ fa2_u[1, 1] = s[1]; /* 第一行的Close保留 */ create fa2_with_u from fa2_u[colname={"Close" "Log_Return"}]; append; close fa2_with_u;
之后你就可以用PROC UNIVARIATE DATA=fa2_with_u; var Log_Return;来分析啦。
注意事项
- 变量名尽量避免重名:原代码里你用了
s存储Close,又用s=quartile(u),这会覆盖原来的s变量,我改成了s_quart避免冲突。 - 行数匹配:
u是n-1行,原FA2是n行,合并时记得处理第一行的缺失值,不然会报错哦。
内容的提问来源于stack exchange,提问作者rakesh
相关产品推荐
相关产品推荐

