Stats & AI tech blog - '일단 시도함'

[R] PSM, Propensity Score Matching (성향점수매칭) 본문

Programming/R

[R] PSM, Propensity Score Matching (성향점수매칭)

justdoit ok? 2024. 11. 12. 13:42

이전 포스팅에서 PSM 분석에 대한 개념을 알아보았다.

2023.12.04 - [Statistics] - [통계] PSM: Propensity Score Matching (성향점수매칭)

 

[통계] PSM: Propensity Score Matching (성향점수매칭)

PSM: Propensity Score Matching (성향점수매칭)   1. 성향점수매칭(PSM) 이란? 무작위 대조군 연구(RCT)가 불가능한 관찰 연구에서 실험군과 대조군 그룹 간 비교를 위해 사용되는 통계적 기법이다.표

meowstudylog.tistory.com

 

이번 포스팅에서는 R에서 PSM을 수행하는 절차에 대해 알아보자!

 

예시로 사용할 데이터의 원인 변수는 당뇨 여부(DM)이고 종속 변수는 골다공증 여부(Osteoporosis)이다.

혼란 변수로 작용할 수 있는 나이(Age), 키(Height), 몸무게(Weight)가 당뇨-골다공증 간의 관계를 규명하는데 미치는 영향을 통제하고 분석하기 위해 PSM 진행하고자 한다.

 

R의 'MatchIt' 패키지를 사용하여 매칭을 진행하고 'cobalt' 패키지를 사용하여 SMD 그래프를 확인한다.

 

1. 매칭 모델 설정

'MatchIt' 패키지의 matchit() 함수를 사용하여 매칭 모델을 설정한다.

distance = 'glm'는 로지스틱 회귀 모형으로 성향 점수를 계산한다는 것을 의미하고, method=NULL로 하여 성향 점수 결과만을 출력할 수 있고 method='nearest'로 변경하여 최근접 이웃 방법으로 매칭된 모델을 설정할 수 있다.

 

아래는 원인 변수(당뇨 여부, DM)을 종속 변수로, 공변량 3개 (Age, Height, Weight)를 독립 변수로 하는 로지스틱 모형을 구축하여 성향 점수를 계산하고 이를 통해 매칭을 진행하는 코드이다.

library(MatchIt)

# 성향 점수만 확인
initial = matchit(DM ~  Age + Height + Weight, method = NULL, distance = 'glm', data = data)
head(initial$distance)

# 최근접 이웃 방법으로 매칭 모델 설정
match_fit = matchit(DM ~  Age + Height + Weight, method = 'nearest', distance = 'glm', data = data)

# 매칭 결과 확인
summary(match_fit) # |SMD| < 0.1 good match

 

2. 공변량 균형 시각화

 

PSM을 통해 보정을 진행하였다면 매칭 전후의 SMD를 비교하여 공변량 균형을 확인한다.

'cobalt' 패키지의 love.plot() 함수를 통해 SMD를 시각적으로 비교할 수 있다.

library(cobalt)
# draw plot
love.plot(match_fit,abs=T, 
          thresholds = 0.1,
          drop.distance = T,
          binary='std',
          position='bottom',
          var.order = 'unadjusted',
          #var.names = new.name,
          size = 4,
          shapes=c('circle','circle'),
          colors = c(2,3))

 

 

3. 매칭된 데이터 추출

매칭된 데이터를 통해 다음 분석을 수행하려면 match.data() 함수를 사용하여 데이터 셋을 추출한다.

matched_data = match.data(match_fit)
write.csv(matched_data, 'data_psm.csv')