首先声明,本文无任何商业利益冲突也非针对国内几款R为载体的收费软件或R包的攻击,内容客观公正一切学术角度还原真相。
这个话题很沉重,沉重到我犹豫很久(思考几个月)是否要发这篇文章。因为,NHANES数据几乎都要用复杂抽样RCS,但是国内加权RCS代码又几乎是错的,如果没有人呼吁,那将会继续祸害这个方向的研究甚至对国人水文的鄙夷笔伐。但,指出来又意味着众多发表在诸如Frontiers in 期刊的文章都面临勘误风险,甚至不知道是否会被不良人利用。后台和学术群总有小伙伴问我这个NHANES等加权rcs问题,小编一方面看到国内学生疯狂注水FI杂志NHANES,一方面感觉这群不明真相的学生们很容易误入歧途。
小编思考良久,决定还是发这篇文章,虽然很可能被问候攻击,但是能为医学学术环境带来些许清流也算尽自己一份力吧。
先上结论:
“”
目前国内已有的复杂抽样rcs代码解释正确的只看到公众号“月明学习小铺”的推文,感兴趣的可以去关注!国内非统计人员制作的收费包和软件都错了,此功能谨慎使用。 个人DIY软件存在的问题是算法不慎求解,没有用复杂抽样专用的函数svycoxph (有的抽样设计定义了svycoxph但是实际源代码用的coxph)等估计95%CI ,并且错误应用相应predict函数,在设定HR/OR=1上压缩参数错误,还有的是卖弄概念直接粗暴的coxph加个weight参数就当复杂抽样的svycoxph。 HR/OR95%CI计算错误。当复杂抽样考虑多种权重或者需要进行置信区间判断2分类、3分类的时候,会导致后续统计错误。Non-linearity P 和overall P错误。
下面是一些重要演算推论过程。
cph(函数和svycoxph()函数都可以用来执行Cox比例风险模型,但它们的主要区别在于,svycoxph(函数是设计用于考虑复杂调查设计的,特别是在涉及到分层、聚类和/或加权数据时,而cph()函数主要用于处理普通的(非复杂调查设计的)数据集。svycoxph()函数属于survey包,它考虑了复杂抽样设计的特点,如分层、聚类和加权这在处理具有这种特点的大型调查数据 (如人口普查数据或国家健康营养检查调查(NHANES)数据)时非常重要。这样的分析能更准确地反映出抽样设计的不确定性,并提供更准确的标准误差和置信区间的估计。与此相比,使用rms包的cph)函数,即使包含权重参数weights,也主要是为了处理每个观察结果的重要性不同的情况,而不是为了处理复杂的抽样设计,见下图。因此,尽管两者在某些情况下可能产生相似的结果 (特别是在数据设计相对简单,每个观察结果的重要性相近的情况下),但在处理复杂调查设计的数据时,它们可能会产生不同的结果。如果你的数据集具有复杂的抽样设计特征(如聚类、分层或加权),那么使用svycoxph才正确!
rms包内置的Predict函数可以很快速的获取RCS模型,请参阅小编之前RCS系列文章,包括一般线性、logistic、cox、poisson回归分别获取β、OR、HR、RR效应量。但是,重点来了,复杂抽样类似nhanse这样的设计,是需要采用svycoxph函数来设定design类型的,但是rms包并不提供相应的Predict过程。所以需要根据算法自编!尤其是带协变量cov和不带cov的RCS,细节很不一样,在建模过程中需要更换数据集,且是否压缩置信区间带也是很多坑。
Svycoxph的overall p 和 non-linear p值计算,需要用wald X2估计,因为rms中不支持anova(svy.fit)。
其实小编一直有个看似多余的习惯,就是R代码结果会和SPSS、SAS交叉验证。因为,曾经小编犯过很多错误,R并不能告诉你你的代码错了,很多时候逻辑都没有问题,但是你可能漏了关键变量或者没有标准化等一些细节。我想SAS、SPSS能成为全球统计标杆,靠的是几十年来千锤百炼无数次检验的、以及背后无数统计学家的支持。试想一下,BMJ下文如果你的点估计曲线和95CI%错了,还怎么外推出正确的SBP的切点呢?这还只是冰山一角,细思极恐。
“我们需要对统计算法心存敬畏、对黑盒子R软件保持怀疑精神。加权rcs模块请谨慎使用,真要不会多请教学校的统计老师们。
”
本公众号建立了学术交流群(群),仅供SCI学术交流,人数有限需要实名制,还剩40个坑。入群请加笔者微信 popnie,请备注实名制格式:姓名-学校(单位)-专业。