아직 공부가 부족하여 틀릴 수도 있습니다.
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으로 맞추고 하는 것이 맞을 것 같다.