作者JoJoHuang (Mr.小乔)
看板Statistics
标题[程式] SAS配对如何配到最像的1笔资料?
时间Wed Jul 6 17:20:15 2011
[软体程式类别]:
SAS
[程式问题]:
利用SAS配对实验组与控制组时,
如何只配到指定变数最相近的1笔控制资料?
[软体熟悉度]:
低,只会用简单的指令,例如OLS,常常程式码写一堆。
[问题叙述]:
有在板上搜寻配对,知道可以用SQL进行配对,
并且可以设定配对的变数及其上下限。
例如:若控制组的年龄在实验组的加减1范围内则进行配对。
但是这样可能会配对到很多笔资料,
而网路搜寻到的一些方法是随机选取1笔。
想请问可以设定配对到最相近的1笔资料吗?
例如说:指定用A变数作为配对变数,
配对的上下限是正负10%内,
但是只配对到最相近的那1笔资料。
目的:计算调整控制组销售(Sales)後的异常Sales。
控制组的筛选条件:公司规模(TA)
配对逻辑:TA-10% ~ TA+10%
(例如:A公司的规模是100,符合配对的控制组公司的TA应介於90~110)
每一个公司会有当年度的Sales与TA,假设实验组A公司的Sales是200,TA是100。
另有控制组B公司与C公司,B公司的Sales是150,TA是95;
C公司的Sales是130,TA是101。
若设定配对上下限是TA-10% ~ TA+10%,B公司与C公司皆符合配对条件。
然而,这里只想要配对"TA介於上下限内"且"最相近的公司",
在此逻辑下,A公司应该与C公司配对,因为C公司的TA=101,与A公司的TA=100最相近。
因此,A公司当年度的异常Sales应为200-130=70。
目前只会设定上下限,可是不会设定"只配对最相近的公司"。
实例:
data study control;
infile cards;
rand_num=uniform(0);
input id study TA Sales @@;
if study=1 then output study;
else output control;
cards;
1 1 100 200
2 1 200 400
3 0 95 150
4 0 101 130
5 0 190 230
;
Run;
proc sql;
create table controls_id as
select
one.ID as study_id,
two.ID as control_id,
one.TA as study_TA,
two.TA as control_TA,
one.Sales as study_sales,
two.Sales as control_sales,
one.rand_num as rand_num
from study one, control two
where (two.TA between one.TA*1.1 and one.TA*0.9);
Run;
在此例中,id 1的观测值是实验组,依据TA*0.9~TA*1.1的筛选条件,
他会与id 3与id 4配对,但是我想请问能否指定只配对到TA最相近的对照组,
也就是id 4呢?
例外有两个小问题想请教一下:
1. rand_num是甚麽意思呢?
2. sas log回覆说 The execution of this query involves performing one or more
Cartesian product joins that can not be optimized.是甚麽意思呢?
我Match完後的资料如下:
study_id control_id study_TA control_TA study_Sales control_sales rand_num
1 3 100 95 200 150 0.2469
1 4 100 101 200 130 0.2469
2 5 200 190 400 230 0.0509
谢谢大家的指教!!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.186.244
1F:推 west1996:只要是「可以清楚写下配对逻辑」的规则,就一定有办法跑 07/06 17:44
2F:→ west1996:出来,只有快慢和系统loading的问题而已,建议把实际的问 07/06 17:45
3F:→ west1996:题和变数还有比对逻辑放上来,大家比较好给建议 07/06 17:45
4F:→ JoJoHuang:已修改,将问题更清楚地描述了,不知道这样ok吗>"<? 07/06 18:17
5F:推 liton:给个资料实例吧... 07/06 18:29
6F:→ JoJoHuang:有放上sas code了,希望有更清楚地说明我的问题了>"< 07/06 19:34
※ 编辑: JoJoHuang 来自: 140.116.186.244 (07/06 21:09)
7F:→ ASD332:1.查 uniform function 2. 查 Cartesian product 07/06 23:48
8F:→ liton:where (two.TA between one.TA*1.1 and one.TA*0.9);哪有这 07/07 00:14
9F:→ liton:样写的啦~~ 只能用 EQ 07/07 00:14
10F:→ liton:难怪会有Cartesian product joins的问题 07/07 00:15
11F:→ JoJoHuang:不能这样写啊...>"< 谢谢! 我再研究一下>"< 07/07 08:45
12F:→ JoJoHuang:我看了一下,是不是一对多配对就会有这句话呢>_<? 07/07 10:12
13F:→ JoJoHuang:还在研究怎麽样指定符合这段区间,但又只配对到最近值@@ 07/07 10:13
14F:→ JoJoHuang:之所以不用= 是因为很难找到1个TA完全一模一样的观测值 07/07 11:20
15F:→ ASD332:这样写没错 一般资料库的确很少用到 cross join 07/07 14:14
16F:→ ASD332:但在配对的做法上 这是很常见的 07/07 14:14
17F:→ ASD332:另外 你要最接近的值 = 两者的差相距最小 要记得有正负号 07/07 14:19