
어제 알게된 생존 분석 방법인 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으로 맞추고 하는 것이 맞을 것 같다.