SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1123|回复: 9
打印 上一主题 下一主题

求助:抽样排列问题?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-6-15 22:22:26 | 只看该作者

求助:抽样排列问题?

求助:抽样排列问题?

1、有几类样本。例如:A类、B类、C类......
2、各类样本中的样本数量不一定相等。例如:
   A类样本中有8个,分别是1、2、3、4、5、6、7、8
     B类样本中有7个,分别是9、10、11、12、13、14、15
     C类样本中有5个,分别是16、17、18、19、20
3、分别从这三类样本中抽取下列个数。
   从A类样本中分别抽取1个、或2个、或3个
   从B类样本中分别抽取1个、或2个
   从C类样本中分别抽取0个、或1个
4、把从这三类样本中抽取的观测,分别放入三个变量 d1、d2、d3 中。
   假如1:从A类样本中抽取1个,B类样本中抽取1个,C类样本就必然有1个。组合成下列:
   d1  d2  d3
     1    9    16
     1    9    17
     1    9    18
     ...........
     8    15   19
     8    15   20
     假如2:从A类样本中抽取1个,B类样本中抽取2个,C类样本就必然是0个。组合成下列:
   d1  d2  d3
     1    9    10
     1    9    11
     1    9    12
     ...........
     8    13  15
     8    14  15
    假如3:从A类样本中抽取2个,B类样本中抽取1个,C类样本就必然是0个。
    假如4:从A类样本中抽取3个,B类样本中必然是0个,C类样本就必然是0个。

求助:如何编程,按照从这三类样本中抽取的个数,得到全部的排列组合?

   谢谢!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-6-15 22:48:27 | 只看该作者

Re: 求助:抽样排列问题?

