楼主: harlon1976
6005 34

[原创博文] 请教这个程序应该如何编写 [推广有奖]

  • 2关注
  • 27粉丝

版主

院士

54%

还不是VIP/贵宾

-

威望
1
论坛币
33781 个
通用积分
135.1232
学术水平
25 点
热心指数
39 点
信用等级
17 点
经验
59249 点
帖子
1928
精华
0
在线时间
4352 小时
注册时间
2005-8-27
最后登录
2025-12-9

楼主
harlon1976 发表于 2010-3-11 15:39:37 |AI写论文
100论坛币
假设数据集中有变量两个,分别为数值型的x和字符型的class。假设有如下5个观测:
x     class
1      A
5      B
4      A
2      B
8      A
在这个数据集中,变量class有两个取值,分别为A、B,如果现在考察对变量class进行重新排序,根据概率论知识:这里有5条观测,分成两类,一类(A类)有3个,第二类(B类)有2个,则可以重新组合的结果为10种,例如下面的结果就是其中的两种:
x         class                x           class
1            A                   5              B
4            A                   2              B
8            A                   8              A
5            B                  1               A
2            B                  4               A
现在的问题是:如何根据原始的数据集,编写SAS程序生成所有的10种结果。
如果现在不只是A、B两类,比如3类,类似的程序又如何编写呢?请高手给予解决。

关键词:sas程序 数据集 数值型 字符型 概率论 概率论 程序 如何 知识

回帖推荐

jingju11 发表于9楼  查看完整内容

I think here is binomial and otherwise multinomial if class has more than 2 levels. If more than 2 levels for the class, probably I will do the combination each and then combine them together by Cartesian method provided by proc SQL. JingJu

crackman 发表于4楼  查看完整内容

data a; input x class $@; cards; 1 A 5 B 4 A 2 B 8 A ; run; proc sort; by class x; run; proc append base=a data=a; run; data b; set a; class1=lag1(class); class2=lag2(class); class3=lag3(class); class4=lag4(class); class5=lag5(class); xn=class; x1=lag1(x); x2=lag2(x); x3=lag3(x); x4=lag4(x); x5=lag5(x); run; data c(drop=class5 xn x5); set b; ...

本帖被以下文库推荐

沙发
soporaeternus 发表于 2010-3-11 15:49:52
我的理解是10=5!/(3!*2!)

即只与A、B的顺序有关,和x的排列没关系,即A间无差别

LZ是不是这个意思
Let them be hard, but never unjust

藤椅
harlon1976 发表于 2010-3-11 15:54:03
这里不考虑x的影响,当然x随着class的变动而同步变动,你的理解公式完全正确,请给出这个程序,好象你以前就帮我解决个问题,希望你这次还能帮帮我,谢谢!

板凳
crackman 发表于 2010-3-11 16:44:52
data a;
input x class $@;
cards;
1      A
5      B
4      A
2      B
8      A
;
run;
proc sort;
by class x;
run;
proc append base=a data=a;
run;
data b;
set a;
class1=lag1(class);
class2=lag2(class);
class3=lag3(class);
class4=lag4(class);
class5=lag5(class);
xn=class;
x1=lag1(x);
x2=lag2(x);
x3=lag3(x);
x4=lag4(x);
x5=lag5(x);
run;
data c(drop=class5 xn x5);
set b;
where class5 ^=' ' and x5^=.;
run;
proc print;
run;

结果出来了,但是组合成数据集,还要努力,时间有限,期待下面的人写完
已有 2 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子
eijuhz + 100 热心回答他人疑问

总评分: 经验 + 3  论坛币 + 103   查看全部评分

报纸
crackman 发表于 2010-3-11 16:45:58
最好能写成一个宏文件出来
抛砖引玉。。。。

地板
soporaeternus 发表于 2010-3-11 16:52:56
貌似不对吧......
Let them be hard, but never unjust

7
crackman 发表于 2010-3-11 16:59:08
x1-class1
x2-class2
x3-class3
x4-class4
x-class
可以优化一下
呵呵

8
harlon1976 发表于 2010-3-11 17:22:43
欢迎高手继续努力,我想大家主要是学知识,钱多少无所谓的,6楼还在考虑吧,谢谢你啊

9
jingju11 发表于 2010-3-12 06:24:43
harlon1976 发表于 2010-3-11 17:22
欢迎高手继续努力,我想大家主要是学知识,钱多少无所谓的,6楼还在考虑吧,谢谢你啊

  1. title 'All Combinations of (2 Choose 5) Integers';
  2. PROC PLAN;
  3.       factors combination=10 ordered
  4.              group = 2 of 5 comb;
  5.       ods output Plan = Combinations;
  6. RUN;
  7. DATA  Combinations_1;
  8. SET Combinations;
  9. ARRAY XX{5} $;
  10. DO I = 1 TO 5;
  11.   IF group1 = I THEN XX[I] = 'B';
  12.    ELSE IF group2 = I THEN XX[I] = 'B';
  13.     ELSE XX[I] = 'A';
  14.   class = XX[I];
  15.   NA = SUM(NA, (class = 'A')); NB = SUM(NB, (class = 'B'));
  16.   N = NA*(class = 'A')+NB*(class = 'B');
  17.       OUTPUT;
  18. END;
  19. KEEP combination class N;
  20. RUN;
  21. DATA RAW;
  22. INPUT X  class  $;
  23. IF _N_ = 1 THEN DO;
  24.   NA = 0; NB = 0;
  25. END;
  26.   NA +(class = 'A'); NB +(class = 'B');
  27.   N = NA*(class = 'A')+NB*(class = 'B');
  28. DATALINES;
  29. 1      A
  30. 5      B
  31. 4      A
  32. 2      B
  33. 8      A
  34. ;
  35. PROC SQL;
  36. CREATE TABLE Total AS
  37.   SELECT a.combination, a.class, b.X FROM Combinations_1 AS a, RAW AS b
  38.    WHERE a.class = b.class AND a.N = b.N;
  39. QUIT;
  40. %MACRO OUTPUTmcr;
  41. %DO I = 1 %TO 10;
  42.   DATA D&I;
  43.    SET Total (WHERE = (combination = &I));
  44.   RUN;
  45. %END;
  46. %MEND OUTPUTmcr;
  47. %OUTPUTmcr
  48. ;
复制代码


I think here is binomial and otherwise multinomial if class has more than 2 levels.
If more than 2 levels for the class, probably I will do the combination each and then combine them together by Cartesian method provided by proc SQL.
JingJu
已有 2 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子
eijuhz + 100 热心回答他人疑问

总评分: 经验 + 3  论坛币 + 103   查看全部评分

10
harlon1976 发表于 2010-3-12 09:05:20
感谢楼上兄弟的无私奉献,我要仔细学习,我再问一下,如果还是2类,但观测个数不是五个,例如共有n个,其中A有x个,B有y个,则总共的结果有N=n!/(x!*y!),那么这个程序中的一些参数应该如何调整,最好能将这些参数放在宏中,能够任意附值。请兄弟再赐教啊。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 03:41