※ 引述《west1996 (焦了六年變脆了)》之銘言:
: ※ 引述《JoJoHuang (Mr.小喬)》之銘言:
: : 但是只配對到最相近的那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)
: group by one.id
: having abs(one.ta-two.ta)=min(abs(one.ta-two.ta))
: order by one.id
: ;
: 在分號前面加上上面這三行就行了,不過如果運氣不好剛好有超過兩筆TA的差相同的話,
: 全部都會列出來
: 除非另外有篩選條件...
: : Run;
: 另外
: 用sql語法時要用quit來結尾
: 用run的話sql不會真的關掉
: : 在此例中,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.是甚麼意思呢?
: 這個log只是說上面那一段sql跑的時候因為資料結構的限制所以沒辦法最佳化
: 不過還是可以跑
: 所以除非你很要求程式效能
: 不然可以忽略不看
: : 我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.55.1
以下真的受益匪淺,有一個延伸的問題請教
因為有的時候配到最適合的那個對照公司因為資料可得性不能用,
這時候就要找第二順位了,
之前我用macro作配對的時候,可以利用排序和 _n_ 的設定
留下最相近的五筆資料備用,或者作match-portfolio
想請問在sql裡面如果想留下最相近的五筆配對資料,應該要怎麼下指令呢?
謝謝
--