我正在尝试编写一个小程序来进行 Cox 比例风险模型,最终目标是能够解决当前程序无法解决的问题。尽管试图重现stcox
. stcox
用于检查它是否正常工作,我可以证明可能性是正确的,因为最大值位于使用ml plot
. 然而,从这一点开始,它就崩溃了。变量drug
取值 1 或 0,由于它是 Cox 模型,因此无法拟合常数,因此在等式中指定。然而,通过观察Xb每次计算对数似然值时,可以看出对照组和治疗组的值都是变化的,实际上它们之间的差异是固定的,只是一个常数在变化。
clear all
webuse drugtr
*Show st settings
stset
*Fit Cox proportional hazards model
stcox drug, breslow
gen timem = -_t
sort timem
capture program drop mlcox
program mlcox
version 10
args lnf Xb
tempvar risk sumrisk sumrisk2
qui gen double `risk'=exp(`Xb')
qui gen double `sumrisk'=0
local N=_N
forval j=1/`N' {
qui replace `sumrisk'=`sumrisk' + exp(`Xb'[`j']) if _t[`j']>=_t
}
tab `Xb'
qui replace `lnf' = 0 if $ML_y1==0
qui replace `lnf' = `Xb' - log(`sumrisk') if $ML_y1==1
end
ml model lf mlcox ( died = drug, noconstant)
ml plot -4 1 30
ml maximize
编辑:更正了最大似然的编码,但仍然存在收敛问题。