楼主: playmore
3623 10

[问答] 请问SAS调用JavaObj接口时遇到的基础问题,与赋值有关 [推广有奖]

学科带头人

2%

还不是VIP/贵宾

-

TA的文库  其他...

R相关

经济学相关

金融工程

威望
1
论坛币
16309 个
通用积分
7.1397
学术水平
372 点
热心指数
394 点
信用等级
341 点
经验
15297 点
帖子
1194
精华
1
在线时间
1331 小时
注册时间
2007-1-11
最后登录
2023-12-15

初级学术勋章 初级热心勋章 中级热心勋章

100论坛币
我现在想用SAS调用Barra Optimizer(一个优化软件),求解最优化的问题
Barra Optimizer提供了Java的接口,而SAS支持调用JavaObj来访问Java的类库

SAS调用JavaObj的基本要求是所有东西在一个data步里完成;而SAS的Obj使用Barra Optimizer要先初始化一些对象,比如一个相关系数矩阵,它提供的对象方法是一行一行的输入。综合上述两点,一个示例语句如下所示:
data _null_;
...
declare javaobj rm('com/barra/optimizerSAS/CRiskModelSAS',objID);  /* 创建了一个风险模型对象,里面有设置相关系数的方法 */
rm.callVoidMethod('SetFactorCovariance','FactorA','FactorB',0.618);  /* 开始一行行的赋值 */
...

run;

现在我的问题是如何从一张相关系数表中一行行的取出'FactorA','FactorB',cov的数据,然后写出一行行如上所示的代码。关键的难点还在于这些东西要在一个data步里完成。

我想过在这个data步之外用sql的select into取一行数据,再写出一行代码,再赋给一个宏变量,再到data步里运行下这个宏变量,但如果有个几千行,就要有几千个宏变量,不太实际也太麻烦。

请高手指教。

最佳答案

HaricH 查看完整内容

定义hash对象,将系数表存入hash对象。然后在data步里面用键值查找。
关键词:Java jav covariance OPTIMIZE variance 接口 软件 Java
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛
沙发
HaricH 发表于 2011-10-25 10:35:02 |只看作者 |坛友微信交流群
定义hash对象,将系数表存入hash对象。然后在data步里面用键值查找。

使用道具

藤椅
playmore 发表于 2011-10-25 10:44:59 |只看作者 |坛友微信交流群
我还想过用call execute的方法,在data步里调用过程步或是一个宏。

我先建了一个宏,大致如下所示:
%macro ab();
%do i=1 to n;
proc sql noprint;
select factora,factorb,cov into :fa,:fb,:cov from covchart where _n_=&i;
quit;
rm.callVoidMethod('SetFactorCovariance',"&fa","&fb",&cov);
%mend;

然后在data步中加上
call execute('%ab');

问题是SAS不认 rm.callVoidMethod('SetFactorCovariance',"&fa","&fb",&cov); 这一句
错误报告如下:
ERROR 180-322: Statement is not valid or it is used out of proper order.

我在官网上看到说call execute中要是直接调用宏,就立即执行宏,所以可能这行语句不在data步里执行,所以没法识别这是给一个Java对象的方法赋初值。
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

板凳
playmore 发表于 2011-10-25 11:01:21 |只看作者 |坛友微信交流群
还有一个最简单的方法,可在data步里调用宏,而这个宏里面就是简单的一行行的赋值语句,如下所示:

%macro ab();
rm.callVoidMethod('SetFactorCovariance', 'GEMM_SIZE', 'GEMM_SIZE', 6.485/10000);
rm.callVoidMethod('SetFactorCovariance', 'GEMM_SUCCESS', 'GEMM_SUCCESS', 1.899/10000);
rm.callVoidMethod('SetFactorCovariance', 'GEMM_SUCCESS', 'GEMM_SIZE', 2.308/10000);
...
%mend;

这样的话,我的问题就简化成为了如何写一个宏,来自动生成上面所示的宏?
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

报纸
kuhasu 发表于 2011-10-25 13:48:47 |只看作者 |坛友微信交流群
SAS, MATLAB, and R Interface Guide

使用道具

地板
playmore 发表于 2011-10-25 14:40:35 |只看作者 |坛友微信交流群
kuhasu 发表于 2011-10-25 13:48
SAS, MATLAB, and R Interface Guide
这篇文档我看过,里面关于SAS的sample例子中只是4个asset
我的portfolio里有很多asset
所以不可能用那个例子里一行行手输的方法
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

7
kuhasu 发表于 2011-10-25 19:10:40 |只看作者 |坛友微信交流群
Barra我木有。这种商业软件。公司买了,直接问客服。

使用道具

8
playmore 发表于 2011-11-3 10:14:57 |只看作者 |坛友微信交流群
HaricH 发表于 2011-11-1 14:58
定义hash对象,将系数表存入hash对象。然后在data步里面用键值查找。
你好,你的建议很有用,多谢了

现在我又发现了一个问题,就是我先建立好了哈希表,如下所示:
length FactorA $15 FactorB $15 Cov 8;
declare hash fc(dataset:"FactorCovariance",ordered:"ascending");
fc.defineKey("FactorA","FactorB");
fc.defineData("FactorA","FactorB","Cov");
fc.defineDone();

原来赋值的语句是rm.callVoidMethod('SetFactorCovariance', 'GEMM_SIZE', 'GEMM_SIZE', 6.485/10000);
因此我的哈希表就是这样的:
FactorA           FactorB            Cov
'GEMM_SIZE'    'GEMM_SIZE'    0.0006485
...

然后我开始循环定义Java对象,如下所示:
rm.callVoidMethod('SetFactorCovariance', FactorA, FactorB, Cov);
但并不能正确的给Java对象赋值

所以我就想问下在Hash表的遍历中,只能用put语句把他put出来吗?还能有像我这样的应用吗?
我在网上的材料中给的有关遍历的例子都极为简单,不能回答我的问题
所以在这里请教高手了,谢谢!

playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

使用道具

9
HaricH 发表于 2011-11-7 10:13:07 |只看作者 |坛友微信交流群
data a;
do f1=1 to 100;
        do f2=1 to 100;
                c=ranuni(123);
                output;
        end;
end;
run;

data _null_;
length f1 f2 c 8.;
if _n_=1 then do ;
        declare hash factor(dataset:'a');
        declare hiter iter('factor');
        factor.definekey('f1','f2');
        factor.definedata('f1','f2','c');
        factor.definedone();
        call missing(f1,f2,c);
end;
rc=iter.first();
do while(rc=0);
        /*operate*/
        put f1= f2= c=;
        rc=iter.next();
end;
run;

使用道具

10
HaricH 发表于 2011-11-7 10:23:41 |只看作者 |坛友微信交流群
一定要再一个DATA步还是一定要再一个DATA步循环做定义?
如果一个data步就更容易了。
data a;
do f1=1 to 100;
        do f2=1 to 100;
                c=ranuni(123);
                output;
        end;
end;
run;

data _null_;
set a;
/*call ...*/
run;

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 00:30