program define _crcsrv2 version 2.1 mac def _varlist "req ex" mac def _if "opt" mac def _in "opt" parse "%_*" parse "%_varlist", parse(" ") cap drop _xi cap drop _surv cap drop _stds cap drop _vlogs cap drop _atrisk capture { if "%_3"!="" { mac def _byc "by %_3:" } gen _stds = - %_2 sort %_3 %_1 _stds /* deaths first */ gen int _xi = 0 %_byc replace _xi = 1 %_if %_in %_byc replace _xi = 0 if %_1==. | %_2==. %_byc replace _xi = sum(_xi) %_byc replace _xi = _xi[_N] + 1 - _xi gen _surv = 1 replace _surv = (_xi - %_2) / _xi %_if %_in replace _surv = 1 if %_1==. | %_2==. %_byc replace _surv = _surv * _surv[_n-1] if _n>1 by %_3 %_1: replace _surv = _surv[_N] label var _surv "Survival Probability" replace _stds = %_2 / _xi / (_xi - 1) gen int _atrisk=_xi-1 replace _xi=-1 %if %in /* -1 ==> in the sample */ replace _xi=0 if %_1==. | %_2==. replace _stds=0 if _xi!=-1 %_byc gen _vlogs = sum(_stds) by %_3 %_1: replace _vlogs = _vlogs[_N] replace _surv=. if _xi!=-1 replace _vlogs=. if _xi!=-1 replace _stds = _surv*sqrt(_vlogs) label var _stds "Greenwood Survival S.D." label var _vlogs "Var(log(_surv))" label var _atrisk "N at risk at t+" drop _xi } mac def _rc = _rc exit %_rc end