LOCF - Last Observation Carried Forward
임상시험에서 Missing 데이터를 처리하기
임상시험은 짧게는 수 개월에서 몇년간 지속이 되기 때문에, 환자들의 상황에 따라서 정해진 방문 기간에 방문하지 않는 경우도 흔히 발생을 한다. 이렇게 되면, 그때 그때 체크해야될 Vital Sign이나 혈액 샘플등의 Lab 데이터가 기록되지 않는 경우가 생기는데, 이런 경우에 데이터를 Missing으로 그냥 둘 수도 있지만, LOCF- Last Observation Carried Forward 알고리즘을 이용해서 가장 최근의 데이터의 값을 사용하는 방법을 고려해볼 수 있다. 아래의 예시 Lab 데이터와 코드를 가지고 조금 더 자세하게 살펴보자.
예시) 간단한 ADLB의 예제 데이터셋
data adlb;
infile datalines dlm=',';
length avisit $200.;
input usubjid $ lbtestcd $ avisit$ avisitn aval;
datalines;
101-001, HGB, Screening, 0, 9.3
101-001, HGB, Cycle 2 Day 28, 1, 10
101-001, HGB, Cycle 4 Day 28, 2,
101-001, HGB, Cycle 6 Day 28, 3, 9
101-001, HGB, Cycle 8 Day 28, 4,
101-001, LYM, Screening, 0, 0.6
101-001, LYM, Cycle 2 Day 28, 1, 0.5
101-001, LYM, Cycle 4 Day 28, 2, 0.65
101-001, LYM, Cycle 6 Day 28, 3,
101-001, LYM, Cycle 8 Day 28, 4,
run;
이제 LOCF 알고리즘을 가지고 하고자 하는 것은 가장 최근 AVISIT의 Non-missing 데이터를 Missing 데이터에 Impute하는 것이다. 이 문제의 풀이는 LAG Function을 이용하는 방법도 있을 것이고, Retain Statement를 사용하는 방법도 있을 것인데, 여기서는 Retain 명령어를 사용한 방법과 Lag function을 사용해서 풀이를 하는 것을 알아 보고자 한다.
Data Step의 Retain Statement를 이용한 LOCF 문제 풀이
첫 번째 방법으로는 Data Step에서 Retain을 이용해서 풀이를 할 것이다. 이 데이터의 경우에는 USUBJID-LBTESTCD-AVISIT 순으로 큰 카테고리가 나와져 있는데, 이에 맞게 나중에 Data Step에서 Set / By 명령어를 쓰기 위해서 데이터를 우선 Sorting을 해야한다. AVISIT은 Character이기 때문에 이 변수를 이용해서 Sorting을 하면 Screen-Cycle이 알파벳순으로 정렬되기때문에 AVISITN을 이용해서 정렬을 한다.
proc sort data=adlb;
by usubjid lbtestcd avisitn;
run;
data adlb2;
length dtype $200.;
set adlb;
by usubjid lbtestcd avisitn;
* Set RETAIN variable and initialize the variable;
retain locf .;
* The start of every parameter's retain varialbe should be . ;
if first.lbtestcd then locf=.;
if aval^=. then locf=aval;
else if locf^=. and aval=. then dtype="LOCF";
run;
Lag Function을 이용한 LOCF 문제 풀이
proc sort data=adlb;
by usubjid lbtestcd avisitn;
run;
data adlb_lag;
set adlb;
by usubjid lbtestcd avisitn;
avall1=lag(aval);
avall2=lag2(aval);
if first.lbtestcd then do;
avall1=.;
avall2=.;
end;
if aval=. then do;
if avall1^=. then aval=avall1;
else if avall1=. and avall2^=. then aval=avall2;
end;
run;
Lag function을 이용한 풀이는 조금은 더 생각해야 할 것이 많고, 변수를 더 많이 정의를 해야 한다.
첫 째로는 몇 번째 까지 보통 Missing인지 생각을 해야하고, 또 각 lag한 부분마다 새로 변수를 정의 해야 되기때문에 만약 Missing이 연속적으로 여러번 일어나게 되는 경우 코드가 길어지고 로직이 지저분해지는 단점이 있을 것이다.
이상으로 간단한 예제를 통해서 LOCF알고리즘을 SAS의 Retain Statement와 Lag function을 통해서 구현을 해 보았다.
구독과 좋아요는 제가 글을 쓰는 큰 원동력이 됩니다-!
관련글
2022.12.26 - [데이터 사이언스 이야기/Clinical Data Science] - [임상시험] CDISC 데이터 표준 - SDTM과 ADaM 데이터
'데이터 사이언스 이야기 > R & SAS Programming' 카테고리의 다른 글
[R Programming] 데이터 내 여러 변수 중 이름이 비슷한 변수 선택하기 (0) | 2022.02.20 |
---|---|
[SAS Programming] 날짜 변수 속성(Type) 바꾸기 (Input, put, format) (0) | 2020.09.10 |
[R Programming] R로 하는 데이터 전처리 & 시각화 예제 (0) | 2019.04.01 |
댓글