임상통계 분석에서 중점적으로 평가해야할 항목은 안전성 평가이다. 안전성 평가의 가장 주요한 평가변수는 이상반응. 이상반응에 대한 요약은 통상적으로 다음과 같이 요약한다.
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%]로 나타났다.
필자는 이 방법을 모르고 꼼수만 사용하다 잘못된 계산을 했던 적이 여러번 있었다. 여러분도 이 방법을 사용하여 정확한 계산을 하도록 하자. 끝~
'끄적이는 프로그래밍 > SAS 프로그래밍' 카테고리의 다른 글
Mock-up shells(TFLs) 와 통계분석 결과 결합하기 (SAR) (0) | 2022.08.16 |
---|---|
SAS로 RTF 파일 출력하기 4 (proc sgplot) (0) | 2022.08.11 |
SAS로 RTF 파일 출력하기 3 (proc report) (2) | 2022.08.09 |
SAS로 RTF 파일 출력하기 2 (2) | 2022.05.06 |
SAS로 RTF 파일 출력하기 1 (1) | 2022.05.04 |