這篇文章我們通過一個具體的例子來展示SAS中的實現方法。我們用的數據來源是荷蘭格羅寧根市腎臟和血管終末期疾病預防(PREVEND)的隊列研究(Joosten, 2014)。原數據含有較多變量,小編自己對數據進行了簡化。其中RFFT是結局指標,是一個連續(xù)型變量;我們想要研究的自變量是是否使用他汀類藥物(Statin)。此外,還包括了年齡(Age),性別(Gender),種族(Ethnicity),教育(Education),心血管疾病(CVD),糖尿病(DM),吸煙情況(Smoking),高血壓(Hypertension)這些協變量。其中,除了Age是連續(xù)型變量外,其他均為分類變量。數據共有4,095名患者,其中904名在治療組(statin =1),3,190名在對照組 (statin=0)。以下是數據的部分截圖:在SAS中,傾向性評分匹配和逆概率加權都可以在PROC PSMATCH下實現,所以放在一起說。PROC PSMATCH data = statin region = cs;CLASS statin gender ethnicity education cvd dm hypertension smoking;PSMODEL statin(treated='1') = age gender ethnicity education cvd dm hypertension smoking;MATCH distance = lps method = greedy(k=1) exact = (gender) caliper = 0.25 weight = none;ASSESS ps var = (age gender rfft cvd dm hypertension) /stddev = treated stdbinvar = yesplots = (boxplot(display = (RFFT)) barchart(display = (gender)) cloudplot(display = (age)) stddiffplot(ref=0.1));OUTPUT out(obs = match) = psm_output;這是實現傾向性評分匹配部分的完整代碼,我們一步步來看。/* PROC PSMATCH data = statin region = cs; */??這一條是調用PSMATCH這個procedure。data= 告訴SAS我們要分析的數據文件是statin; region= 是明確匹配的數據范圍。這里的“cs”代表common support,就是我們之前提到的重疊區(qū)域。這里除了cs外還可以改成allobs,這樣匹配范圍就是所有個體了。/* CLASS statin gender ethnicity education cvd dm hypertension smoking;*/??這一步定義了分類變量statin, gender等。/* PSMODEL statin(treated='1') = age gender ethnicity education cvd dm hypertension smoking; */??這一步就是根據我們選定的協變量計算每個個體相應的PS值。PSMODEL默認使用的模型是logistic regression。等號左側是我們的分組變量statin or not,括號里treated = '1’ 告訴SAS當statin = 1表示治療組。等號右側是協變量,注意這里我們不能把結局變量 (RFFT) 也納入模型。/* MATCH distance = lps method = greedy(k=1) exact = (gender) caliper = 0.25 weight = none; */??上一步中我們計算出了PS,而MATCH這一步就是實施匹配的具體細則。Distance = 選定指定距離,可選值有ps, lps, mah,分別表示PS, logit PS, 和馬氏距離(對PS進行的某種處理)。這里我們選擇了lps。Method = 則選定匹配方法,greedy表示貪婪算法也即我們之前所述的最近鄰匹配,k = 1表示治療組與對照組按照1:1匹配,若k = 2則表示按照1 : 2匹配etc。除了greedy外,還有optimal, full, 和varratio等方法。Exact = 指定必須精確匹配的變量,這里我們選擇了gender,即要求匹配對象的性別必須是完全一致的,exact = 可以指定多個變量。Caliper = 定義了卡鉗值,我們之前提到過,即匹配對象PS或LPS的差值不能超過某個數,一般默認值是0.25。Weight = 是權重,在1:1的匹配情況下,每個個體所占權重是等價的,即都等于1。/* ASSESS ps var = (age gender rfft cvd dm hypertension) /stddev = treated stdbinvar = yesplots = (boxplot(display = (RFFT)) barchart(display = (gender)) cloudplot(display = (age)) stddiffplot(ref=0.1)); */??ASSESS statement是評估匹配效果的。 “/”之前的ps和var = 明確了想要評估的對象,“/”之后則告訴SAS我們想要以怎樣的方式對這些對象進行評估。SAS會自動生成一個表格,顯示匹配前后的PS值和變量組間差異的平均值、方差和標準均值差 (SMD) 等。Stddev = 明確了在計算SMD時用到的方差是所有個體pooled還是僅治療組treated的方差。Stdbinvar = yes表明對二分類變量的SMD進行標準化。在plots = 里,我們可以根據自己的需求生成箱線圖、條形圖和云圖。Stddiffplot (ref=0.1)描述了各變量SMD的分布,然后將推薦范圍限定為±0.1。/* OUTPUT out(obs = match) = psm_output; */??最后將匹配成功的數據輸出,命名為psm_output。這是一個對PSM結果總結的表,告訴我們輸入和輸出表格的基本情況??梢钥吹轿覀兿薅ㄆヅ鋮^(qū)域CS后,重疊區(qū)域的上限和下限分別是0.03和0.96,共匹配成功了720對,匹配前后PS的均值和均值差。這兩張圖和表其實說的是一件事,展示了匹配前后PS值以及我們選定的各變量的均值差及其方差,以及SMD。我們可以看到匹配后所有變量和PS值的差值都在±0.1范圍內,說明我們的匹配效果很好。這些就是部分變量的箱線圖、條形圖和云圖,同樣是對其匹配前后的分布進行可視化。總體上看來,匹配后的兩組達到了非常好的平衡。下面簡單說一說SAS中逆概率加權的實現。大致上和PSM非常像,只是把MATCH statement換成了PSWEIGHT,語句也更加簡單。weight = 明確了加權方式,分為atewgt和attwgt兩種,根據逆概率加權的權重定義(研究組權重為1/PStreatment,對照組,權重為1/(1- PStreatment)),應選擇atewgt。在ASSESS statement中,我們在plots里又加了一個wgtcloud即權重的云圖。最后output里,注意這里我們沒有做match,所以無法output matched sets,要把obs = 換成all,輸出全部觀察值。PROC PSMATCH data = statin region = cs; CLASS statin gender ethnicity education cvd dm hypertension smoking;PSMODEL statin(treated='1') = age gender ethnicity education cvd dm hypertension smoking;PSWEIGHT weight = atewgt;ASSESS ps var = (age gender rfft cvd dm hypertension) /stddev = treated stdbinvar = yesplots = (boxplot(display = (RFFT)) barchart(display = (gender)) cloudplot(display = (age)) stddiffplot(ref=0.1) wgtcloud);OUTPUT out(obs = all) = ipw_output;這里可以看到輸出的數據里多了一列atewgt,即每個個體被賦予的權重。我們看一下權重云圖:可以看到無論是治療組還是對照組,其權重分布幾乎都在推薦的limit (兩條灰色虛線)以內,表明我們的weighting沒有太大問題。通過以上學習我們發(fā)現,SAS中PSMATCH Procedure功能強大,可以非常完整地完成傾向性評分匹配和逆概率加權,并且根據我們的需求設定不同參數和計算方法,語言簡潔直接,很好上手。
|