我正在尝试编写一个小程序来执行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
编辑:更正了最大似然的编码,但仍然存在收敛问题。