/*------------------------------------------------------------------------* * Multistate Life Table: Population-Based & Status-Based MSLT * * This program applies the Linear Method * * outlined by Schoen (1988) to calculate * * Both the Population-Based & Status-Based Life Tables. * * * * Notation: * * M_x: Observed Occurrence/Exposure Rates * * Lx : Survivor Function, l(x) * * nLx: Person-Year Function, nLx * * Tx : Person-Year Function, Tx * * D : Decrements/Transfers * * Pi : Probability of Transition * * x : Subscript for the Age Interval * * j : Subscript for the Origin State * * k : Subscript for the Destination State * * (This program also uses the macrovariable &STATUS. to * * denote the j or k subscrpit.) * * State Space: k living states plus one absorbing state. * * The number of states is equal to (k+1). * * * * * * Program Input: * * DATA = : Specify the SAS dataset to be analyzed. * * B_AGE = : Specify the Variable denoting the Starting point * * of age interval. * * E_AGE = : Specify the Variable denoting the Ending point * * of age interval. * * STATES= : Specify the Number of States, including k * * living states plus one absorbing state, i.e., * * specify the value of (k+1). * * MRATES= : List the Observed Occurrence/Exposure Rates in * * sequence from the 1st living state to the final * * absorbing state. For example, * * mx1-->2, mx1-->2, ...., mx1-->2, mx2-->1, mx2-->2, * * ....., mxk-->1, mxk-->2,..., mxk-->(k+1). * * * * The observations in the dataset should be sorted by the * * age interval sequence in advance. This program always * * assumes the final age interval as open-ended. * * * * Program Output (Datasets): * * QM : Observed Occurrence/Exposure Rates. * * x observations for each age interval. * * Including Starting and Ending Age, and * * k x (k+1) rates: mx1->1, mx1->2, ...., mxk->k+1. * * QPi : Transition Probabilities. * * Data structure is identical to QM. * * QnLxS : Number of Years Lived in Each STATUS by Person * * of Age x. * * x observations for each age interval. * * Including Starting and Ending Age, and * * k x (Total+k) nLx. * * IQ_k : Summary Population-Based Life Table Statistics for * * each living state. (There are k IQ files.) * * x observations for each age interval. * * Including Starting and Ending Age, and * * l(x), nLx, Tx, and ex for each satet. * * IQD_k : Life History of Initial Cohort of the Starting Age * * by Initial STATUS of Cohort for each living state. * * (There are k IQD files.) * * For each Initial STATUS of Cohort, this file * * contains information of Decrements/Transfers * * to each of the k states. * * IQLi_k : Number of Years Lived in Each STATUS by a Unit Cohort * * for each STATE at the Starting Age. This is the Expected * * Number of Years Lived by Member of Initial Cohort Within * * Age Interval x to x+n. (There are k IQLi files.) * * IQTi_k : Total Number of Years Lived Beyond Age x for Initial * * STATUS of Cohort in STATE k. (There are k IQTi files.) * * SQ_k : Summary Status-Based Life Table Statistics for Each * * Living States. (There are k SQ files.) * *------------------------------------------------------------------------*/; %MACRO MSLT(DATA=,B_AGE=,E_AGE=,STATES=,MRATES=); DATA _NULL_; SET &DATA. NOBS=NOBS; /* # of Age-Intervals */ CALL SYMPUT('AGEGROUP',TRIM(LEFT(NOBS))); DATA _NULL_; SET &DATA.; /* Starting Age Under Study */ IF _N_ = 1 THEN CALL SYMPUT('LOWAGE', TRIM(LEFT(&B_AGE.))); RUN; PROC IML WORKSPACE=6144; USE &DATA.; READ ALL VAR{&B_AGE.} INTO B_AGE; READ ALL VAR{&E_AGE.} INTO E_AGE; READ ALL VAR{&MRATES.} INTO MRATES; CLOSE &DATA.; STATES = &STATES. /* # of Living States Plus Absorbing State */; I = I(STATES) /* Identity Matrix */; /* Reshape the Observed Exposure Rates into M(x,n) Matrix for Each Age-Interval */ %DO X = 1 %TO &AGEGROUP.; M_&X. = J(STATES, STATES, 0) /* Initial values as 0 */; DO J = 1 TO (STATES - 1); DO K = 1 TO (STATES); M_&X.[J, K] = MRATES[&X., (((J-1)*STATES)+K)]; END; END; M_&X. = -M_&X. + DIAG(M_&X.[,+]); %END; /* Calculate the Transition Probabilities Matrix: PI */ /* Based on the Linear Method*/ /* PI = [ I - 1/2 n M(x,n)] [I + 1/2 n M(x,n)]^-1 */ %DO X = 1 %TO %EVAL(&AGEGROUP.-1); Pi_&X. = J(STATES, STATES, .); N = E_AGE[&X.] - B_AGE[&X.] + 1; Pi_&X. = INV(I+N/2*M_&X.)*(I-N/2*M_&X.); DO J = 1 TO (STATES-1); DO K = 1 TO STATES; IF M_&X.[J, K] = 0 THEN Pi_&X.[J, K] = 0; END; END; %END; /* Force All Persons Are Absorbed at the Last Age Interval */ Pi_&AGEGROUP. = J(STATES, STATES, 0); DO J = 1 TO (STATES - 1); Pi_&AGEGROUP.[J, STATES] = 1; END; %DO STATUS = 1 %TO %EVAL(&STATES.-1); QM_&STATUS. = J(&AGEGROUP., STATES, 0); QPi_&STATUS. = J(&AGEGROUP., STATES, 0); %DO X = 1 %TO &AGEGROUP.; DO K = 1 TO STATES; /* Observed Occurrence/Exposure Rates */ IF (&STATUS. ^= K) THEN QM_&STATUS.[&X., K] = -M_&X.[&STATUS., K]; /* Transition Probabilities */ QPi_&STATUS.[&X., K] = PI_&X.[&STATUS., K]; END; %END; %END; /*---------------------------------------------------------* * Number of Years Lived in Each STATUS by Person of Age x * * for STATUS at Age x is in STATE k * *---------------------------------------------------------*/; %DO STATUS = 1 %TO %EVAL(&STATES.-1); QnLxS_&STATUS. = J(&AGEGROUP., STATES-1, 0); %DO X = 1 %TO %EVAL(&AGEGROUP.-1); N = E_AGE[&X.] - B_AGE[&X.] + 1; DO K = 1 TO (STATES-1); IF %EVAL(&STATUS.) = K THEN QnLxS_&STATUS.[&X., K] = (QPi_&STATUS.[&X., K]+1)/2*N; IF %EVAL(&STATUS.) ^= K THEN QnLxS_&STATUS.[&X., K] = (QPi_&STATUS.[&X., K] )/2*N; IF (QPi_&STATUS.[&X., K]=0) THEN QnLxS_&STATUS.[&X., K] = 0; END; %END; /* e at the Last Open-Ended Interval Is Calculated from */ /* Mx^-1 (where Mx is k by k matrix) */ M_H = J(STATES-1, STATES-1, 0); DO J = 1 TO (STATES-1); DO K = 1 TO (STATES-1); M_H[J,K] = M_&AGEGROUP.[J,K]; END; END; INVM_H = INV(M_H); DO J = 1 TO (STATES-1); QnLxS_&STATUS.[&AGEGROUP., J] = INVM_H[&STATUS., J]; END; %END; %DO STATUS = 1 %TO %EVAL(&STATES.-1); QnLxS_&STATUS. = QnLxS_&STATUS.[, +] || QnLxS_&STATUS.[, ]; %END; /* Add the Age Indicator & Assemble the Matrices */ QM = B_AGE || E_AGE %DO STATUS = 1 %TO %EVAL(&STATES.-1); || QM_&STATUS. %END;; QPi = B_AGE || E_AGE %DO STATUS = 1 %TO %EVAL(&STATES.-1); || QPi_&STATUS. %END;; QnLxS = B_AGE || E_AGE %DO STATUS = 1 %TO %EVAL(&STATES.-1); || QnLxS_&STATUS. %END;; /* Column Label */ QMNAME = {'B_Age' 'E_Age' %DO STATUS = 1 %TO %EVAL(&STATES.-1); %DO J = 1 %TO &STATES.; "M_&STATUS._&J." %END; %END; }; QPiNAME = {'B_Age' 'E_Age' %DO STATUS = 1 %TO %EVAL(&STATES.-1); %DO J = 1 %TO &STATES.; "Pi_&STATUS._&J." %END; %END; }; QnLxSNAM= {'B_Age' 'E_Age' %DO STATUS = 1 %TO %EVAL(&STATES.-1); "_&STATUS._All" %DO J = 1 %TO %EVAL(&STATES.-1); "_&STATUS._&J." %END; %END; }; /* Output the Matrices to SAS Datasets */ CREATE QM FROM QM (|COLNAME=QMNAME|); APPEND FROM QM ; CLOSE QM ; CREATE QPi FROM QPi (|COLNAME=QPiNAME|); APPEND FROM QPi; CLOSE QPi; CREATE QnLxS FROM QnLxS (|COLNAME=QnLxSNAM|); APPEND FROM QnLxS; CLOSE QnLxS; FREE QM QnLxS QMNAME QPiNAME QnLxSNAM %DO X = 1 %TO &AGEGROUP.; Pi_&X. %END; %DO STATUS = 1 %TO %EVAL(&STATES.-1); QnLxS_&STATUS. %END;; /*----------------------------------------------------* * Construction of the Population-Based Life Tables * * for Initial Cohort of Age &LOWAGE. * * by Initial STATUS of Cohort STATE k * *----------------------------------------------------*/; START PBLT; /* Calculate l(x) Function Based on the Linear Method */ /* l(x+n) = l(x) [I - 1/2 n M(x,n)] [ I + 1/2 n M(x,n)]^-1 */ Lx = J(&AGEGROUP., STATES, 0); /* Set the Radix Value */ Lx[1, Radix_J] = 100000; nLx = J(&AGEGROUP., STATES, 0); %DO X = 1 %TO %EVAL(&AGEGROUP.-1); N = E_AGE[&X.] - B_AGE[&X.] + 1; Lx[%EVAL(&X.+1), ] = Lx[&X., ]*(I-N/2*M_&X.)*INV(I+N/2*M_&X.); /* Calculate nLx Functions Based on the Linear Method */ /* L(x,n) = 1/2 n [l(x) + l(x+n)] */ nLx[&X., ] = N/2 * (Lx[&X., ] + Lx[%EVAL(&X.+1), ]); %END; /* nLx at the Highest Age Interval */ L_H = Lx[&AGEGROUP., 1] %DO J = 2 %TO (&STATES.-1); || Lx[&AGEGROUP., &J.] %END;; nLx_H = L_H*INV(M_H); DO K = 1 TO (STATES-1); nLx[&AGEGROUP., K] = nLx_H[K]; END; /* Assemble the Multistate Life Table */ %DO STATUS = 1 %TO %EVAL(&STATES.-1); QD_&STATUS. = J(&AGEGROUP., STATES, 0); %DO X = 1 %TO &AGEGROUP.; DO K = 1 TO STATES; /* Calculate the Decrements (Transfers) */ /* d_jk = l_j * pi_jk */ QD_&STATUS.[&X., K] = Lx[&X., &STATUS.] * QPi_&STATUS.[&X., K]; END; %END; %END; /* Survivor Function: l(x) */ QLx = Lx[, 1] %DO J = 2 %TO (&STATES.-1); || Lx[, &J.] %END;; /* nLx Person-Years */ QnLx = nLx[, 1] %DO J = 2 %TO (&STATES.-1); || nLx[, &J.] %END;; /* Calculate Tx Function */ QTx = J(&AGEGROUP., STATES-1, 0); QTx[&AGEGROUP., ] = QnLx[&AGEGROUP., ]; DO X = 2 TO &AGEGROUP.; DO J = 1 TO (STATES-1); QTx[&AGEGROUP.+1-X, J] = QTx[&AGEGROUP.+1-X+1, J] + QnLx[&AGEGROUP.+1-X, J]; END; END; QLx = QLx[,+] || QLx; QnLx = QnLx[,+] || QnLx; QTx = QTx[,+] || QTx; /*----------------------------------------------------* * Calculate the IMPLIED Age-Specific PREVALENCE RATE * * ASPR_j = nLx_j / nLx_all * *----------------------------------------------------*/; ASPR = J(&AGEGROUP., STATES-1, 0); DO J = 1 TO (STATES-1); ASPR[, J] = QnLx[, J+1] / QnLx[, 1]; END; /* Calculate the Life Expectancy: e */ QEx = J(&AGEGROUP., STATES, 0); DO J = 1 TO STATES; QEx[, J] = QTx[, J] / QLx[, 1]; END; /*-----------------------------------------------------------* * Number of Years Lived in Each Status by a Unit Cohort * * for the Initial STATUS of Cohort STATE k at Age &LOWAGE. * * This is the: Expected Number of Years Lived by Member of * * Initial Cohort Within Age Interval x to x+n. * *-----------------------------------------------------------*/; QLi = QnLx / 100000; /*------------------------------------------* * Total Number of Years Lived Beyond Age x * * for Initial STATUS of Cohort State k * *------------------------------------------*/; QTi = QTx / 100000; /* Add the Age Indicator & Assemble the Matrices */ QD = B_AGE || E_AGE %DO STATUS = 1 %TO %EVAL(&STATES.-1); || QD_&STATUS. %END;; Q = B_AGE || E_AGE || QLx || QnLx || QTx || QEx; QLi = B_AGE || E_AGE || QLi; QTi = B_AGE || E_AGE || QTi; ASPR = B_AGE || E_AGE || ASPR; FINISH PBLT; /* Construct Population-Based LifeTable for Each kth State */ %DO Radix_J = 1 %TO (&STATES.-1); Radix_j = &Radix_J.; RUN PBLT; /* Column Label */ QNAME = {'B_Age' 'E_Age' 'Lx_All' %DO J = 1 %TO %EVAL(&STATES.-1); "Lx_&J." %END; 'nLx_All' %DO J = 1 %TO %EVAL(&STATES.-1); "nLx_&J." %END; 'Tx_All' %DO J = 1 %TO %EVAL(&STATES.-1); "Tx_&J." %END; 'Ex_All' %DO J = 1 %TO %EVAL(&STATES.-1); "Ex_&J." %END; }; QDNAME = {'B_Age' 'E_Age' %DO STATUS = 1 %TO %EVAL(&STATES.-1); %DO J = 1 %TO &STATES.; "D_&STATUS._&J." %END; %END; }; QLiNAME = {'B_Age' 'E_Age' 'Total' %DO J = 1 %TO %EVAL(&STATES.-1); "STATE_&J." %END; }; QTiNAME = {'B_Age' 'E_Age' 'Total' %DO J = 1 %TO %EVAL(&STATES.-1); "STATE_&J." %END; }; ASPRNAME= {'B_Age' 'E_Age' %DO J = 1 %TO %EVAL(&STATES.-1); "ASPR_&J." %END; }; /* Output the Matrices to SAS Datasets */ CREATE IQ_&Radix_J. FROM Q (|COLNAME=QNAME|); APPEND FROM Q ; CLOSE IQ_&Radix_J. ; CREATE IQD_&Radix_J. FROM QD (|COLNAME=QDNAME|); APPEND FROM QD ; CLOSE IQD_&Radix_J. ; CREATE IQLi_&Radix_J. FROM QLi (|COLNAME=QLiNAME|); APPEND FROM QLi; CLOSE IQLi_&Radix_J. ; CREATE IQTi_&Radix_J. FROM QTi (|COLNAME=QTiNAME|); APPEND FROM QTi; CLOSE IQTi_&Radix_J. ; CREATE IASPR_&Radix_J. FROM ASPR (|COLNAME=ASPRNAME|); APPEND FROM ASPR; CLOSE IASPR_&Radix_J.; FREE Q QD QLi QTi ASPR QLx QnLx QTx QEx QNAME QDNAME QLiNAME QTiNAME ASPRNAME %DO STATUS = 1 %TO %EVAL(&STATES.-1); QD_&STATUS. %END;; %END; FREE %DO STATUS = 1 %TO %EVAL(&STATES.-1); QPi_&STATUS. %END;; /*--------------------------------------------------------* * Construction of the Status-Based Life Tables * * Calculate the Expectation of Life by STATUS at Age x * * for Each STATUS at Age x in STATE k * *--------------------------------------------------------*/; START SBLT; Lx = J(&AGEGROUP., STATES, 0); /* Set the Radix Value */ Lx[Radix_X, Radix_J] = 100000; nLx = J(&AGEGROUP., STATES, 0); %DO X = 1 %TO %EVAL(&AGEGROUP.-1); IF (&X. >= RADIX_X) THEN DO; N = E_AGE[&X.] - B_AGE[&X.] + 1; Lx[%EVAL(&X.+1), ] = Lx[&X., ]*(I-N/2*M_&X.)*INV(I+N/2*M_&X.); nLx[&X., ] = N/2 * (Lx[&X., ] + Lx[%EVAL(&X.+1),]); END; %END; L_H = Lx[&AGEGROUP., 1] %DO J = 2 %TO (&STATES.-1); || Lx[&AGEGROUP., &J.] %END;; nLx_H = L_H*INVM_H; DO K = 1 TO (STATES-1); nLx[&AGEGROUP., K] = nLx_H[K]; END; QnLx = nLx[, 1] %DO J = 2 %TO (&STATES.-1); || nLx[, &J.] %END;; QTx = J(&AGEGROUP., STATES-1, 0); QTx[&AGEGROUP, ] = QnLx[&AGEGROUP., ]; DO X = 2 TO (&AGEGROUP.-Radix_X+1); DO J = 1 TO (STATES-1); QTx[&AGEGROUP.+1-X, J] = QTx[&AGEGROUP.+1-X+1, J] + QnLx[&AGEGROUP.+1-X, J]; END; END; QnLx = QnLx[,+] || QnLx; QTx = QTx[,+] || QTx; QEx = QTx[Radix_X, ] / 100000; FINISH SBLT; %DO Radix_X = 1 %TO &AGEGROUP.; %DO Radix_J = 1 %TO (&STATES.-1); Radix_X = &Radix_x.; Radix_J = &Radix_J.; RUN SBLT; /* Retain the Information for &Radix_X. Age Interval */ Q_&Radix_X._&Radix_J. = B_AGE[Radix_X, ] || E_AGE[Radix_X, ] || QnLx[Radix_X, ] || QTx[Radix_X, ] || QEx; FREE Lx QnLx QTx QEx; %END; %END; %DO STATUS = 1 %TO (&STATES.-1); SQ_&STATUS. = Q_1_&STATUS. %DO X = 2 %TO &AGEGROUP.; // Q_&X._&STATUS. %END;; QNAME = {'B_Age' 'E_Age' 'nLx_All' %DO J = 1 %TO %EVAL(&STATES.-1); "nLx_&J." %END; 'Tx_All' %DO J = 1 %TO %EVAL(&STATES.-1); "Tx_&J." %END; 'Ex_All' %DO J = 1 %TO %EVAL(&STATES.-1); "Ex_&J." %END; }; CREATE SQ_&STATUS. FROM SQ_&STATUS. (|COLNAME=QNAME|); APPEND FROM SQ_&STATUS.; CLOSE SQ_&STATUS.; %END; FREE /; QUIT; DATA QM(LABEL='Observed Occurrence/Exposure Rates'); SET QM; LABEL B_AGE = '[x,' E_AGE = 'x+n)' %DO STATUS = 1 %TO %EVAL(&STATES.-1); %DO J = 1 %TO &STATES.; M_&STATUS._&J. = "Mx: &STATUS.->&J." %END; %END;; DATA QPi(LABEL='Transition Probability; pi'); SET QPi; LABEL B_AGE = '[x,' E_AGE = 'x+n)' %DO STATUS = 1 %TO %EVAL(&STATES.-1); %DO J = 1 %TO &STATES.; Pi_&STATUS._&J. = "pi: &STATUS.->&J." %END; %END;; DATA QnLxS(LABEL="YearsLived in EachSTATUS by Person Age x"); SET QnLxS; LABEL B_AGE = '[x,' E_AGE = 'x+n)' %DO STATUS = 1 %TO %EVAL(&STATES.-1); _&STATUS._All = "&STATUS.: Total" %DO J = 1 %TO (&STATES.-1); _&STATUS._&J. = "&STATUS.-> &J." %END; %END;; TITLE "Observed Occurrence/Exposure Rates"; PROC PRINT LABEL NOOBS DATA=QM; FORMAT B_AGE E_AGE 3.0 M_1_1--M_%EVAL(&STATES.-1)_&STATES. 8.6; RUN; TITLE "Transition Probabilities"; PROC PRINT LABEL NOOBS DATA=QPi; FORMAT B_AGE E_AGE 3.0 Pi_1_1--Pi_%EVAL(&STATES.-1)_&STATES. 8.6; RUN; TITLE "Number of years Lived in Each STATUS by Person of Age x Whose STATUS at Age x is STATE k"; TITLE2 "(pi_jk + 1) / 2 * n for j = k; (pi_jk) / 2 * n for j ^= k"; TITLE3 "Lx for the Last Open-Ended Age Interval is Calculated from Mx^-1"; PROC PRINT LABEL NOOBS DATA=QnLxS; FORMAT B_AGE E_AGE 3.0 _1_All--_%EVAL(&STATES.-1)_%EVAL(&STATES.-1) 10.6; RUN; TITLE2 ''; TITLE3 ''; %DO J = 1 %TO (&STATES.-1); DATA IQD_&J.(LABEL='Decrements/Transfers'); SET IQD_&J.; LABEL B_AGE = '[x,' E_AGE = 'x+n)' %DO STATUS = 1 %TO %EVAL(&STATES.-1); %DO K = 1 %TO &STATES.; D_&STATUS._&K. = "Decrements: &STATUS.->&K." %END; %END;; DATA IASPR_&J.(LABEL='Implied Age-Specific Prevalence Rates'); SET IASPR_&J.; LABEL B_AGE = '[x,' E_AGE = 'x+n)' %DO K = 1 %TO %EVAL(&STATES.-1); ASPR_&K. = "ASPR: STATE #&K." %END; ; DATA IQ_&J.(LABEL='Population-Based Life Table Statistics'); SET IQ_&J.; LABEL B_AGE = '[x,' E_AGE = 'x+n)' Lx_All = 'l(x): Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); Lx_&STATUS. = "l(x): State #&STATUS." %END; nLx_All = 'nLx: Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); nLx_&STATUS. = "nLx: State #&STATUS." %END; Tx_All = 'Tx: Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); Tx_&STATUS. = "Tx: State #&STATUS." %END; Ex_All = 'e(x): Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); Ex_&STATUS. = "e(x): State #&STATUS." %END;; DATA IQLi_&J.(LABEL="Years Lived in EachSTATUS by Unit Cohort"); SET IQLi_&J.; LABEL B_AGE = '[x,' E_AGE = 'x+n)' TOTAL = 'Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); STATE_&STATUS. = "State #&STATUS." %END;; DATA IQTi_&J.(LABEL="Years Lived Beyond Age x"); SET IQTi_&J.; LABEL B_AGE = '[x,' E_AGE = 'x+n)' TOTAL = 'Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); STATE_&STATUS. = "State #&STATUS." %END;; TITLE "Life History of Initial Cohort of Age &LOWAGE. Initial STATUS of Cohort STATE #&J."; PROC PRINT LABEL NOOBS DATA=IQD_&J.; FORMAT B_AGE E_AGE 3.0 D_1_1--D_%EVAL(&STATES.-1)_&STATES. 7.0; SUM D_1_1--D_%EVAL(&STATES.-1)_&STATES.; RUN; TITLE "IMPLIED Age-Specific PREVALENCE RATES for Initial STATUS of Cohort STATE #&J."; TITLE2 "ASPR_j = nLx_j / nLx_all"; PROC PRINT LABEL NOOBS DATA=IASPR_&J.; FORMAT B_AGE E_AGE 3.0 ASPR_1--ASPR_%EVAL(&STATES.-1) 10.6; RUN; TITLE2 ''; RUN; TITLE "Number of Years Lived in Each STATUS by a Unit Cohort for Initial STATUS of Cohort STATE #&J. at Age &LOWAGE."; TITLE2 "Expected Number of Years Lived by Member of Initial Cohort Within Age Interval x to x+n"; TITLE3 "nLx_j / 100000"; PROC PRINT LABEL NOOBS DATA=IQLi_&J.; FORMAT B_AGE E_AGE 3.0 TOTAL STATE_1--STATE_%EVAL(&STATES.-1) 10.6; RUN; TITLE2 ''; TITLE3 ''; TITLE "Total Number of Years Lived Beyond Age x for Initial STATUS of Cohort STATE #&J."; TITLE2 "Tx_j / 100000"; PROC PRINT LABEL NOOBS DATA=IQTi_&J.; FORMAT B_AGE E_AGE 3.0 TOTAL STATE_1--STATE_%EVAL(&STATES.-1) 10.6; RUN; TITLE2 ''; TITLE "Population-Based Life Table Statistics for Initial STATUS of Cohort STATE #&J. at Age &LOWAGE."; TITLE2 "ex_j = Tx_j / l(x)_all"; PROC PRINT LABEL NOOBS DATA=IQ_&J.; FORMAT B_AGE E_AGE 3.0 Lx_All--Tx_%EVAL(&STATES.-1) 7.0 Ex_All--Ex_%EVAL(&STATES.-1) 8.4; RUN; TITLE1 ''; TITLE2 ''; RUN; %END; %DO J = 1 %TO (&STATES.-1); DATA SQ_&J.(LABEL='Status-Based Life Table Statistics'); SET SQ_&J.; LABEL B_AGE = '[x,' E_AGE = 'x+n)' nLx_All = 'nLx: Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); nLx_&STATUS. = "nLx: State #&STATUS." %END; Tx_All = 'Tx: Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); Tx_&STATUS. = "Tx: State #&STATUS." %END; Ex_All = 'e(x): Total' %DO STATUS = 1 %TO %EVAL(&STATES.-1); Ex_&STATUS. = "e(x): State #&STATUS." %END;; TITLE "Statu-Based Life Table Statistics for Initial STATUS of Cohort STATE #&J. at Age x"; TITLE2 "ex_j = Tx_j / 100000"; PROC PRINT LABEL NOOBS DATA=SQ_&J.; FORMAT B_AGE E_AGE 3.0 nLx_All--Tx_%EVAL(&STATES.-1) 7.0 Ex_All--Ex_%EVAL(&STATES.-1) 8.4; RUN; TITLE1 ''; TITLE2 ''; RUN; %END; %MEND MSLT; DATA REVES(LABEL='Heart Disease Life Table: Males, 70+'); INPUT B_AGE E_AGE M_1_1 M_1_2 M_1_3 M_1_4 M_1_5 M_2_1 M_2_2 M_2_3 M_2_4 M_2_5 M_3_1 M_3_2 M_3_3 M_3_4 M_3_5 M_4_1 M_4_2 M_4_3 M_4_4 M_4_5; CARDS; 70 70 .000000 .051360 .005164 .021236 .017200 .000000 .000000 .047562 .000000 .051270 .000000 .000000 .000000 .000000 .077259 .000000 .000000 .061258 .000000 .030081 71 71 .000000 .051973 .005364 .022239 .019211 .000000 .000000 .048588 .000000 .054766 .000000 .000000 .000000 .000000 .082074 .000000 .000000 .062237 .000000 .031933 72 72 .000000 .052388 .005572 .023290 .021457 .000000 .000000 .049637 .000000 .058500 .000000 .000000 .000000 .000000 .087188 .000000 .000000 .063232 .000000 .034007 73 73 .000000 .052602 .005787 .024391 .023965 .000000 .000000 .050709 .000000 .062488 .000000 .000000 .000000 .000000 .092621 .000000 .000000 .064242 .000000 .036332 74 74 .000000 .052611 .006012 .025544 .026767 .000000 .000000 .051803 .000000 .066749 .000000 .000000 .000000 .000000 .098393 .000000 .000000 .065269 .000000 .038939 75 75 .000000 .052416 .006245 .026751 .029896 .000000 .000000 .052921 .000000 .071300 .000000 .000000 .000000 .000000 .104524 .000000 .000000 .066312 .000000 .041867 76 76 .000000 .052019 .006487 .028015 .033391 .000000 .000000 .054064 .000000 .076162 .000000 .000000 .000000 .000000 .111037 .000000 .000000 .067372 .000000 .045159 77 77 .000000 .051424 .006738 .029339 .037295 .000000 .000000 .055231 .000000 .081355 .000000 .000000 .000000 .000000 .117957 .000000 .000000 .068448 .000000 .048866 78 78 .000000 .050639 .006999 .030726 .041654 .000000 .000000 .056423 .000000 .086902 .000000 .000000 .000000 .000000 .125307 .000000 .000000 .069542 .000000 .053046 79 79 .000000 .049672 .007270 .032178 .046524 .000000 .000000 .057641 .000000 .092827 .000000 .000000 .000000 .000000 .133115 .000000 .000000 .070653 .000000 .057767 80 80 .000000 .048534 .007552 .033699 .051963 .000000 .000000 .058885 .000000 .099157 .000000 .000000 .000000 .000000 .141410 .000000 .000000 .071783 .000000 .063110 81 81 .000000 .047239 .007844 .035292 .058038 .000000 .000000 .060156 .000000 .105918 .000000 .000000 .000000 .000000 .150222 .000000 .000000 .072930 .000000 .069167 82 82 .000000 .045799 .008148 .036960 .064823 .000000 .000000 .061455 .000000 .113140 .000000 .000000 .000000 .000000 .159583 .000000 .000000 .074095 .000000 .076047 83 83 .000000 .044231 .008464 .038706 .072401 .000000 .000000 .062781 .000000 .120854 .000000 .000000 .000000 .000000 .169528 .000000 .000000 .075279 .000000 .083879 84 84 .000000 .042550 .008792 .040536 .080865 .000000 .000000 .064136 .000000 .129094 .000000 .000000 .000000 .000000 .180092 .000000 .000000 .076482 .000000 .092814 85 85 .000000 .040774 .009132 .042451 .090319 .000000 .000000 .065521 .000000 .137897 .000000 .000000 .000000 .000000 .191314 .000000 .000000 .077705 .000000 .103028 86 86 .000000 .038921 .009486 .044458 .100878 .000000 .000000 .066935 .000000 .147299 .000000 .000000 .000000 .000000 .203236 .000000 .000000 .078946 .000000 .114732 87 87 .000000 .037008 .009854 .046559 .112671 .000000 .000000 .068380 .000000 .157342 .000000 .000000 .000000 .000000 .215900 .000000 .000000 .080208 .000000 .128174 88 88 .000000 .035052 .010236 .048759 .125843 .000000 .000000 .069856 .000000 .168071 .000000 .000000 .000000 .000000 .229354 .000000 .000000 .081490 .000000 .143649 89 89 .000000 .033071 .010632 .051064 .140555 .000000 .000000 .071364 .000000 .179530 .000000 .000000 .000000 .000000 .243646 .000000 .000000 .082792 .000000 .161506 90 90 .000000 .031080 .011044 .053477 .156987 .000000 .000000 .072904 .000000 .191772 .000000 .000000 .000000 .000000 .258828 .000000 .000000 .084115 .000000 .182163 91 91 .000000 .029096 .011472 .056005 .175339 .000000 .000000 .074478 .000000 .204847 .000000 .000000 .000000 .000000 .274957 .000000 .000000 .085459 .000000 .206119 92 92 .000000 .027132 .011916 .058651 .195838 .000000 .000000 .076086 .000000 .218815 .000000 .000000 .000000 .000000 .292091 .000000 .000000 .086825 .000000 .233970 93 93 .000000 .025203 .012378 .061423 .218732 .000000 .000000 .077728 .000000 .233734 .000000 .000000 .000000 .000000 .310292 .000000 .000000 .088213 .000000 .266434 94 94 .000000 .023320 .012858 .064326 .244303 .000000 .000000 .079406 .000000 .249671 .000000 .000000 .000000 .000000 .329628 .000000 .000000 .089622 .000000 .304371 95 95 .000000 .021494 .013356 .067367 .272864 .000000 .000000 .081120 .000000 .266695 .000000 .000000 .000000 .000000 .350169 .000000 .000000 .091055 .000000 .348822 96 96 .000000 .019734 .013873 .070550 .304763 .000000 .000000 .082871 .000000 .284880 .000000 .000000 .000000 .000000 .371989 .000000 .000000 .092510 .000000 .401042 97 97 .000000 .018048 .014411 .073885 .340392 .000000 .000000 .084660 .000000 .304304 .000000 .000000 .000000 .000000 .395170 .000000 .000000 .093988 .000000 .462553 98 98 .000000 .016442 .014969 .077377 .380186 .000000 .000000 .086487 .000000 .325053 .000000 .000000 .000000 .000000 .419794 .000000 .000000 .095490 .000000 .535203 ; %MSLT(DATA=REVES,B_AGE=B_AGE,E_AGE=E_AGE,STATES=5, MRATES=M_1_1 M_1_2 M_1_3 M_1_4 M_1_5 M_2_1 M_2_2 M_2_3 M_2_4 M_2_5 M_3_1 M_3_2 M_3_3 M_3_4 M_3_5 M_4_1 M_4_2 M_4_3 M_4_4 M_4_5); /*---------* * Example * *---------*/; /*--------------------------------------------------------------------------* * Marital Status Life Table for Females in Swedeen, Cohort Born 1930-1934 * * Source: Robert Schoen 1988. Modeling Multigroup Populations, pp. 92-93 * *--------------------------------------------------------------------------*/; DATA Schoen; INPUT B_AGE E_AGE M_1_1-M_1_3 M_2_1-M_2_3; CARDS; 0 0 .000000 .000000 .040764 .000000 .000000 .000000 1 4 .000000 .000000 .002944 .000000 .000000 .000000 5 9 .000000 .000000 .001015 .000000 .000000 .000000 10 14 .000000 .000000 .000776 .000000 .000000 .000000 15 19 .000000 .033278 .000457 .003191 .000000 .000665 20 24 .000000 .183666 .000680 .010515 .000000 .000429 25 29 .000000 .189127 .001187 .010894 .000000 .000515 30 34 .000000 .091324 .001724 .009264 .000000 .000618 35 39 .000000 .033658 .002478 .011609 .000000 .000898 40 44 .000000 .019438 .002888 .013179 .000000 .001284 45 49 .000000 .013481 .004158 .012014 .000000 .002122 50 54 .000000 .007286 .005491 .012507 .000000 .003359 55 59 .000000 .003105 .007105 .017602 .000000 .005092 60 64 .000000 .001201 .010504 .025512 .000000 .008225 65 69 .000000 .000494 .017660 .039434 .000000 .014042 70 74 .000000 .000203 .029869 .059783 .000000 .025723 75 79 .000000 .000094 .052667 .089778 .000000 .048466 80 84 .000000 .000045 .090402 .126430 .000000 .082431 85 99 .000000 .000000 .183160 .171942 .000000 .153682 ; %MSLT(DATA=SCHOEN,B_AGE=B_AGE,E_AGE=E_AGE,STATES=3, MRATES=M_1_1 M_1_2 M_1_3 M_2_1 M_2_2 M_2_3); /*-----------------------------------------------------------------------------* * Marital Status Life Table for Females in Swedeen, Cohort Born 1930-1934 * Sweden, Female Cohort Born 1930 to 1934 Marital Status Experience. * * Source: Robert Schoen 1988. Modeling Multigroup Populations, Appendix D.2 * *-----------------------------------------------------------------------------*/; DATA SWEDEN(LABEL='Sweden, Female Cohort Born 1930 to 1934'); INPUT B_AGE E_AGE POP_1-POP_4 D_1_2 D_1_3 D_1_4 D_1_5 D_2_1 D_2_3 D_2_4 D_2_5 D_3_1 D_3_2 D_3_4 D_3_5 D_4_1 D_4_2 D_4_3 D_4_5; D_1_1 = 0; D_2_2 = 0; D_3_3 = 0; D_4_4 = 0; ARRAY DX {20} D_1_1-D_1_5 D_2_1-D_2_5 D_3_1-D_3_5 D_4_1-D_4_5; ARRAY MX {20} M_1_1-M_1_5 M_2_1-M_2_5 M_3_1-M_3_5 M_4_1-M_4_5; ARRAY POP {4} POP_1-POP_4; DO I = 1 TO 20; GROUP = CEIL(I/5); IF POP(GROUP) ^= 0 THEN MX(I) = DX(I)/POP(GROUP); IF POP(GROUP) = 0 THEN MX(I) = 0; END; CARDS; 0 0 39913 0 0 0 0 0 0 1627 0 0 0 0 0 0 0 0 0 0 0 0 1 1 39299 0 0 0 0 0 0 223 0 0 0 0 0 0 0 0 0 0 0 0 2 2 39208 0 0 0 0 0 0 102 0 0 0 0 0 0 0 0 0 0 0 0 3 3 41383 0 0 0 0 0 0 78 0 0 0 0 0 0 0 0 0 0 0 0 4 4 41772 0 0 0 0 0 0 73 0 0 0 0 0 0 0 0 0 0 0 0 5 5 39270 0 0 0 0 0 0 47 0 0 0 0 0 0 0 0 0 0 0 0 6 6 38966 0 0 0 0 0 0 46 0 0 0 0 0 0 0 0 0 0 0 0 7 7 38916 0 0 0 0 0 0 42 0 0 0 0 0 0 0 0 0 0 0 0 8 8 41165 0 0 0 0 0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 9 9 41607 0 0 0 0 0 0 34 0 0 0 0 0 0 0 0 0 0 0 0 10 10 39229 0 0 0 0 0 0 35 0 0 0 0 0 0 0 0 0 0 0 0 11 11 38964 0 0 0 0 0 0 22 0 0 0 0 0 0 0 0 0 0 0 0 12 12 38879 0 0 0 0 0 0 22 0 0 0 0 0 0 0 0 0 0 0 0 13 13 41083 0 0 0 0 0 0 43 0 0 0 0 0 0 0 0 0 0 0 0 14 14 41530 0 0 0 0 0 0 33 0 0 0 0 0 0 0 0 0 0 0 0 15 15 39865 2 0 0 11 0 0 11 0 0 0 0 0 0 0 0 0 0 0 0 16 16 39621 77 0 0 137 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 17 17 39440 391 0 0 520 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 18 18 40229 2000 0 0 2475 0 0 20 0 0 5 4 0 0 0 0 0 0 0 0 19 19 37777 5052 3 10 3409 0 0 23 0 2 17 1 0 0 0 0 0 2 0 0 20 20 32363 9099 5 50 4366 0 0 13 0 5 60 2 0 2 0 0 0 0 0 0 21 21 27824 13747 11 105 4834 0 0 17 0 12 124 8 0 4 0 0 0 37 0 0 22 22 23356 17913 35 198 4619 0 0 20 0 18 190 7 0 12 0 0 0 68 0 1 23 23 20279 23303 45 328 4493 0 0 14 0 18 234 8 0 13 0 1 0 93 0 0 24 24 17018 26951 47 460 3716 0 0 15 0 22 274 14 0 14 0 0 0 151 0 0 25 25 11665 29878 66 651 2614 0 0 8 0 21 316 14 0 14 0 0 0 180 0 1 26 26 9558 31768 100 718 1924 0 0 14 0 32 330 15 0 12 0 0 0 208 0 1 27 27 8072 32773 124 870 1421 0 0 14 0 36 346 14 0 9 0 0 0 208 0 0 28 28 7326 35738 154 960 1126 0 0 7 0 33 340 22 0 7 0 0 0 216 0 1 29 29 6511 36907 176 1075 910 0 0 9 0 36 330 21 0 12 0 1 0 230 0 1 30 34 22934 184587 1260 7123 1913 0 0 43 0 229 1481 114 0 63 0 2 0 884 0 9 35 39 18126 184947 2465 12091 505 0 0 47 0 355 1792 166 0 52 0 5 0 543 0 29 40 44 16656 184613 4705 17069 204 0 0 44 0 609 1824 237 0 38 0 12 0 505 0 55 45 49 17481 197016 8940 18307 138 0 0 83 0 1041 1326 418 0 46 0 21 0 419 0 82 50 54 20696 211081 16931 19740 99 0 0 137 0 1750 890 709 0 32 0 83 0 287 0 95 55 59 21452 183046 26715 16572 53 0 0 159 0 2771 451 932 0 31 0 175 0 117 0 126 60 64 27432 163650 42914 14570 36 0 0 321 0 3937 238 1346 0 29 0 412 0 37 0 159 65 69 31279 121849 58889 11137 14 0 0 580 0 4694 111 1711 0 27 0 994 0 9 0 215 70 74 31909 74603 69092 7541 2 0 0 972 0 4427 33 1919 0 15 0 2035 0 5 0 235 75 79 25015 36479 65970 4825 1 0 0 1330 0 3261 14 1768 0 8 0 3453 0 1 0 263 80 84 16051 13114 48270 2724 1 0 0 1423 0 1656 2 1081 0 1 0 4387 0 0 0 251 85 99 10434 3286 33267 1478 0 0 0 1871 0 565 0 505 0 0 0 6132 0 0 0 272 ; TITLE 'Sweden, Female Cohort Born 1930 to 1934 Marital Status Experience.'; %MSLT(DATA=SWEDEN,B_AGE=B_AGE,E_AGE=E_AGE,STATES=5, MRATES=M_1_1 M_1_2 M_1_3 M_1_4 M_1_5 M_2_1 M_2_2 M_2_3 M_2_4 M_2_5 M_3_1 M_3_2 M_3_3 M_3_4 M_3_5 M_4_1 M_4_2 M_4_3 M_4_4 M_4_5);