끄적이는 프로그래밍/SAS 프로그래밍

임상통계 분석에서의 clopper-pearson's confidence interval 정확한 계산

요맘때10 2019. 4. 8. 00:21
반응형

임상통계 분석에서 중점적으로 평가해야할 항목은 안전성 평가이다. 안전성 평가의 가장 주요한 평가변수는 이상반응. 이상반응에 대한 요약은 통상적으로 다음과 같이 요약한다. 

  n(%)[case] 95% CI[Lower, Upper]
AE xx(xx.xx)[xx] [xx.xx, xx.xx]
TEAE xx(xx.xx)[xx] [xx.xx, xx.xx]
Serious AE xx(xx.xx)[xx] [xx.xx, xx.xx]
     

AE: Adverse Event

n(%)[case]: 이상반응이 발현한 대상자 수(백분율), [이상반응 건수]

95% CI: Clopper-Pearson's Confidence Interval

 

다음은 이상반응 데이터셋의 예이다. 대상자는 10명, 1:예, 2:아니오

SUBJECT AE TEAE SAE
1 1 1 2
2 2 2 2
3 1 2 2
4 2 2 2
5 2 2 2
6 2 2 2
7 1 1 2
8 1 1 2
9 1 2 2
10 2 2 2

- Clopper pearson's CI의 SAS Code

 

proc freq data=ae;

tables ae / nocum norow binomial;

exact binomial;

run;

 

- 결과

AE가 발현된 대상자 5명, 발현되지 않은 대상자 5명, exact 기준 95% CI=[18.71%, 81.29%] 이다. 

 

1. 코딩으로 인한 잘못된 계산 주의

SAS 특성상 만약 코딩 상 1:예, 2:아니오가 아닌 0:아니오로 코딩 되었다면 이항비가 AE=0의 결과를 계산하므로 주의가 필요하다. 이상반응 분석 시 이상반응이 발현된 대상자의 신뢰구간을 계산하는 것이 목표이므로 이항비 AE=1에 대해 계산이 이루어져야 한다.

현재 예의 경우 AE가 발현된 대상자와 그렇지 않은 대상자가 동일하므로 TEAE로 살펴보기로 한다. 위의 코드에서 변수를 TEAE로 바꾼 후 계산한 결과는 다음과 같다.

여기서 주목해야 할 것은 이항비 TEAE=1, 95% CI=[6.67%, 65.25%]. 

하지만 2(아니오)로 코딩이 되지 않고 0(아니오)로 코딩이 되어 있다면 위의 코드로 똑같이 돌리게 되면 이항비 TEAE=0으로 이상반응이 발현되지 않은 대상자에 대한 신뢰구간이 계산되게 된다.

위의 결과는 같은 코드지만 코딩상의 우선순위로 잘못된 결과를 수행하였다. 필자는 이 결과를 막기 위해 보고자 하는 것을 작은 숫자로 코딩하여 계산한다. 

 

2. 빈도가 0일 때 잘못된 계산 주의

 SAS 특성상 빈도가 없을 때 결과를 보여주지 않는다. 위 예에서 SAE의 결과를 살펴보자.

SAE가 아무도 발현되지 않아 이항비 SAE=2에 대한 신뢰구간이 계산된 결과이다. 여기서 꼼수를 부리자면 현재 신뢰구간 [Lower, Upper]을 1-[Upper, Lower]로 계산하는 방법이 있긴 한데, 이는 정확한 계산방법은 아니니 패스 하도록 하자.

SAS상으로 해결하는 방법은 Dataset에 가중치를 두는 방법이 있다. 약간의 핸들링을 필요로 하지만, 다방면으로 유용하며 정확한 계산을 할 수 있어 필자는 이 방법을 사용하고 있다.

 

- Format 데이터셋 코딩: 현재 SAE는 2가 전부이므로 없는 범주인 1이 존재하는 데이터셋을 만든다.

data fmt;

input sae;

datalines;

1

;

run;

 

- 기존 데이터셋과 Format 데이터셋 합치기: 여기서 Format 데이터셋엔 있고, 기존 데이터셋에 없으면 가중치 0, 그 외엔 가중치 1의 조건을 걸어 가중치 변수를 생성한다.

 

data ae_wgt;

merge ae(in=a) fmt(in=b);

by sae;

if b and not a then wgt=0;

else wgt=1;

run;

 

- 위 단계로 데이터셋을 생성하면 다음과 같다. 현재 SAE 변수에만 가중치를 만들었지만 상황에 따라 AE, TEAE에도 생성할 수 있으니 참고하면 된다.

SUBJECT AE TEAE SAE WGT
. . . 1 0
1 1 1 2 1
2 2 2 2 1
3 1 2 2 1
4 2 2 2 1
5 2 2 2 1
6 2 2 2 1
7 1 1 2 1
8 1 1 2 1
9 1 2 2 1
10 2 2 2 1

 

이제 Clopper-Pearson CI를 계산하면 다음과 같다. 기존 코드에서 weight문이 추가되어 가중치를 반영한다.

proc freq data=ae_wgt;

weight wgt/zeros;

tables sae / nocum norow binomial;

exact binomial;

run;

 

결과는

기존에 없던 빈도 1(예)가 나타난 모습니다. 이항비도 SAE=1에 대해 계산 되었으며 exact 95% CI=[0.00%, 30.85%]로 나타났다. 

 

필자는 이 방법을 모르고 꼼수만 사용하다 잘못된 계산을 했던 적이 여러번 있었다. 여러분도 이 방법을 사용하여 정확한 계산을 하도록 하자. 끝~

반응형