全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3487 8
2009-05-26

想要用线性规划lp程序处理一批数据,每次格式一样,但是数据略有不同。想用一个变量替代改变的数据,那么可以节省工作量,但操作了一下,没能成功......

数据量较大,不可能一个个的操作,请各位SAS达人指点一二,谢谢

比如就像下面这个程序中,我想把a的值带到下面这个过程中去,但是程序报错。

data dea;                                                                                                                              
a=1;                                                                                                                                 
input _row_ $ x1-x3 _type_ $ _rhs_;                                                                                                    
cards;                                                                                                                                 
object  1 1 1 min  .                                                                                                                 
inpu1  a 2 3 <= 20                                                                                                                     
inpu2  0.5 4 1 >= 10                                                                                                                   
;                                                                                                                                      
proc lp;                                                                                                                               
run;


[此贴子已经被作者于2009-5-26 14:08:17编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-5-26 11:48:00

LZ,可否把问题说得更清楚一些?偶估计 用 SAS MACRO 似乎是一个可行的方案!

仅供参考,谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-5-26 12:29:00

the defiction of problem is vague or fuzzy, please clarify the problem

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-5-26 12:38:00

是这样的,我想运用DEA方法计算一批企业的效率,但运用SAS的运筹学模块只能一次计算一家企业的。即是有n组线性规划问题,而每组线性规划问题的约束条件仅仅有个别数据的差别。我就想编一个程序,把变化的那部分用变量来代替,而每次只需给这个变量赋予不同的值。但是在SAS中不能实现一样。比如就像下面这个程序中,我想把a的值带到下面这个过程中去,但是程序报错。

data dea;                                                                                                                               
a=1;                                                                                                                                 
input _row_ $ x1-x3 _type_ $ _rhs_;                                                                                                    
cards;                                                                                                                                 
object  1 1 1 min  .                                                                                                                 
inpu1  a 2 3 <= 20                                                                                                                     
inpu2  0.5 4 1 >= 10                                                                                                                   
;                                                                                                                                      
proc lp;                                                                                                                               
run;

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-4 12:08:00

LZ,坦白地讲,偶并不喜欢复杂的编程,看到复杂的程序代码就眼晕。所以,偶编程能力一直都很烂!

但这里可以提供一个思路供参考:

1、建议把您的数据保存为 excel 数据表, 或者 别的你认为比较拿手的数据库文件;

2、每次做 LP 时不要直接用 data 步 建立数据集,而是用 proc import 过程导入,然后做您想需要的 LP;

3、当遇到极少量需要修改的变量或观测值时,不要试图直接 在 SAS 之 DATA 步进行修改,而是在 excel 表 进行少量修改,这样就可大大节省时间和精力;

4、当再次需要做 LP 时,用 Proc import 过程 调入 经修改的数据文件即可。

(以上仅供参考,希望能够对 LZ 有所帮助,谢谢!)

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-4 13:33:00
*抛块砖头,不考虑PROC LP出错或者算不出的情况,结果保存到gml;
data dea;
input _row_ $ x1-x3 _type_ $ _rhs_;
cards;
object  1 1 1 min  .
inpu1  . 2 3 <= 20
inpu2  5 4 1 >= 10
;

%macro doit(out=, a=1);
proc sql;
    update dea set x1=&a where _row_='inpu1';
quit;
proc lp data=dea printlevel=-2 primalout=xxx(keep=_var_ _value_);
run;
proc transpose data=xxx out=yyy(keep=x1-x3 inpu1 inpu2 object);
    id _var_;
    var _value_;
run;
data zzz;
    a  = &a;
    set yyy;
proc append base=&out data=zzz;
proc datasets nolist;
    delete xxx yyy zzz;
quit;
%mend;
%doit;

proc datasets nolist;
    delete gml;
quit;
data a;
    input a;
    call execute(cats('%doit(out=gml, a=', a, ')'));
datalines;
0
1
2
3
5
10
20
100
;
run;
*狗R的几次才贴得上!;

[此贴子已经被作者于2009-6-4 13:38:36编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群