看板 Statistics 關於我們 聯絡資訊
[軟體程式類別]: 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