본문 바로가기
데이터 사이언스 이야기/R & SAS Programming

[SAS Programming] LOCF - Last Observation Carried Forward

by Data_to_Impact 2021. 4. 16.
반응형

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;

 

위 ADLB데이터의 예시- 몇 몇 AVISIT의 AVAL이 Missing이다.

 

이제 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;

LOCF룰 적용 결과 아웃풋

 

 

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 데이터

 

[임상시험] CDISC 데이터 표준 - SDTM과 ADaM 데이터

[임상시험] CDISC 데이터 표준 - SDTM과 ADaM CDISC(Clinical Data Interchange Standards Consortium)란? 임상시험에서 정말로 수많은 종류들의 데이터가 수집되는데 신약개발 과정에서의 몇가지 예를 들자면 약의

cosmy.tistory.com

2020.09.09 - [데이터 사이언스 이야기/R & SAS Programming] - [SAS Programming] 날짜 변수 속성(Type) 바꾸기 (Input, put, format)

 

[SAS Programming] 날짜 변수 속성(Type) 바꾸기 (Input, put, format)

[SAS Programming] 날짜 변수 속성(Type) 바꾸기 (Input, format) 임상시험 데이터들을 접하다가 보면 날짜와 관련 변수들을 다루어야 할 때가 많은데, 이 날짜 관련 데이터들은 SAS Date 변수이나 Character Type

cosmy.tistory.com

 

반응형

댓글