data test(keep=d1 d2 d3);
array A{8}  (1 2 3 4 5 6 7 <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->;
array B{7}  (9 10 11 12 13 14 15);
array C{5}  (16 17 18 19 20);
array total{20}  A1-A8 B1-B7 C1-C5;
;
do i=1 to 18;
        do j=i+1 to 19;
                do k=j+1 to 20;
                        d1=total{i};
                        d2=total{j};
                        d3=total{k};
                        output ;
                end;
        end;
end;
run;

proc print ;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-6-17 11:37:24 | 只看该作者

Re: 求助:抽样排列问题?

谢谢  l7764168  回复!!
我没说清楚,这不是我想得到的答案。 再求助各位!!
我将问题改一下。
1、A类样本中有4个,分别是1、2、3、4
     B类样本中有3个,分别是5、6、7
     C类样本中有2个,分别是8、9
2、从A类样本中抽取1个到2个
   从B类样本中抽取1个到2个
   从C类样本中抽取0个到1个

想得到下列抽样组合:
d1   d2   d3
1     5     8
1     5     9
1     6     8
1     6     9
1     7     8
........
1     2     5
1     2     6
1     2     7
1     3     5
1     3     6
1     3     7
1     4     5
.......
3     4     7
也就是,
当a类抽取1个,b类抽取1个,c类抽取1个,
   d1 的观察是a类样本,d2 的观察是b类样本,d3 的观察是c类样本.
当a类抽取1个,b类抽取2个,
   d1 的观察是a类样本,d2 的观察是b类样本,d3 的观察是b类样本.
当a类抽取2个,b类抽取1个,
   d1 的观察是a类样本,d2 的观察是a类样本,d3 的观察是b类样本.

如果当a类抽取0个,b类抽取2个,c类抽取1个,
   d1 的观察是b类样本,d2 的观察是b类样本,d3 的观察是c类样本.

谢谢!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-6-17 20:01:02 | 只看该作者

Re: 求助:抽样排列问题?

基本思想是,重复数组A,然后注意循环初始值和结束值,

data test(keep=d1 d2 d3);
array A{8} (1 2 3 4 1 2 3 4 );
array B{3} (5 6 7 );
array C{2} (8 9);
array total{13} A1-A8 B1-B3 C1-C2;
;
do i=1 to 4;
do j=5 to 11;
do k=max(9,j+1) to 13;
d1=total{i};
d2=total{j};
d3=total{k};
output ;
end;
end;
end;
run;

proc print ;
run;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-6-17 20:20:16 | 只看该作者

Re: 求助:抽样排列问题?

再次谢谢 l7764168 您的帮助!!
   好象不对。

我有一个笨方法:
data a  (keep=d1-d3);
array hm[9] (1 2 3 4   5 6 7   8 9);
do a=1 to 2; /*从A类样本中抽取1个到2个 */
do b=1 to 2; /*从B类样本中抽取1个到2个 */
do c=0 to 1; /*从C类样本中抽取0个到1个 */

/*对从三类样本各抽取的数量进行组合排列,就有111、120、210.
111 表示A类样本中抽取1个、B类样本中抽取1个、C类样本中抽取1个 */

if a=1 and b=1 and c=1 then  /*当抽取组合是111时*/
   do a111=1 to 4;
      d1=hm{a111};
   do b111=5 to 7;
      d2=hm{b111};
   do c111=8 to 9;
      d3=hm{c111};
output;
end; end; end;

if a=1 and b=2 and c=0 then  /*当抽取组合是120时*/
   do a120=1 to 4;
      d1=hm{a120};
   do b120=5 to 7;
      d2=hm{b120};
   do c120=b120+1 to 7;
      d3=hm{c120};
output;
end; end; end;

if a=2 and b=1 and c=0 then  /*当抽取组合是210时*/
   do a210=1 to 4;
      d1=hm{a210};
   do b210=a210+1 to 4;
      d2=hm{b210};
   do c210=5 to 7;
      d3=hm{c210};
output;
end; end; end;

end;  end; end;
run;

问题:在现实中,变量比较多(6-7个)每类样本数量又不同,如果一一列举排列,非常麻烦。

求助:有没有什么好的方法?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-6-17 20:29:40 | 只看该作者

Re: 求助:抽样排列问题?

不好意思啊,第二个循环应该设为do j=6 to 11;
错了一位。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-6-17 21:46:49 | 只看该作者

Re: 求助:抽样排列问题?

楼主,解答程序已经在论坛内消息给你,请注意查收!
请注意开始我写的宏介绍
[code:3su7wmel]
/*宏参数介绍
sampleName&#58;样本名称(要求英文)
set:样本内容(要求用空格分开)
number:取样个数
outtable:结果表       
调用示例:从集合A{a b c d}中选3个元素的所有组合,生成结果表result
调用方法:%a(A,a c b d,3,result);
*/
[/code:3su7wmel]
注意,你原来集合的元素是数字型的,我这个宏偷懒结果表中一概都转换成字符型了,忘请谅解。
如有需要,你可以自己改动。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-6-18 17:33:29 | 只看该作者

Re: 求助:抽样排列问题?

[code:134j1kzk]
楼主,原先发给你的程序,我修改过了,
现在这版更好,已经在论坛内消息给你,
请注意查收!
[/code:134j1kzk]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-6-18 21:11:33 | 只看该作者

Re: 求助:抽样排列问题?

非常谢谢 byes 您热心帮助!!!
    我将您的程序运算了,非常正确,解释也清楚,您费心了。
    我是一个刚学SAS的新手,没学过PROC CLP  语句,有些宏语句也没搞懂,但解释清楚知道怎样用。

    谢谢!!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-6-18 22:03:36 | 只看该作者

Re: 求助:抽样排列问题?

楼主同志:
第一版程序我用是or的proc clp,后来发现这样做效率不是最好。
所以改成第二版了,就是用data步了
这样效率好点,而且对SAS软件的要求也少点,只要base就够了
否则还需要or模块。
所以你还是用第二版吧。
不过第一版的proc clp有时候很有用。比如说数独求解,字母方程求解等问题,均可以用这个proc来解决。
至于你说程序有些看不懂,这需要你自己去努力学sas了,我相信不久将来,你一定能看懂的。 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 17:58 , Processed in 0.146943 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表