Inverse Probability Weighting

아직 공부가 부족하여 틀릴 수도 있습니다.

PSM 기법은 큰 자료를 작게 만들어 비슷하게 만드는 것이라면, IPW는 작은 자료를 더 가치있게 하여 평가하는 기법이다.

여러 패키지가 있는 것 같은데 ‘ipw’ 패키지를 이용하면 쉽게 구할 수 있다. 하지만, 패키지가 설치가 안되는 상황이면 직접 구현이 가능하다. 내가 구현할 수 있을 정도면, 어렵지 않다는 이야기이다. 필요한 과정은 다음과 같다.

  • propensity score 구하고, 확률로 변환하기
  • 가중치 계산하기

PSM을 구하는 방법 중에서 로지스틱 회귀 분석을 사용할 수 있다고 하였다. PSM에서 언급한 lalonde 데이터를 이용해서 이항 로지스틱 회귀 분석을 한다.

tmp = glm(
  treat ~ age + educ + race + nodegree + married + re74 + re75,
  data = lalonde,
  family = 'binomial'
)

type=’response’를 이용하여 출력 값을 (0, 1) 확률로 구할 수 있다. 이 값이 propensity score다.

predict(tmp, lalonde, type='response')

혹여 덕심에 불타오른다면, 다음과 같은 방법도 시도할 수 있다. 알고리즘의 차이인지, 매우 미세한 수치의 차이가 있을 수 있다.

1 / (1 + exp(-predict(tmp, lalonde)))

lalonde 자료에 확률을 추가한다.

lalonde$prob = predict(tmp, lalonde, type='response')

lalonde 자료를 예로 들자면 치료군에 배정될 확률의 역수를 구하면 그것이 가중치이다. 치료군의 경우 다음과 같이 변환될 것이다.

lalonde$weight = NA
lalonde$weight[which(lalonde$treat==1)] = 
     1/lalonde$prob[which(lalonde$treat==1)]

대조군이라면 1-prob 한 결과를 역수로 가중치를 부여한다.

lalonde$weight[which(lalonde$treat==0)] = 
     1/(1-lalonde$prob[which(lalonde$treat==0)])

‘ipw’ 패키지로는 다음과 같이 구하면 같은 결과를 얻을 수 있다. 가중치는 $ipw.weights에 저장된다.

temp = ipwpoint(
  exposure = treat,
  data = lalonde,
  family = 'binomial',
  link = 'logit',
  denominator = ~ age + educ + race + nodegree + married + re74 + re75
)
temp$ipw.weights

분석 과정에서 가중치를 부여할 수 있다면 좋은 방법이 될 수 있을 것 같다. 그렇지 않다면 PSM으로 맞추고 하는 것이 맞을 것 같다.