의학적 치료 결과를 알아보는 방법중 생존율을 많이 계산한다. 특히 암환자에서는 누적 생존율을 계산하는 경우가 많다. 물론 통계 팩키지를 이용하면 되지만, 생존율 관련 변수들을 1,2개 변경한 후 바로 그 결과을 알아보는 경우에 생존율 계산을 위한 코딩이 필요하다. 아래 화면과 같이 그래프로 결과를 보여주기 위해서는 여러가지 많은 변수들을 포함한 복잡한 코딩이 필요하지만, 기본적으로 중요한 생존율을 계산하는 알고리즘은 비교적 간단하기 때문에 여기에서 그것을 소개하고자 합니다.
누적 생존율을 계산하기 위한 기본적인 변수는 2가지 이다. (1) 생존기간(추적기간), (2) 추적결과(생존,사망,소실)이다. 그런데 실제로 추적기간은 연구시작일(최초추적일)과 연구종점일(최후추적일) 등으로 입력되기 떄문에 그때 그때 다시 계산해 주어야 한다.
1. 화면 설계
2. 데이터 파일 구조
Field Field Name Type Width
1 추적기간 Numeric 5
2 추적상태 Character 1
3 CA_STAGE Character 2
4 최초시작일 Date 8
5 최후추적일 Date 8
인덱스키: str(추적기간,5)+추적상태 ... 반드시 인덱스가 되어 있어야 한다.
연구종점일이 현재(오늘)이라면
추적기간 = iif(empty(최후추적일),date(),최후추적일) - 최초시작일 (일수)
3. 다양한 조건에 따른 생존율을 보기위한 옵션들
1) 추적기간을 계산하기 위한 조건
- 추적시작일, 최후추적일, 분석기준일
2) 생존율을 계산하기 위한 관찰기간: 6개월 ~ 10년
3) 여러 형태의 독립변수의 조건식에 따른 생존율 계산
- 병기별 5년 생존율, 암세포 분화도별 생존율 등.
4. 누적 생존율을 계산하는 기본 코딩
* nT,nL,nB,nR ........ graph box 좌표
* dFld : 추적기간 duration field ... 날짜수(추적관찰기간:day)
* rFld : 추적상태 result field ... . "A","D","L" : 최후 추적일에 생존(A),사망(D).소실(L)
* nYear : 분석기간
* nCalcKey : 1 = Kaplan-Meier Method
* 2 = Life table Method
* xDbCon : 분석대상 조건식
******************************************
* cCsrDbf,cCsrCdx : 분석대상파일
* cResultDbf : 분석결과파일
**************************************************
local dFld,rFld
dFld = 추적기간 && 추적기간 필드명
rFld = 추적상태 && 결과 필드명
* x-축 120 분할
*********************
nYear = 5 && 5년 생존율
nXi = 120 && x-축 120 분할
******************************
*@ nt,nL clear TO nB,nR
* 화면 박스안에 그래프를 그리는 루틴은 생략
********************************************
local nGuGan,nGanMon,nGanDay
nGanMon = (nYear*12)/nXi && 1구간(개월) = 0.5개월
nGuGan = (nYear*12)/nGanMon && 120 구간
nGanDay = nGanMon * n1M2day && 1구간(일수) = 15일
local nXNo,nYNo, nInt_Wd, nInt_Ht
nXno = nGuGan && x축 좌표 갯수 && ( 4 * 5 : 3Mon/yr * 5 yrs )
nYno = 10 && y축 좌표 갯수
nInt_Wd = nBoxWd/nXno && x축 좌표 간격
nInt_Ht = nBoxHt/nYno && y축 좌표 간격
select (cCsrDf)
local nTotPts
count to nTotPts for &xDbCon && 조건식에 맞는 레코드 갯수
set filter to &xDbCon
local aA,aD,aL,aW,aSr,aCsr && 생존율 계산을 위한 배열
local nYi && y축 실제화면 좌표값 배열
local nDeathRate && 구간 사망율 변수
local nDLW
dimension aA[nXno],aD[nXno],aL[nXno],aW[nXno]
dimension aSr[nXno],aCsr[nXno] && 구간생존율(aSr),누적생존율(aCsr)
dimension nYi[nXno]
local i,j
store 0 to aA,aD,aL,aW,nDLW,nDeathRate
store 1 to aSr[1],aCsr[1] && 시작점에서 구간생존율,누적생존율은 모두 100%(=1)
i = 1
j = 0
go top
DO WHILE !eof().and. i <= nXno
aA[i] = nTotPts - nDLW
store 0 to aD[i],aL[i],aW[i]
do while INT(eval(dFld)/(nGanMon*30))==i-1 .and. !eof()
do case
case eval(rFld)=="D" && 사망
aD[i] = aD[i] + 1
case eval(rFld)=="L" && 소실
aL[i] = aL[i] + 1
case eval(rFld)=="A" && 생존
aW[i] = aW[i] + 1
endcase
skip
enddo
IF (aA[i]-(aL[i]+aW[i])/nCalcKey) <= 0
wait '생존율을 더이상 계산할수 없읍니다.' window timeout 2
return 0
ELSE
nDeathRate = ROUND(aD[i]/(aA[i]-((aL[i]+aW[i])/nCalcKey)),3)
aSr[i] = ROUND(1-nDeathRate,3)
aCsr[i] = IIF(i=1,aSr[i],ROUND(aSr[i]*aCsr[i-1],3))
nYi[i] = ROUND((aCsr[i])*(nBoxHt),3)
if .t. && 계산 결과값 별도의 테이블(cResultDbf)에 저장
* -----
endif
* 화면에 생존율 그래프를 그리는 루틴(생략)
nDLW = nDLW + aD[i] + aL[i] + aW[i]
j = j + nInt_Wd
ENDIF
i = i + 1
ENDDO !eof() .and. i <= nXno
* 위의 빨간색 코딩 부분이 핵심적인 누적생존율 계산식이다.
* nCalcKey : 1 = Kaplan-Meier Method
* 2 = Life table Method
'의학.건강 > SW 개발자용' 카테고리의 다른 글
문항척도 평가도구 점수 계산 (0) | 2023.07.25 |
---|---|
나의 노트 관리 프로그램(SW) (0) | 2023.06.25 |
챗GPT가 알려준 달력 소스코드 (0) | 2023.01.15 |
문항척도 SW - 구축된 자료의 통계 분석 (기술적 통계) (0) | 2022.12.19 |
문항척도 SW - 관계형 데이터 연결 (1 to many) (0) | 2022.12.18 |