做生存分析的时候,最让人头秃的就是时间变量。特别是当你手里攥着一堆地理位置数据,想看看不同区域的人生存率有啥区别时,那种感觉就像是在迷宫里找出口。很多人一上来就搞复杂模型,其实geo数据怎么做cox,核心就俩字:对齐。
我上周刚帮一个医疗团队处理完一批肿瘤随访数据,那叫一个乱。有的病人住在北京朝阳区,有的住在河北燕郊,坐标经纬度都有,但随访时间断断续续。刚开始我想着直接用经纬度做聚类,结果跑出来的Cox模型P值全是0.08,卡在显著性边缘,尴尬得我想把键盘吃了。后来我才反应过来,地理空间不是直接扔进模型里的自变量,它得转化成有意义的特征。
比如,你可以计算每个病人居住地到最近三甲医院的直线距离,或者开车导航距离。这个距离,就是最直接的“地理暴露”。我在处理那个案例时,特意把距离分成了三组:小于5公里,5-20公里,大于20公里。结果发现,大于20公里的那组,死亡风险比(HR)直接飙到了1.45。这数据太真实了,远水救不了近火,在急救和长期随访里都是硬道理。
还有种做法,是用地理加权回归的思想,虽然Cox本身是全局模型,但你可以引入区域虚拟变量。比如把全国分成东中西,或者按气候带分。这时候要注意,虚拟变量千万别全放进去,得留一个作为参照组,不然矩阵奇异,软件直接报错。我有一次手滑,把七个区域全设进去了,RStudio直接给我弹出一堆红色警告,吓得我差点重启电脑。
另外,别忽略了时间依变协变量。有些病人的居住地是会变的,比如为了治病搬家。这时候,简单的基线坐标就没用了,得用动态的地理位置更新风险集。这个过程挺繁琐,得把随访时间切片,每个切片重新计算距离。虽然麻烦,但准确度高。我见过有人偷懒,只用入组时的地址,结果偏差大得离谱,尤其是那些为了治疗频繁跨城就医的病人。
说到这儿,可能有人问,那地理信息本身能直接进模型吗?理论上可以,比如用经纬度做多项式特征,或者用空间自相关指标如Moran's I。但说实话,解释性太差。HR是1.2,你说是因为纬度高了0.1度,还是经度偏了0.5度?没人听得懂。所以,geo数据怎么做cox,我的建议是:把地理信息转化为临床或社会经济学上有意义的指标,比如距离、区域等级、环境污染指数等。
再举个反例。有个同行非要用K-means聚类把病人分成几类,然后看聚类标签的生存差异。聚类本身没问题,但如果不结合临床背景,那就是瞎搞。我上次看到一篇论文,把病人按居住地聚类,发现某一群生存率特别低,细看才发现,那一群正好是雾霾严重的工业区。这才是地理数据该有的价值:揭示环境对健康的影响,而不是为了聚类而聚类。
最后,提醒一点,缺失值处理。地理数据缺失很常见,比如病人只写了“南方”,没写具体城市。这时候别急着删,可以用插补,或者设为单独一类“未知”。我试过直接删除,结果样本量少了30%,统计效能大打折扣,得不偿失。
总之,做geo数据怎么做cox,别整那些虚的。先把数据清洗干净,把地理信息转化成能解释的变量,再进模型。这样出来的结果,才经得起推敲,也才有人味。毕竟,我们做研究的,不是为了发文章而发文章,是为了看清那些隐藏在数字背后的人的故事。