簡體   English   中英

與 MatchIt 粗化精確匹配

[英]Coarsened exact matching with MatchIt

我在包含約 18,300 行(即每個患者一行)的數據集上運行 MatchIt 包中的粗化精確匹配 (cem) 匹配方法。 我在兩個協變量上匹配患者病例。 這兩個協變量是診斷年齡(范圍為 0 到 76)和當前年齡(范圍為 1 到 90)。

我不想做1:1匹配; 相反,我的目標是通過匹配盡可能多的患者來最大程度地減少數據丟失。

我的問題源於試圖在精確平衡和近似平衡之間進行權衡。 我希望匹配個體的診斷和當前年齡的總變化不超過 2 年。 (如果非常罕見的 3 年差異是不可避免的,那沒關系——但總的來說,我希望將差異保持在不超過兩年。)兩年的差異可能是診斷年齡的兩年差異,當前年齡的兩年差異,或診斷年齡與當前年齡之間的兩年差異。 這個想法是我想嘗試在這兩個組中匹配個體的疾病持續時間。

我為 cutpoints 參數嘗試了許多不同的參數。 這是一個例子:

matchit <- matchit(Group ~ Last_recorded_age + Diagnosis_age, 
                   data = df,
                   method = 'cem',
                   cutpoints = list(Current_age = 44, Diagnosis_age = 38),
                  )

這將當前年齡分為 44 個區間,因此每個區間通常包含 2 年的范圍。 並且診斷年齡被分成每個包含 2 年的箱。 當我運行它時,除了 383 行之外的所有行都被分配了一個子類。 當我使用 match.data() 查看分配了子類的行時,我可以看到只有 25 行的診斷和當前年齡相差 3 年。 其余的變化不超過2年。 所以這很好 - 因為這就是我想要的。

但是,當我查看未分配子類的 383 行時,我發現有些事例未分配子類,而我原以為會被分配子類,因為它們與分配了子類的事例非常相似子類。 例如,一個子類包含一對個體,其中接受治療的個體當前年齡為 31 歲,診斷年齡為 28 歲,對照個體當前年齡為 30 歲,診斷年齡為 29 歲。但后來我看到了有一個無與倫比的對照個體,他的當前年齡為 31 歲,診斷年齡為 30 歲。我想知道為什么那個人沒有被分配到我剛才提到的子類中?

有沒有更好的方法來定義切點,以便我匹配盡可能多的個人,同時最大限度地減少兩組之間的差異?

出現看似接近的未匹配單元現象的簡單原因是它們與具有其他處理值的單元不屬於同一層。 CEM 不關心親密度; 它只考慮協變量空間的 bin。 由於您提到的原因,分箱並不總是最好的解決方案:兩個單元可能非常接近,但被分箱邊界隔開,將它們放置在不同的層中或留下一些不匹配的。

另一種解決方案是使用卡尺,這聽起來更像是您想要的。 您可以使用完全匹配的卡尺來保留盡可能多的單位。 完全匹配通過最小化處理單元和控制單元之間的地層內總距離來創建具有恰好一個處理單元或恰好一個控制單元的層。 卡尺確保控制每個層中處理單元和控制單元之間的距離。 您可以直接在協變量上設置卡尺。 例如,要確保層內的單位不超過 2 歲,並且年齡和診斷年齡之間的距離不超過 2 年,您可以使用以下代碼:

matchit <- matchit(Group ~ Last_recorded_age + Diagnosis_age, 
                   data = df, distance = "mahalanobis",
                   method = "full",
                   caliper = c(Last_recorded_age = 2, Diagnosis_age = 2),
                   std.caliper = FALSE)

有這么多單元,這通常會很慢,但由於卡尺太緊,可能不會花那么長時間。

否則,我處理 CEM 的唯一建議是手動調整切割點,直到獲得您喜歡的樣本。 不要忘記您可以自己提供切割點,而不僅僅是箱的數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM