
어제 알게된 생존 분석 방법인 landmark 분석이다. 예시의 그림 파일에서는 500일을 기준으로 한 것이다. 간단히 말하면 최소 500일동안 추적 관찰이 된 그룹만을 다시 선정하여 추가 생존 분석을 하는 것이다. 샘플 수가 줄어든다는 단점이 있으나, 여러 다른 이유로 조기 탈락하는 경우를 배제할 수 있다는 장점이 있다. 예쁘게 plot을 그리는게 어려운 것이지, 분석 코드를 짜기에는 그렇게 어려울 것 같지 않아 보인다.
어제 알게된 생존 분석 방법인 landmark 분석이다. 예시의 그림 파일에서는 500일을 기준으로 한 것이다. 간단히 말하면 최소 500일동안 추적 관찰이 된 그룹만을 다시 선정하여 추가 생존 분석을 하는 것이다. 샘플 수가 줄어든다는 단점이 있으나, 여러 다른 이유로 조기 탈락하는 경우를 배제할 수 있다는 장점이 있다. 예쁘게 plot을 그리는게 어려운 것이지, 분석 코드를 짜기에는 그렇게 어려울 것 같지 않아 보인다.
울 회사 CDM에는 텍스트 자료도 저장되어 있으며, 줄 바꿈도 되어 있다. 그래서 SQL로 추출해서 R에서 불러오면 \r\n이 삽입되어 있다. R에서 print()로 보면 개행문자가 처리가 되지 않아서 보기 흉하다.
그럴 경우에는 cat()이나 capture.output()을 이용하면 줄바꿈이 적용된 상태로 볼 수 있다. cat()은 변수로 받을 수 없는 반면, capture.output()은 변수로 받을 수 있는 차이가 있다. 순차적인 결과들을 하나로 받고 싶으면 paste(, collapse=”)를 이용하면 된다.
tmp2$agg = paste0(tmp2$measurement_date,'\r\n', tmp2$value_as_text)
tmp3 = paste0(tmp2$agg, collapse = '')
아직 공부가 부족하여 틀릴 수도 있습니다.
PSM 기법은 큰 자료를 작게 만들어 비슷하게 만드는 것이라면, IPW는 작은 자료를 더 가치있게 하여 평가하는 기법이다.
여러 패키지가 있는 것 같은데 ‘ipw’ 패키지를 이용하면 쉽게 구할 수 있다. 하지만, 패키지가 설치가 안되는 상황이면 직접 구현이 가능하다. 내가 구현할 수 있을 정도면, 어렵지 않다는 이야기이다. 필요한 과정은 다음과 같다.
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으로 맞추고 하는 것이 맞을 것 같다.
대조군과 실험군의 차이를 최대한 줄이기 위하여 사용하는 방법 중 하나. 다른 방법이 더 있는지는 모르겠으나 통계를 잘 모르는 사람이 하기에 쉬운 방법은 맞을 것이다. 물론, 처음에 진입 장벽은 존재한다. 다음 주 부터 적어도 이 기법은 확실히 이용해야 하는 절박한 마음에 공부를 해보았다.
https://doi.org/10.17085/apm.2016.11.2.130
대한마취과학회 학술지에 투고된 내용이다. 실전에 맞게 필요한 내용만 편집하였다. 🙂
‘MatchIt’ 패키지를 설치하면 이용할 수 있는 lalonde 데이터를 기준으로 설명해 본다. 실제 자료 이용할 경우에는 결과 변수는 0과 1로 설정해 두는게 좋다. 다음과 같이 기본적 옵션으로 실행할 수 있다.
m.out1 <- matchit(treat ~ age + educ + race + nodegree +
married + re74 + re75, data = lalonde)
summary(m.out1)
이용해 볼 수 있는 옵션으로는 optimal matching 여부, N:N matching 에서 비율, exactm caliper 정도가 있다. 기본 옵션으로 matching 시켰을 때 standardized mean difference가 별로 줄어들지 않는 것이 있다면 좀 더 튜닝하는게 좋을 것 같다.
매칭 후 해당 자료만 추출하여 추가 분석을 하려면 match.data() 를 이용한다.
match.data(m.out1)