MatchIt :: matchit

2024. 1. 25. 18:10Statistics/R

 


해당 포스팅은 R코드들을 개인적으로 정리하고자 작성하였습니다.

※ 혹시 잘못된 곳이 있거나 의견있으시면 알려주세요!


 

MatchIt !

Propensity Score Matching (PSM)할 때 사용하는 패키지이다.

 

여기서는 사용법만.

 

PSM은 시험군의 개체와 대조군의 개체의 성질을 매우 비슷하게 조절해주는 방법이다.

RCT 하기 어렵거나 너무 아까운 registry가 있거나

할 때 사용하는데 PSM은 논문을 submit 하면 온갖 질문을 다 받는다.

점점 의심하는 사람이 많아졌다. =)

 

근데 요즘 마구잡이로 쏟아져 저장되는

real world data를 다루기 위해서는 필요하고 개발해야하는 방법 중에 하나인 것 같다.

 

방법은 

1. propensity score(ps) 를 계산한다.

2. case 대상과 유사한 ps를 갖는 control의 대상을 match 한다.

2-1. 유사한 정도는 caliper size를 지정하여 이 이내에 들어오는 것으로 match 한다고 미리 지정한다.

3. 잘 매치가 되었나 확인한다.

4. matched 된 개체들로만 matched set 을 구성한다.

5. 분석!

 

score 계산은 logit을 이용하는데 이 때 선택하는 변수에 대해서는 말이 많다.

 

다 넣어야 한다  vs 필요한 것만 넣으면 된다 

 

뭐 원하는 대로.. 지만

나는 다 넣어야 한다 ? 쪽이다. 그냥 PI 맘임..

 

여튼 서로 영향을 미치지 않는 변수들로 PSM 을 한다.

 

1~2 step을 한 번에 해주는 함수가 MatchIt package의 matchit 함수이다.

 

matchit 해서 바로 matched set으로 털어버릴 수 있지만

서로 매치된 것을 확인하기위해서 ID(1~n)를 설정 해주었다.

library(MatchIt)

#df <- read~

df$ID <- 1:nrow(df)

matout <- matchit(formula = Group ~ var1 + var2 + ... + vark,
					data = df, ratio = 1, method = "nearest", distance = "glm",
					caliper = 0.2, replace = FALSE)

 

caliper 빼고는거의 default 값이다.

caliper를 0.2로 주면 0.2*SD 범위 안에서 match 하게 된다.

(caliper 는 default: none 그냥 범위 없이 가장 가까운 것으로 선택한다.)

 

ratio는 case:control 비율이다. 

control이 많은 경우 1:4 까지 많이 사용한다.

4배수 이상이 더 나은 결과를 주는 것은 아니라고 한다.

(reference 있음 but 기억안남.. =0)

 

결과를 확인해보자

summary(matout)

 

treated 200명 control 661명을 1:1로 매치하니

각각 183명씩 매치되었다.

 

이제 매치가 잘 되었는지 확인해 주는 것은 필수이다.

 

3. covariate balance를 체크한다.

 

3-1. propensity score들의 분포가 유사한가? (histogram 또는 jitter 로 확인)

plot(matout, type = 'hist')

 

이렇게 분포가 나타난다.

match 된 control과 case(treated)의 ps 분포가 유사해 짐을 확인 할 수 있다.

plot(matout, type = 'jitter')

이것도 유사하게 점이 분포해있는 것을 확인 할 수 있다.

 

plot(~, type = 'jitter')는 점을 더블클릭해서 각각을 확인할 수 있다.

그래서 그림이 나타나면 코드가 실행이 안되는 것 처럼 보이는데

esc를 눌러서 빠져나오면 된다.

 

3-2. absolute standardized mean difference(ASD)확인

좀 더 수치적인 방법 absolute standardized mean difference 를 확인한다.

 

전체 데이터에서 그룹별 변수의 평균 차이와

match 된 데이터에서의 그룹별 변수의 평균 차이를 확인한다.

 

3-2-1. summary 에서도 ASD를 확인 할 수 있다. 

summary 에서는 absolute 값은 아니다.

 

3-2-2. ASD 그림

plot(summary(matout), var.order = "unmatched")

까만 점이 matched set의 ASD 이다. 

 

ASD가 얼마나 작아야 match가 잘 되었나?의

기준은 사실 사람마다.. 좀 다르다.

 

0.2 안에만 들어와도 된다는 사람도 있고 0.25라는 사람도 있고

어떤 논문에서는 

Absolute standardizzed difference greater than 0.2 indicaates significant imbalance of a baseline covariates.

(Silber JH et al. JAMA 2013, 310(4) 389-397)

라고 말하는데 

요즘 대부분은 0.1까지 들어와야 매치가 잘 되었다고 한다.

 

매치가 잘 안되었다면

- 변수를 조절해보거나

- caliper를 조절하거나

- method를 조절하거나 하면 된다.

 

4.매치 잘 되었음을 확인하면 matched set 구성하기

matched.df <- match.data(matout)

코드를 실행하면

match된 183:183 데이터셋이 저장된다.

 

5. 이제 분석하면 된다!! 

 

** 여기서 테이블을 정리할 때,

특히 일반적인 characteristic 정리하는 table에서 p value가 0.05보다 작으면

어? 매치 했는데 왜 이래? 하기도 하는데.

중요한건 covariate balance지 p value 가 아니다.

p보다 balance가 중요하다고 하는 reference!

Austin, 2007; lmai et al. 2008; Stuart 2010 여기 있다고 함!

 

 

끝!

 

 

728x90

'Statistics > R' 카테고리의 다른 글

Cochran Amitage trend test  (0) 2024.01.29
Pearson correlation coefficient  (2) 2024.01.29
ggplot2:: option  (0) 2023.09.12
ggplot2 :: pie chart  (0) 2023.08.19
R :: openxlsx package  (0) 2023.02.16