options ls=80 nodate; *change name of path to read in fulldata.dat; data fulldata; infile 'E:\\fulldata.dat'; input pubid entry exit event p1 p2 p3 p4 per1234; run; * General gamma model with left truncation and right censoring. event = 0 for right censored observations, event = 1 for event times entry >= 0, time of entry for left truncated observations exit > 0, time of event or right censoring; * Fit a conventional general gamma model to data from all four periods; title 'Conventional Generalized Gamma Regression Model'; proc nlmixed cov fd; parms b1=1 b2=1 b3=1 b4=1 sigma=1 lambda=0.5; if (per1234 = 1) then beta=b1; if (per1234 = 2) then beta=b2; if (per1234 = 3) then beta=b3; if (per1234 = 4) then beta=b4; * Log likelihood for uncensored observations, no late entry: log[f(t)]; if (entry = 0 and event = 1) then ll = log(abs(lambda))-log(sigma)-lgamma((lambda**(-2)))+(lambda**(-2))*((-2)*log(abs(lambda))+(lambda/sigma)*(-beta+log(exit))) -(lambda**(-2))*((exp(-beta)*exit)**(lambda/sigma)); * Log likelihood for censored observations, no late entry: log[S(t)]; if (entry = 0 and event = 0 and lambda < 0) then ll = log( cdf('gamma',exit**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ); if (entry = 0 and event = 0 and lambda > 0) then ll = log( 1 - cdf('gamma',exit**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ); * Log likelihood for uncensored observations, with late entry: log[f(t)/S(w)]; if (entry > 0 and event = 1 and lambda < 0) then ll = log(abs(lambda))-log(sigma)-lgamma((lambda**(-2)))+(lambda**(-2))*((-2)*log(abs(lambda))+(lambda/sigma)*(-beta+log(exit))) -(lambda**(-2))*((exp(-beta)*exit)**(lambda/sigma)) - log( cdf('gamma',entry**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ); if (entry > 0 and event = 1 and lambda > 0) then ll = log(abs(lambda))-log(sigma)-lgamma((lambda**(-2)))+(lambda**(-2))*((-2)*log(abs(lambda))+(lambda/sigma)*(-beta+log(exit))) -(lambda**(-2))*((exp(-beta)*exit)**(lambda/sigma)) - log( 1 - cdf('gamma',entry**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ); * Log likelihood for censored observations, with late entry: log[S(t)/S(w)]; if (entry > 0 and event = 0 and lambda < 0) then ll = log( cdf('gamma', exit**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ) - log( cdf('gamma',entry**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ); if (entry > 0 and event = 0 and lambda > 0) then ll = log( 1 - cdf('gamma', exit**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ) - log( 1 - cdf('gamma',entry**(lambda/sigma), 1/(lambda*lambda), lambda*lambda*exp(beta*lambda/sigma)) ); model exit ~ general(ll); estimate 'logsigma' log(sigma); estimate 'RT2-1' exp(b2 - b1); ** Relative times, reference group is period one; estimate 'RT3-1' exp(b3 - b1); estimate 'RT4-1' exp(b4 - b1); run;