SAS中文论坛

标题: 给大家拜年!顺便请教个问题 [打印本页]

作者: shiyiming    时间: 2009-1-26 15:40
标题: 给大家拜年!顺便请教个问题
Happy 牛 Year!   <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->


问题如下,一个数组为一个变量,如下:
1
n
n
n
n
2
m
m
m
m
m
1
n
n
2
1
n
n
n
n
n
n
n
n
2
m
m
m
m
m

值的所有形式就是1,2,n,m,而每个1,2一组,2肯定在1后面,每组1和2间全是n。
n可以是b和g两个值,所以我想把b和g的全排列赋值给n,那么这个全排列就是由n的个数决定的。
把不同的排列都建新的变量。
1 1 1 1 1...1 1...1...1...1
n g g g g...g b...g...g...g
n b g g g...g g...g...b...g
n b b g g...g b...b...g...g
n b b b g...g b...b...g...g
2 2 2 2 2...2 2...2...2...2
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m
1 1 1 1 1...1 1...1...1...1
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
2 2 2 2 2...2 2...2...2...2
1 1 1 1 1...1 1...1...1...1
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
n b b b b...g b...b...g...g
2 2 2 2 2...2 2...2...2...2
m m m m m...m m...m...m...m
m m m m m...m m...m...m...m

1,2,m其实不用管,只要直接引用赋值,然后再用排列赋值就行了。

所以想请教下,有没有什么巧一点儿的方法。另外,上面生成的数据集,每个变量都是要单独作为因变量y来搞,也就是说,要建n的全排列数那么多的模型,很是麻烦,有没有好些的办法?

谢谢!
<!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
作者: shiyiming    时间: 2009-1-27 12:19
标题: Re: 给大家拜年!顺便请教个问题
data a;
input a $;
cards;
1
n
n
n
n
2
m
m
m
m
m
1
n
n
2
1
n
n
n
n
n
n
n
n
2
m
m
m
m
m

;
run;
data a1;
set a;retain c 0;
b=_n_;
if a='n' then b =0;
if a='n' then c =c+1;
run;
data a2;
set a1;
if a='n' then delete;
run;
proc sql;
select max(c) into :a3 from a2;
quit;
/*
proc transpose data=a1 out=a2;
var a b;
run;*/
%macro x(n);
data a4;
%do i=1 %to %eval(&amp;n);
do m&amp;i='b','g';
%end;
output;
%do i=1 %to %eval(&amp;n);
end;
%end;
run;
%mend;
%x(14);
data a5;
set a2;
keep a b;
run;
proc transpose data=a5 out=a6;
var a;
id b;
run;
%macro z;
data a6;
set a6 a6;
run;
%mend z;
%macro y(m);
%do i=1 %to %eval(&amp;m);
%z;
%end;
%mend;
%y(14);
data f1;
set a6;
keep _1;
run;
data f2;
set a4;
keep m1-m4;
run;
data f3;
set a6;
keep _6-_12;
run;
data f4;
set a4;
keep m5 m6;
run;
data f5;
set a6;
keep _15 _16;
run;
data f6;
set a4;
keep m7-m14;
run;
data f7;
set a6;
keep _25-_30;
run;
data end;
merge f1 f2 f3 f4 f5 f6 f7;
run;
%macro rename(old,new);
data end;
set end;
rename &amp;old=&amp;new;
run;
%mend;
%macro rename2;
%rename(_1,y1);
%do i=2 %to 5;
%let z=%sysevalf(&amp;i-1);
%rename(m&amp;z,y&amp;i);
%end;
%do j=6 %to 12;
%rename(_&amp;j,y&amp;j);
%end;
%do x=13 %to 14;
%let x2=%sysevalf(&amp;x-8);
%rename(m&amp;x2,y&amp;x);
%end;
%rename(_15,y15);
%rename(_16,y16);
%do e=17 %to 24;
%let e2=%sysevalf(&amp;e-10);
%rename(m&amp;e2,y&amp;e);
%end;
%do r=25 %to 30;
%rename(_&amp;r,y&amp;r);
%end;
%mend;
%rename2;
上面是我写的代码,拿去运行,就可以了。上面的data f1-data-f7也可以用宏编程完成,14个n这个数字也可以放在宏变量里面,但是太麻烦了,直接写了。会生成30个变量的,2**14个观测。如果觉得格式不行,可以转置。
proc transpose data=end out=finish2;
var y1-y30;
run;
但是2**14个变量会打不开的。
你的第二问,如果你要处理2**14个变量数是没有意义的,太多了。
如果你是处理30个变量,可以用宏编程。
将格式相同的proc部写在macro proc部里面(r1,r2)
每次调用改变r1和r2变量刘可以了,还可以用宏循环,生成语句。
希望对你有帮助,新年快乐。
作者: shiyiming    时间: 2009-1-27 17:22
标题: Re: 给大家拜年!顺便请教个问题
谢谢!
我大概算了下总共要使真的全排了,要3百多万个 <!-- s:? --><img src="{SMILIES_PATH}/icon_confused.gif" alt=":?" title="Confused" /><!-- s:? -->
很是麻烦~
作者: shiyiming    时间: 2009-1-28 09:13
标题: Re: 给大家拜年!顺便请教个问题
彻彻底底的根本看不懂问题的描述。。。。。。。。。。。。。。。。。。。。
作者: shiyiming    时间: 2009-1-28 09:23
标题: Re: 给大家拜年!顺便请教个问题
要不怎么是高人呢?
作者: shiyiming    时间: 2009-1-28 11:06
标题: Re: 给大家拜年!顺便请教个问题
不过这种情况的原因有很大的可能是对问题的理解已经很深入了,所以觉得很多东西不用解释了。。。。。。老夫也常犯这种错误。。。。
作者: shiyiming    时间: 2009-1-28 21:58
标题: Re: 给大家拜年!顺便请教个问题
呵呵,大家过年好~

这两天闲着没事儿干,所以才想搞搞这个,其实就是b,g在n的位置的全排。
不过出来的数量巨大,超出计算范围了,更别提,把那个数量巨大的集一条条抽出来做因变量来预测建模了,这点儿上我也是想不出个好的解决办法。
用非定向的挖掘的话,效果方面实在又不太好控制。 <!-- s:lol: --><img src="{SMILIES_PATH}/icon_lol.gif" alt=":lol:" title="Laughing" /><!-- s:lol: -->
作者: shiyiming    时间: 2009-2-3 16:03
标题: Re: 给大家拜年!顺便请教个问题
k总,这么意识流的问题,根本看不懂啊。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2