作者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
推 west1996:只要是「可以清楚寫下配對邏輯」的規則,就一定有辦法跑 07/06 17:44
→ west1996:出來,只有快慢和系統loading的問題而已,建議把實際的問 07/06 17:45
→ west1996:題和變數還有比對邏輯放上來,大家比較好給建議 07/06 17:45
→ JoJoHuang:已修改,將問題更清楚地描述了,不知道這樣ok嗎>"<? 07/06 18:17
推 liton:給個資料實例吧... 07/06 18:29
→ JoJoHuang:有放上sas code了,希望有更清楚地說明我的問題了>"< 07/06 19:34
※ 編輯: JoJoHuang 來自: 140.116.186.244 (07/06 21:09)
→ ASD332:1.查 uniform function 2. 查 Cartesian product 07/06 23:48
→ liton:where (two.TA between one.TA*1.1 and one.TA*0.9);哪有這 07/07 00:14
→ liton:樣寫的啦~~ 只能用 EQ 07/07 00:14
→ liton:難怪會有Cartesian product joins的問題 07/07 00:15
→ JoJoHuang:不能這樣寫啊...>"< 謝謝! 我再研究一下>"< 07/07 08:45
→ JoJoHuang:我看了一下,是不是一對多配對就會有這句話呢>_<? 07/07 10:12
→ JoJoHuang:還在研究怎麼樣指定符合這段區間,但又只配對到最近值@@ 07/07 10:13
→ JoJoHuang:之所以不用= 是因為很難找到1個TA完全一模一樣的觀測值 07/07 11:20
→ ASD332:這樣寫沒錯 一般資料庫的確很少用到 cross join 07/07 14:14
→ ASD332:但在配對的做法上 這是很常見的 07/07 14:14
→ ASD332:另外 你要最接近的值 = 兩者的差相距最小 要記得有正負號 07/07 14:19