*! version 1.1 08 September 1992 (STB-10: sg15) program define spline version 3.0 local i=`1' mac shift mac def _varlist "req ex min(1) max(1)" local if "opt" local in "opt" parse "`*'" if `i' <3 | `i' >7 { di in red "you must specify between 3 and 7 knots" di in gre "see help spline" error 198 } qui count `if' `in' if _result(1)>99 { if `i'==3 { qui centile `1' `if' `in', centile(5 50 95) local knota=$S_7 local knotb=$S_8 local knotc=$S_9 gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; #del cr drop cut1 cut2 cut3 } else if `i'==4 { qui centile `1' `if' `in', centile(5 35 65 95) local knota=$S_7 local knotb=$S_8 local knotc=$S_9 local knotd=$S_10 gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; #del cr drop cut1 cut2 cut3 cut4 } else if `i'==5 { qui centile `1' `if' `in', centile(5 27.5 50 72.5 95) local knota=$S_7 local knotb=$S_8 local knotc=$S_9 local knotd=$S_10 local knote=$S_11 gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' gen byte cut5=`1'>`knote' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; gen double knot3=(((`1'-`knotc')^3)*cut3)- ((((`1'-`knotd')^3)*cut4*(`knote'-`knotc'))/(`knote'-`knotd'))+ ((((`1'-`knote')^3)*cut5*(`knotd'-`knotc'))/(`knote'-`knotd')) ; #del cr drop cut1 cut2 cut3 cut4 cut5 } else if `i'==6 { qui centile `1' `if' `in', centile(5 23 41 59 77 95) local knota=$S_7 local knotb=$S_8 local knotc=$S_9 local knotd=$S_10 local knote=$S_11 local knotf=$S_12 gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' gen byte cut5=`1'>`knote' gen byte cut6=`1'>`knotf' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; gen double knot3=(((`1'-`knotc')^3)*cut3)- ((((`1'-`knotd')^3)*cut4*(`knote'-`knotc'))/(`knote'-`knotd'))+ ((((`1'-`knote')^3)*cut5*(`knotd'-`knotc'))/(`knote'-`knotd')) ; gen double knot4=(((`1'-`knotd')^3)*cut4)- ((((`1'-`knote')^3)*cut5*(`knotf'-`knotd'))/(`knotf'-`knote'))+ ((((`1'-`knotf')^3)*cut6*(`knote'-`knotd'))/(`knotf'-`knote')) ; #del cr drop cut1 cut2 cut3 cut4 cut5 cut6 } else if `i'==7 { qui centile `1' `if' `in', centile(2.5 18.33 34.17 50 65.83 81.67 97.5) local knota=$S_7 local knotb=$S_8 local knotc=$S_9 local knotd=$S_10 local knote=$S_11 local knotf=$S_12 local knotg=$S_13 gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' gen byte cut5=`1'>`knote' gen byte cut6=`1'>`knotf' gen byte cut7=`1'>`knotg' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; gen double knot3=(((`1'-`knotc')^3)*cut3)- ((((`1'-`knotd')^3)*cut4*(`knote'-`knotc'))/(`knote'-`knotd'))+ ((((`1'-`knote')^3)*cut5*(`knotd'-`knotc'))/(`knote'-`knotd')) ; gen double knot4=(((`1'-`knotd')^3)*cut4)- ((((`1'-`knote')^3)*cut5*(`knotf'-`knotd'))/(`knotf'-`knote'))+ ((((`1'-`knotf')^3)*cut6*(`knote'-`knotd'))/(`knotf'-`knote')) ; gen double knot5=(((`1'-`knote')^3)*cut5)- ((((`1'-`knotf')^3)*cut6*(`knotg'-`knote'))/(`knotg'-`knotf'))+ ((((`1'-`knotg')^3)*cut7*(`knotf'-`knote'))/(`knotg'-`knotf')) ; #del cr drop cut1 cut2 cut3 cut4 cut5 cut6 cut7 } } else { if `i'==3 { qui centile `1' `if' `in', centile(50) if "`if'"!="" | "`in'"!="" { qui keep `if' `in' } sort `1' local knota=`1'[5] local knotb=$S_7 local knotc=`1'[_N-5] gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; #del cr drop cut1 cut2 cut3 } else if `i'==4 { qui centile `1' `if' `in', centile(35 65) if "`if'"!="" | "`in'"!="" { qui keep `if' `in' } sort `1' local knota=`1'[5] local knotb=$S_7 local knotc=$S_8 local knotd=`1'[_N-5] gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; #del cr drop cut1 cut2 cut3 cut4 } else if `i'==5 { qui centile `1' `if' `in', centile(27.5 50 72.5) if "`if'"!="" | "`in'"!="" { qui keep `if' `in' } sort `1' local knota=`1'[5] local knotb=$S_7 local knotc=$S_8 local knotd=$S_9 local knote=`1'[_N-5] gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' gen byte cut5=`1'>`knote' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; gen double knot3=(((`1'-`knotc')^3)*cut3)- ((((`1'-`knotd')^3)*cut4*(`knote'-`knotc'))/(`knote'-`knotd'))+ ((((`1'-`knote')^3)*cut5*(`knotd'-`knotc'))/(`knote'-`knotd')) ; #del cr drop cut1 cut2 cut3 cut4 cut5 } else if `i'==6 { qui centile `1' `if' `in', centile(23 41 59 77) if "`if'"!="" | "`in'"!="" { qui keep `if' `in' } sort `1' local knota=`1'[5] local knotb=$S_7 local knotc=$S_8 local knotd=$S_9 local knote=$S_10 local knotf=`1'[_N-5] gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' gen byte cut5=`1'>`knote' gen byte cut6=`1'>`knotf' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; gen double knot3=(((`1'-`knotc')^3)*cut3)- ((((`1'-`knotd')^3)*cut4*(`knote'-`knotc'))/(`knote'-`knotd'))+ ((((`1'-`knote')^3)*cut5*(`knotd'-`knotc'))/(`knote'-`knotd')) ; gen double knot4=(((`1'-`knotd')^3)*cut4)- ((((`1'-`knote')^3)*cut5*(`knotf'-`knotd'))/(`knotf'-`knote'))+ ((((`1'-`knotf')^3)*cut6*(`knote'-`knotd'))/(`knotf'-`knote')) ; #del cr drop cut1 cut2 cut3 cut4 cut5 cut6 } else if `i'==7 { qui centile `1' `if' `in', centile(18.33 34.17 50 65.83 81.67) if "`if'"!="" | "`in'"!="" { qui keep `if' `in' } sort `1' local knota=`1'[5] local knotb=$S_7 local knotc=$S_8 local knotd=$S_9 local knote=$S_10 local knotf=$S_11 local knotg=`1'[_N-5] gen byte cut1=`1'>`knota' gen byte cut2=`1'>`knotb' gen byte cut3=`1'>`knotc' gen byte cut4=`1'>`knotd' gen byte cut5=`1'>`knote' gen byte cut6=`1'>`knotf' gen byte cut7=`1'>`knotg' #del ; gen double knot1=(((`1'-`knota')^3)*cut1)- ((((`1'-`knotb')^3)*cut2*(`knotc'-`knota'))/(`knotc'-`knotb'))+ ((((`1'-`knotc')^3)*cut3*(`knotb'-`knota'))/(`knotc'-`knotb')) ; gen double knot2=(((`1'-`knotb')^3)*cut2)- ((((`1'-`knotc')^3)*cut3*(`knotd'-`knotb'))/(`knotd'-`knotc'))+ ((((`1'-`knotd')^3)*cut4*(`knotc'-`knotb'))/(`knotd'-`knotc')) ; gen double knot3=(((`1'-`knotc')^3)*cut3)- ((((`1'-`knotd')^3)*cut4*(`knote'-`knotc'))/(`knote'-`knotd'))+ ((((`1'-`knote')^3)*cut5*(`knotd'-`knotc'))/(`knote'-`knotd')) ; gen double knot4=(((`1'-`knotd')^3)*cut4)- ((((`1'-`knote')^3)*cut5*(`knotf'-`knotd'))/(`knotf'-`knote'))+ ((((`1'-`knotf')^3)*cut6*(`knote'-`knotd'))/(`knotf'-`knote')) ; gen double knot5=(((`1'-`knote')^3)*cut5)- ((((`1'-`knotf')^3)*cut6*(`knotg'-`knote'))/(`knotg'-`knotf'))+ ((((`1'-`knotg')^3)*cut7*(`knotf'-`knote'))/(`knotg'-`knotf')) ; #del cr drop cut1 cut2 cut3 cut4 cut5 cut6 cut7 } } noi di "" noi di "for test of functional form use testparm `1' kn*" noi di "for possible help in transforming, obtain the predicted values," noi di "using fpredict, and then gr pred.val by `1'" end