作者liton (欧吉桑留学生)
看板Statistics
标题Re: [问题] SAS排列组合
时间Fri Nov 11 19:52:35 2011
在提供这几天排列组合的处理方法前,有些事情要先解释一下
如果你只想看怎麽写程式,请直接按END
一、排列组合与抽样的差异
之所以需要产出排列组合,并不是因为要pdf
pdf是抽样所产出,但是排列组合是要产出所有的可能性且一个不能漏
例如铜板丢100次,
我想问的是总共有多少可能的结果,而不是问正面出现30次的机率有多少
二、原始问题
之所以要产出排列组合
是因为在modeling的过程中,所有流程都是环环相扣
以最单纯的Logistic而言
或许stepwise,backward,forward的筛选方法可以产出一组效度最高的模型
但这个的模型有些问题
1.不保证其他统计测试过的了
例如变数间的相关性与方向性、无母数检定、稳定性相关测试
2.实务应用
就实务而言,End User并非会挑效度最高的模型
有些变数凑在一起应用实务上的解释互相冲突,
或是变数集中於某个面向而忽略某个面向
3.业界采Try Error寻求最适模型
一般业界的作法是用stepwise,backward,forward先寻求出一组变数组合後
在用try error的方式加入新变数或剔除原有变数
然後再去检视各流程与最终user的意见
但假设候选变数有20个要产出一个变数数量介於10~12个模型
不管try erro多少组
对这个天文数字的变数组合来说根本是过於稀少
三、规划
1.原始构想
专案时程规划而言
以try error的方式一次产出一个符合各项统计指标的模型
然後再跟End User确认
一个Cycle跑下来少说也两个礼拜,
那倒不如花一个礼拜写个能够测试所有变数组合的自动筛选程式
然後End User从中挑选一个较能接受的最佳模型
2.挑战
统计结果的产出与连结,以及条件自动判断只是coding时间上的问题
比较大的挑战在於如何从多个变数中产出变数组合,这包括了:
(1)抑制排列组合的数目
假设有20个变数,要从中挑出10个变数的排列组合就有C(20,10)=184,756种
更别说有更多的候选变数,以及挑出更多不同样本数
我的解法是先分群,例如先依照变数性质拆分成5群
C(4,2)^5=7,776种
(2)产出变数组合
呼~~终於说到重点了
请先参考SAS得这份官方文件
http://goo.gl/aSWaQ (请注意SAS 9.2後才有这FUNCTION)
SAS基本上是以ARRAY的方式来处理输入与输出的问题
输入部分要先将你要候选变数变成一串ARRAY
输出部分SAS不会一开始就给你一整个排列组合的TABLE
而是一次只产出一个排列组合,然後你得用回圈的方式取出各种排列组合
范例:将A、B、C、D、E五个变数中取出三个的变数组合
data TEST;
array x[5] $3 ('A' 'B' 'C' 'D' 'E'); /*以ARRAY输入变数*/
n=dim(x); /*总共有多少个变数*/
k=3; /*抽几个变数*/
ncomb=comb(n,k); /*总共会有多少总排列组合*/
do j=1 to ncomb+1; /*以回圈方式堆叠各个组合的ARRAY*/
call allcomb(j, k, of x[*]);
OUTPUT;
end;
run;
感觉上有点不方便啦
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 210.71.218.254
※ 编辑: liton 来自: 210.71.218.254 (11/11 19:54)
1F:推 kokolotl:好详细! 11/11 22:49
2F:推 west1996:推!!不过我有一个小疑问,为什麽要ncomb+1,看官网的范例 11/12 00:51
3F:→ west1996:一的output最後一个好像是redundant的@@ 11/12 00:51
4F:→ liton:那一段我也看不懂,我在写的时候会把最後一比删掉 11/12 02:54
5F:推 bugle:单纯是要demo当count大於C(m,n)的产出? 11/14 11:56
6F:推 west1996:感谢liton的回答,bugle的说法看来是目前最合理的解释@@ 11/14 18:16