Editor's Note
来自谷子歌的札记,供大家参考。
The following article is from 统计札记 Author 谷子歌
向临床大夫传播「统计思维」;与统计人员交流「统计技术」。
点击下方公众号,回复资料分享,收获惊喜
统计札记 1: 我们应该学统计编程吗?
一家之言:应该。作为一个科研人员,用短时间的投入,获得此后职业生涯中高频使用的技能,不仅可以提高研究质量,还可以节省大量时间。
一家之言:新药临床试验,首选SAS;机器学习,首选Python;有钱想省心,首选SAS;没钱爱折腾,首选R;毕业拿文凭,发文升职称,SPSS。
很多时候,刚开始接触编程时,一些常用的关键词,语法,总是记不住。如果手头有一张“速查表”(cheat sheet),时不时的查阅一下,几次之后,通常就熟悉记住了。分享一个SAS初学者的“速查表”。
安装Rstudio后,在Help->Cheatsheets 下,即可获得高质量的R 语言“速查表”。更多的速查表,可在 Rstudio 官网 上下载。
医药行业里,基本都听说过GCP,知道临床试验需要有良好质量管理规范。其实,统计编程也一样。因此,有一个术语叫GPP,即良好的编程实践(Good Programming Practices)。如何才是GPP呢?分享一个文件《Good Programming Practices in Healthcare Creating Robust Programs》。
Hadley Wickham 是 Rstudio的首席科学家,也是诸如 ggplot2, tidyverse 等一系列 R 包的作者。其代码风格,有一套完整的体系,这就是《The tidyverse style guide》,这个R代码风格指南,也是 google 所推崇的。
提到 SAS 绘图,很多人固有的概念是太难学,太死板,太难看,其实从 SAS 9.2 引入ODS 绘图后,SAS的绘图越来越好。如果你对 SAS绘图还心存畏惧,不妨读一读《如何又快又美地用 SAS 画各种统计图形?》
The Little SAS Book 的两位作者 Susan J. Slaughter 和 Lora D. Delwiche 在其 SAS Global Forum 2015 的文章里Graphing Made Easy with SG Procedures 里用 5 张表格对ODS绘图做了非常好的总结,非常便于查找。征得作者允许后,我将其翻译成了中文版。
做 RCT 的 Meta 分析时,需要针对偏倚风险做评估,Cochrane 对此有专门的工具,目前已经更新到了第二版版,即 RoB2。RoB2 相对 RoB 在命名,以及评估上,都所不同,值得注意。
偏倚风险评估工具第二版(RoB2)与第一版最大的不同是:RoB2是针对每一个结局做偏倚风险评估,而RoB1是针对纳入的研究做偏倚风险评估。
对于诊断研究的meta分析,有什么好的工具吗?推荐阅读 Junfeng Wang. Journal of Laboratory and Precision Medicine 2019, 4, 22-22.
对于生存数据,单因素分析时,通常绘制K-M曲线,多因素分析时,则通过 Cox 模型计算校正的HR。其实,如果能够同时展示校正的K-M曲线,那结果将会更加生动。如何做校正的K-M,分享一篇小综述。
SPSS, Stata, R ,SAS 都可以实现生存曲线的校正。其中的逆概率加权法,是比较推荐的方法,也很容易在 R 的 RISCA 包 通过 ipw.survival 函数实现。具体见分享的文献。
熟悉 IPW 法的原理的话,在 SAS 中也很方便实现 IPW 法的生存曲线校正。分享一个SAS 宏程序的实现版本。
自 SAS 9.2 引入ODS 绘图后,SAS 其实有一个图形化的绘图界面:ODS graphics designer。通过此界面,SAS 不仅可以像 SPSS 那样进行菜单式绘图,同时还可以获得图形背后的SAS代码(确切说是GTL代码)方便以后复用。如何操作呢?只要运行 %sgdesign 两次,即可启动 ODS graphics designer。
趋势检验在医学研究中非常普遍,其中Cochran-Armitage Trend Test 是最为常用的一种。分享一篇SAS paper,详解 及原理及SAS 中的实现。
“相关不等于因果”这是统计人员耳熟能详的一句话。统计人员对于谈论“因果”也一直比较避讳。关于因果推断,目前已经有很多专著了,最新又火了一本新书 《 The Book of Why: The New Science of Cause and Effect》,中文版《为什么》也上市了。推荐感兴趣的伙伴阅读。
SAS 在加载别人的SAS 数据集时,有可能出现错误,其中一个原因就是数据集绑定的格式 丢失,此时只需要在程序最前面加一行option nofmterr; 代码即可。
SAS 在加载别人的SAS 数据集时,有可能出现错误,这其中除了数据格式 丢失,还有可能就是数据编码不对应导致。此时,只需要在数据集选项里用encoding= 指定其编码格式即可。比如 data=tmp(encoding = "EUC") 。
默认的SAS命名规则中,SAS变量名和数据集名是无法使用中文等特殊字符的,不过我们可以通过options validmemname=extend validvarname=any 系统选项,突破此限制。
当SAS结果窗口结果太多,希望尽快清理干净,从一个干净清爽的界面重新开始时,dm命令就可以派上用场了。具体代码如下:dm odsresults "clear"continue;。
运行任何 SAS 代码,SAS 结果窗口都没有任何反应,也没有任何错误反馈,只是在 log 里重复显示运行的代码,此时就是中了“黑洞”错误。解决的方法有两个,一个是重启SAS,另一个是重复 运行 *';*";*);*/;%mend; run; 直到 log 中出现错误提示。
如果SAS 数据集过大,想节约磁盘空间,可以采用系统选项 options compress=yes 来创建压缩的数据集,节约磁盘空间,效果显著。
启动 Rstudio 时白屏,先检查 R 是否安装在全英文目录下,如果是,则可能是安装了多个R 版本导致,解决方法是:启动 Rstudio 时按住ctrl 键,选择一个对应的R版本即可。
在Rstudio中交互式的学习R,推荐两个方式:一个是 swirl包,另一个是 learnr包。Rstudio官方还基于 learnr包 做了一个Tutorial。安装 learnr 包后,可在 Rstudio 的 Environment 面板找到 Tutorial。
Rstudio 为R 用户提供了非常便利的使用环境,在写R代码时,我有两个非常高频的快捷键。一个是用 Alt和-键,输入R语言中独特的赋值符号 <-;另一个就是在 Rmd 文件中,利用 Ctrl+Alt+I插入代码块。
如果只是想体验下 SAS ,不想/无法 安装 SAS 软件,或者自己的SAS 版本不够新,可以在 https://welcome.oda.sas.com/login 注册一个账号,尝试下 SAS 官方的免费云端版 SAS。
相比SAS, R的安装要简单许多。如果你连R也不想安装,只是想体验下,网上也有很多免费在线可用的R,推荐一个最根正苗红的,那就是 Rstudio 出品的 RStudio Cloud(https://rstudio.cloud/)。
RR, OR, HR 对于医学领域的研究者来说,应该都不会陌生。最近看文献,碰到一个刻画多水平数据变异的指标MOR(Median OR), 简单来说,其含义是在两个不同的大环境中各随机抽取1个体,其发生某种事件的Odds 的比值。MOR经常用于描述带群组效应的二分类变量的变异水平。
当你看到 Z ==> X ==> Y 这种SAS 语句时,你肯定奇怪,竟然还有这种 SAS 语句?确实有,这其实是 SAS 做因果推断绘制因果图专用过程 PROC CAUSALGRAPH 的独特语句格式。除此之外,SAS 还有几个专门做因果推断的过程,比如 PROC CAUSALTRT 和 PROC CAUSALMED。
绘制带误差限的折线图时,其思路是:先计算出上下限,然后绘制折线及折线上的点和high-low bar。不过,现在的统计软件包,无论是SAS , 还是R, 其实都可以一步到位。SAS 里,借助 Proc sgplot 过程中vline 语句的limits=both limitstat = stddev选项 直接指定误差项的方向和种类即可。R里,借助ggplot2包中的 geom_line(), geom_point(), 以及 geom_errorbar() 亦可轻松实现。
library(ggplot2)
ggplot(mtcars, aes(x = cyl, y = mpg, color = factor(am))) +
geom_point(stat = 'summary', fun.y = 'mean') +
geom_line(stat = 'summary', fun.y = 'mean') +
geom_errorbar(stat = 'summary', width = 0.1)SAS 的版本号,有两种,一种如 9.4 这种短版本号;另一种如 9.4 TS1M5 这种长版本号。长版本号中,TS 表示 technical support, M 表示 maintenance. TS, M 都是 SAS 的小版本号迭代。
在启动 SAS 后的log 窗口中的NOTE信息中可以看到,此外也可以通过 %put &SYSVLONG; 获得 长版本号,通过 %put &SYSVER;获得短版本号。
SAS 的各个模块,也有自己的版本号。比如,用于统计分析的模块SAS/STAT的目前最新版本号为15.2。就SAS/STAT来说,每次更新,有可能强化一些已有的PROC,也有可能增加一些新的PROC,具体情况可以查看 What’s New in SAS/STAT。
对于均数,可在proc means 过程增加 mean clm 选项即可;对于率指标,可在proc freq 的 table语句中增加 binominal 选项。
proc means data=sashelp.class mean clm;
var age;
run;
proc freq data=sashelp.class;
table sex/binominal;
run;很多时候,对于某个统计方法的编程实现,或者某个SAS过程的使用技巧无从下手,我们可以检索下SAS论文:(1)Lexjansen;(2)SAS 的 SGF 大会论文
心理学教授,美国统计学会会士 Michael Friendly 的个人网站 www.datavis.ca上,有大量关于统计绘图的成套的macro,虽然有些老旧,但或可一用。
加州大学洛杉矶分校的数字研究与教育所(UCLA-IDRE),专为研究者提供了一整套的统计教育资源,包含R, Stata, SAS, SPSS 以及 Mplus 的配套操作,非常推荐。
如果想通过示例代码,快速了解R 如何做统计分析和绘图,推荐 STHDA , 从R 的基本安装, 数据导入导出,到统计分析,绘图,都有非常短小精炼的示例代码。
Table 1 表格的制作,其实有很多工具,R 中也有各种各样的软件包,比如 table1, tableone , 但良莠不齐,如何选择合适的软件包呢? 推荐一篇文章 : How to Easily Create Descriptive Summary Statistics Tables in R Studio – By Group,总结了近10个快速制作 Table 1 的 R 工具。
SAS 当然也可以快速制作 Table 1,不过需要借助宏程序。此前,也有部分作者分享过一些SAS 宏程序制作table 1, 但易用性/可获得性不高。我曾公开过一个 SAS 宏 %ggBaseline,可以比较完美的解决table 1 的制作, 具体可见《SAS 编程演义》的 Github 代码仓库。
R有很多开源的书,但一旦多了起来,也就不好选择。于是 Oscar Baruffa 便写了一个关于 R 书的书,Big Book of R, 从各个方面总结了众多类似的R书,让读者可以快速对这些R书有一个大致的了解。
一个简单的问题,很多人都会模棱两可,也有很多人会自信满满的答错。这个问题就是:Logistic regression 是 linear model 还是 non-linear model?先抛出一个答案:linear model. 参考文章 How to Choose Between Linear and Nonlinear Regression
线性模型(Linear model)与 线性效应(linear effect)不是两个等同的概念。线性模型里,也可以拟合非线性效应。比如说,y=a+bx^2^ 拟合出来的就是 U 型效应。
想要了解你的SAS安装了哪些模块,以及各模块的版本,可以采用下面的SAS 语句。
proc product_status;
run;安装的模块,不等于可用的模块。想要了解你的SAS获得了哪些模块的许可,以及各模块的到期的期限,可以采用下面的SAS 语句。
proc setinit;
run;在正式允许SAS程序之前,可以先用 obs 数据集选项,限定在一个小的数据集进行测试,没有问题后,再正式允许程序。
data tmp(obs=100);
sas statement;
run;不知道大家写东西的时候,是不是还是自然而然的打开 word 。我在写 《SAS 编程演义》时,虽然也是用word,但后来深受其害。后来成熟的 markdown 工具越来越多,就再也不想在 word 里写字了。如果有好的工具或者方案能解决 markdown 中文献引用的问题,那写学术文章也能很轻便了。
如果用 SAS import 过程导入 Excel 文件时,我们可以设置 dbms=excel 或者 dbms=xlsx,但这两者有何区别呢? 反正我会推荐后者。因为,当你的数据列很多时,用 dbms=excel 就有危险了。
我们可以在 SAS 的 enhanced editor 里写,也可以在 SAS studio 里写, 还可以在 SAS EG 里。大部分人用前者较多,因为测试代码快捷方便,如果你写边代码SAS 边给你补充提示,那不妨试试后两者。
5年前的SAS 代码,现在拿出来,跑起来丝毫没有问题。1年前的R代码,现在一跑,各种报错。唉,不得不感叹,更新迭代太快,也是一个烦恼。
打开 google, 输入 filetype: txt SID_header SAS 9.4 WX64 2021, 你就可以获得网络上分享的 SAS 9.4, Windows 64 位操作系统, 2021年到期的 SAS SID了。其它的情况,可以做相应的替换,比如操作系统版本(LIN X64),比如到期的时间等。
很多的统计分析过程,比如主成份分析,都建议先对数据进行标化。我们可以手动操作,即每个变量都减去其均数后再除以其方差。不过SAS 中有一个过程,可以非常方便的进行数据标化,那就是 proc stdize。
proc stdize data=sashelp.class out=stdclass;
var age weight height;
run;SAS 的 proc stdize 过程,本意用于数据的标化,不过,利用 missing选项,它还有一个妙用:连续变量缺失值的填补。可以设定用均值或者中位数填补,也可直接指定一个具体的值填补。
proc stdize data=sashelp.heart out=impheart missing=mean reponly oprefix sprefix=imp_;
var Cholesterol;
run;喜欢 R 的同学,不要错过了 R 的盛会, posit 公司每年举办的 posit::conf ()。全程24 小时,全球 50 多位讲者, 通过网络分享关于 R 和 Rstudio 的一切话题。
要想快速熟悉一个 SAS 数据集里面的变量内容,一个途径是打开数据集直接查看,另一个是右击数据集,选择 View clumns 。不过这些都是权宜之计,长久之法是,用 proc contents 直接 打印出所有的变量,保存起来。
proc contents data=sashelp.class order=varnum;
run;SASHelp 逻辑库下有很多SAS 自带的数据集,熟悉其中的数据集,对我们做一些测试非常有帮助。比如 class 数据集,我经常用其做一些编程测试;heart 数据集,可以用来拟合一些统计模型;cars 数据集,可以用来做绘图测试。
你可能不相信,其实SAS 出版社出版过一本科技英语写作的书,书名就是 The Global English Style Guide: Writing Clear, Translatable Documentation for a Global Market。其实 SAS 的官方文档,一直以高质量著称,因此出一本高质量的科技英语写作,也就不足为怪了。
SAS 数据集中变量与观测的操作,我们用 3 个阶段 2 种类型来总结,所谓 3 个阶段可以归纳为:①读入阶段;②编程阶段;③输出阶段;所谓 2 种类型是指:①可以对行进行操作;②也可以对列进行操作。
SAS 数据集中变量与观测的操作,我们用 3 个阶段 2 种类型来总结。
(1)在读入阶段,数据读入缓冲区进入 PDV 之前,我们可以对变量进行筛选、重命名,对观测进行筛选。
(2)在编程阶段,数据进入 PDV 之后,我们可以对观测进行筛选、对变量执行其他操作(如生成、分组等)以及对变量进行筛选、重命名。
(3)在输出阶段,数据出 PDV 到输出数据集,我们可以对变量进行筛选、重命名,对观测进行筛选。
在生成新变量时,我们经常需要依据条件语句进行条件赋值。大众最先想到的办法是 if-else 及其嵌套。其实,除了 if-else, 我们有更好的选择,比如:SELECT-WHEN, SELECT-CASE 以及 format 。
哥大有几位专注中介分析的教授 Linda Valeri, Caleb Miles 等, 开了一个暑期线上培训班,培训班太贵,但他们还弄了一个网站,里面有些不错的资源:https://www.publichealth.columbia.edu/research/population-health-methods/causal-mediation, 对于想了解中介分析的,很有帮助。
哈佛大学 的Tyler VanderWeele 在中介分析领域,提出很多重要原创性思想, 也是著作 Explanation in Causal Inference 的作者。其主页上:https://www.hsph.harvard.edu/tyler-vanderweele/tools-and-tutorials/ 有很多关于中介分析的资源,其中有一个 一天的中介分析培训班的视频,已经在 YouTube 上公开。
传统的中介分析,往往只讨论一个中介变量,当同时有多个中介变量时,如何估算中介效应呢?可参考Linda Valeri 的 CMAverse R 包:https://bs1125.github.io/CMAverse/index.html
SAS 中有个一个专用的中介分析过程 proc causalmed, 顾名思义,过程名是 causal mediation的缩写。其用法主要通过model, mediator, covar 三个语句分别指定模型,中介变量和协变量。不过SAS 的这个过程,目前仅支持一个中介变量。
SAS 中的很多函数、例程都是家族式的,长得非常相似,功能也比较接近,比如:FIND、FINDC、FINDW,INDEX、INDEXC、INDEXW等,末尾的“C”代表“Character”(字母), “W”代表“Word”(单词)。此外还有CATS 、CATT、CATX中的“S”、“T”、“X”分别代表“Strip”(掐头去尾)、“ Trailing”(去尾)、“Extend”(扩展),此外还有函数末尾有“N” (数字型) 或“C”(字符型),如 PUTN, PUTC。
SAS中,有同学经常用 var =“”或者 var =. 来为变量赋缺失值,其实有一个更稳健的做法。call missing(var); 这也是例程妙用的一个小例子。
以前在 SAS 里面做倾向性评分,只能自己组合 data 步 和 proc 步,其实 psmatch 过程出来后,基于ps 得分,无论是做PSM,还是IPW, 都非常方便。不要被 psmatch 这个名字给骗了。
SAS 官方整理的,统计话题资源,对于经常使用SAS做统计分析的人来说,可以临时检索备用,也可以系统的过一遍。地址:https://support.sas.com/rnd/app/stat/procedures/psmatch.html
在做多因素模型的时候,一定要注意先检查单个变量的缺失情况及分布状况,否则容易出现一些反常的结果。比如,增加预测因子的个数,ROC 反而下降了,其原因很可能就是因为缺失值导致每次纳入模型的观测数不一样了。
预测模型中,常用 Brier Score 来作为模型的校准度指标来评价模型的预测性能。Brier Score 的计算其实非常简单:模型预测的概率(0~1)与实际观察的结果(0或1)的差值的平方。由此可知:Brier Score 的取值范围是其实是 0~1。
取值为 0 时,表示所有的预测分毫不差;
取值为 1 时,表示所有的预测截然相反;
取值为 0.25 时,那就相当于随机猜测的结果,模型也就毫无预测价值。
SAS ODS Graphics 编辑器需要在 ODS Destination 里用 SGE=ON 设置打开。设置后,再生成 ODS Graphics 时,就会生成可编辑的 ODS SGE 文件。在结果树形目录里,可以看到生成的SGE文件,双击即可启动 SAS ODS Graphics 编辑器对图片进行简单的编辑工作。
ods html sge=on;
ods graphics on/width=20cm height=18cm noborder
imagename="failureplot" outputfmt=jpg;
proc lifetest data=sashelp.bmt plots=(s(f));
time t*status(0);
strata group;
run;
ods html sge=off;此前提及过,SAS中进行连续变量的分割,有多种方法。其中最容易想到的一种方法便是 if-else 语句。以 BMI 来判断肥胖程度为例。
data Obese;
length status $ 15; /*指定字符长度*/
set sashelp.class;
BMI= weight*0.4536/(height*0.0254)**2;
if BMI<18.5 then Status="Underweight";
else if BMI<25 then Status="Normal";
else if BMI<30 then Status="Overweight";
else Status="Obese";
run;此前提及过,SAS中进行连续变量的分割,有多种方法。以 BMI 来判断肥胖程度为例,今天分享第二种方法:SELECT-WHEN 。
data obese;
length status $ 15; /*指定字符长度*/
set sashelp.class;
BMI= weight*0.4536/(height*0.0254)**2;
select ;
when(BMI<18.5) Status="Underweight";
when(BMI<25) Status="Normal";
when(BMI<30) Status="Overweight";
other Status="Obese";
end;
run;此前提及过,SAS中进行连续变量的分割,有多种方法。以 BMI 来判断肥胖程度为例,今天分享第三种方法 :SELECT-CASE 。
proc sql;
create table obese as
select *, weight*0.4536/(height*0.0254)**2 as BMI,
case when(calculated BMI<18.5 ) then "Underweight"
when(calculated BMI<25) then "Normal"
when(calculated BMI<30) then "Overweight"
else "Obese"
end as Status
from sashelp.class;
quit;此前提及过,SAS中进行连续变量的分割,有多种方法。以 BMI 来判断肥胖程度为例,今天分享第四种方法 :自定义格式 。
proc format;
value obefmt low-18.5="Underweight"
18.5-<25="Normal"
25-<30="Overweight"
30-high="Obese";
run;
data obese;
length status $ 15;
set sashelp.class;
BMI= weight*0.4536/(height*0.0254)**2;
Status=put(BMI,obefmt.);
run;不知道大家对“可重复性研究”有何感想。要实现“可重复性研究”,需要有:运行的计算机环境、研究数据、以及脚本代码。此外,如何做好版本管理也是一个问题。因此,GitHub可能是一个必备的技能。对于常用R的统计分析人员, 这里有一份非常详细的关于 GitHub 的指南:https://rfortherestofus.com/2021/02/how-to-use-git-github-with-r/
Hadley Wickham 的 dplyr 包 发布了三个升级版本:(1)支持多核的 multidplyr;(2)支持 data.table 的dtplyr;(3)支持 SQL 的 dbplyr 。具体:https://www.tidyverse.org/blog/2021/02/dplyr-backends/。
生存分析中,当有多个结局事件时,且某结局事件的发生会影响甚至阻止其它结局事件的发生,此时就会存在竞争风险。针对竞争分析,常用三种分析策略: (1) 复合终点; (2) 原因别风险; (3) Fine-Gray模型。三种分析策略的总结见下表:
| 处理策略 | 具体方法 | 解读 |
|---|---|---|
| 复合终点 | - K-M估计曲线 - Log-rank检验 - Cox比例风险函数 | - 联合事件不一定 具有临床意义,可解释性差 - 无法精细分析 各成分事件,造成信息损失 |
| 原因别风险 | - Nelson-Aalen累积风险曲线 - Gray’s检验 - 原因别风险函数 | - 将其它事件视为删失,分别对每个事件采用传统Cox回归 - 适合病因学问题 - 相对作用 |
| Fine-Gray模型 | - Nelson-Aalen累积风险曲线 - Gray’s检验 - 次分布风险函数 | - 发生其它事件的研究对象仍纳入风险集,估计关注事件的CIF - 适合预测预后问题 - 绝对效应 |
针对竞争风险分析的软件实现,比较方便的是借助 SAS 的 proc lifetest 和 proc phreg 两个过程,或者 R 软件的 Survival/rms 和 cmprsk / riskRegression 软件包。具体总结如下:
| 处理策略 | 内容 | R 软件操作 | SAS软件操作 |
|---|---|---|---|
| 复合终点 | - K-M估计曲线 - Log-rank检验 - Cox比例风险函数 | - Survival::survfit, survminer::ggsurvplot - Survival::survdiff - Survival::coxph, rms::cph | - Proc lifetest - Proc phreg |
| 原因别风险 | - Nelson-Aalen累积风险曲线 - Gray’s检验 - 原因别风险函数 | - cmprsk::cuminc - Survival::coxph, rms::cph - riskRegression::CSC | - Proc lifetest plot=cif - Proc phreg 过程model 语句eventcode(cox)= 选项 |
| Fine-Gray模型 | - Nelson-Aalen累积风险曲线 - Gray’s检验 - 次分布风险函数 | - cmprsk::cuminc - Survival::coxph, rms::cph, - Cmprsk::crr, riskRegression::riskRegression | - Proc lifetest plot=cif - Proc phreg 过程model 语句eventcode= 选项 |
Cox 模型中的比例风险假定判定的方法和软件操作,推荐 UCLA 的 IDRE 官方网页:https://stats.idre.ucla.edu/other/examples/asa2/testing-the-proportional-hazard-assumption-in-cox-models/。
Cox 模型中基于殃残差的比例风险判定,在SAS的 phreg 过程步中有一个非常方便的实现方法,那就是经常被大家忽略的 assess 语句。
proc phreg data=sashelp.bmt;
class group;
model T * Status(0)=group /rl ;
assess ph;
run;SAS help 写的真的是太良心了。虽然以前我自己也总是强调读 help 的重要性,这次我系统的读了几个新 SAS 过程步的 help,不得不得说,SAS 的 help 对是一个方法学从入门到深入的精品小综述。Overview 基本上能把方法的历史渊源,来龙去脉弄个大概;Details 能基本梳理好核心方法学要点;而 Syntax 里基本上就是告诉读者SAS配备了哪些实现这些方法的利器; 配合 Getting Started 和 Examples ,能快速掌握这些方法和代码。
作为统计师,和临床大夫科研合作多年,一个最大的感受就是:在国内,针对临床大夫的科研教育这一块是缺失的。学生时代,流行病和统计等科研基础课程是比较敷衍,不受重视的。工作后,各种轮转,但没有专门、系统的科研思维培训教育。这样导致的后果是一部分大夫确实想做科研,但是起步艰难。他们临床很好,但要做科研,就不懂研究设计,不懂数据分析,没有章法,思维混乱。真正能够野蛮生长起来的,成为有科研思维,懂科研路数和技术的PI,真的是非常难得了。
样本量计算,是一个非常重要又是一个非常敷衍的话题。说非常重要,从形式上来说,是因为很多课题申请标书中,必须要有样本量计算这部分内容;从科学性上来说,样本量估算是研究设计中可以以点带面的核心“点”。说非常敷衍,是因为大部分研究课题(RCT研究除外),其实对样本量并没有,也不需要严格的统计学估算。
为什么说除了RCT,其他研究中样本量估算是一个很敷衍的话题。RCT,尤其是三期临床试验,目的是为了在预估的条件下,验证/否定研究假设,因此,需要严格的参数预估,样本量估算,以获得统计检验足够的把握度。但观察性研究中,大多是为了“提出假设”,此时,对于样本量,大多数情况下“就地取材,就汤下面” 即可,不必过于苛求。此外,观察性研究中,常常需要采用多因素回归控制混杂,但基于多因素回归的样本量估算,理论上比较匮乏,常见的 EPV, PPV 原则,其实只是基于模型的稳定性的要求,而非效应量做的统计模拟。
样本量的估算,本质是基于假设检验倒推过而来。因此,样本量估算是基于预知的“果” (效应量)来倒推现在需要满足的“因” (样本量)。如果对预知的果(效应量)的假定出现了较大的偏离,比如过分乐观估计治疗效应,基于此的研究设计在验证当初的假设时,肯定也会出现问题,这就是“搬起石头砸自己的脚”。
样本量的估算时,对于效应量的估计,有几个途径:(1)基于研究文献;(2)基于预实验;(3)基于临床经验。基于文献时,可以基于单篇文献,也可基于多篇文献的 meta 分析结果。但基于文献的效应估计,应考虑到临床实践和场景不同,经可能的选择研究人群、干预措施、终点指标定义和测量与自己研究一致的研究。基于预实验的预估,如果设计合理,取样足够,应该是最可靠的效应量的预估。
样本量估算,是研究设计中的画龙点睛之笔,唯有对研究方案有完全的了解,才能做出更加准确的样本量估算。比如临床试验里面,要考虑是优效、非劣效、还是等效性设计,非劣效设计中,非劣效界值是多少?临床实践中,脱落率大概在什么水平等?如果不说明整个研究设计,不提供基本的参数,就直接去问一个统计师,我要做一个三期临床试验,需要多大的样本量?这种问题是无法回答的。
如何选择合适的工具制作流程图?你可能会想到用 word, ppt;或许更笨重的 Microsoft Visio 。我此前推荐过 draw.io 这款小软件,制作起来非常顺手。具体可参考 这篇推文。
对于临床研究人员来说,最常用的流程图其实就是 Figure 1. Study flow chart。制作研究流程图,几乎没有什么其他的高深的统计技巧,无非就是统计各条件排除的频数及百分比。不过,这里面有一个容易踩的坑。如果分别统计各条件排除的频数,那据此相加所得的排除总人数很可能会高于实际排除的人数,因为各条件之间可能有重叠,因此比较推荐的做法是采用层次排除法。具体可见这篇推文。
其实,类似draw.io 画流程图的工具不少,比如中文软件有 processon 等。不过此类工具都有共同的缺陷:非编程,无法文本化,修改不方便。最近尝试了下 markdown 下 的 mermaid,语法简单,使用顺手,美观简洁,值得花点时间学习下。具体可参考: https://mermaidjs.github.io/ 。
手头有 Meta 分析,准备要写 Meta 分析的同学留意了,系统评价和 Meta 分析的报告准则更新了,详情请见:The PRISMA 2020 statement: an updated guideline for reporting systematic reviews。
不同类型的临床研究,在写作和报告时,需要遵循一些各自的注意事项,因此,研究者们针对各种类型的研究,分别开发了适宜的报告规范,比如 针对研究设计方案的SPRIT, RCT 的 CONSORT, 观察研究的 STROBE以及系统综述和 meta 分析的 PRISMA。临床预测模型,其实也有专用的报告规范 TRIPOD, 具体可见我们的案例解读:TRIPOD 解读上 及TRIPOD 解读下
临床研究报告规范,除了规范本身及其 check list ,很多的报告规范还配备了解释和阐述(explanation and elaboration,E&E),这些 E&E文件,为我们更好的理解报告规范的条目内容、产生背景及背后逻辑提供了非常好的材料,是不容错过的学习素材。
如何写临床研究文章的摘要?大部分的期刊都遵循 IMRaD(introduction, methods, results and discussion) 的模式,几乎的所有的临床研究报告规范里面,也有涉及摘要的条目,不过研究显示,大部分研究报告的摘要质量堪忧。因此,很多临床研究报告规范都为摘要部分专门设立了报告规范,比如,TRIPOD for Abstract, CONSORT for Abstract, STARD for Abstracts, 你知道的,还有哪些?
针对不同的具体研究,临床研究报告规范还有相应的扩展版本,最典型的比如 临床试验报告规范 CONSORT, 就有针对非劣效临床试验的 CONSORT Non-inferiority;针对整群设计的 CONSORT Cluster 和 Stepped wedge cluster randomised trials;针对多臂平行对照的 CONSORT for multi-arm parallel-group randomised trials;针对实效临床试验的 CONSORT Pragmatic Trials;针对 病人报告结局的 CONSORT PRO;针对 N-of-1 试验的 CONSORT-CENT;针对预实验的CONSORT for pilot and feasibility trials;还有赶时髦的 针对 AI 的 CONSORT-AI。你颤抖了嘛?
大数据和AI的浪潮,已经“波及”了传统的临床试验。随着AI 临床研究设计规范 SPIRIT-AI 和 报告规范 CONSORT-AI 的发布,未来AI 将更加深入的参与临床试验。关于 SPIRIT-AI 和 CONSORT-AI, 我们已经引入并翻译后发表在了《中国卒中杂志》,详见:中国卒中杂志. 2020;15:1228-1238, 中国卒中杂志. 15:1327-1336.
其实除了SPIRIT-AI 和 CONSORT-AI,还有其他更多将AI 用于医学研究的规范,比如 MINIMAR (J Am Med Inf Assoc. 2020;27:2011-2015.), MI-CLAIM (Nat Med. 2020;26:1320-1324.),CLAIM (Radiology: Artificial Intelligence. 2020;2:1-6.)。最近,AI 用于临床预测模型的报告规范 TRIPOD-AI 也已经开始征求专家意见了。
读了这么多临床研究报告规范,有没有突发奇想,自己开发一个?我真想过。这事其实也靠谱,遵循开发临床研究报告规范的规范,也即“meta-guideline ” 即可,还别说,真有一个,详见:PLoS Med. 2010;7:e1000217. 一起搞一个idea,做一回临床研究报告规范的开发 PI 吧?
研究中,通常会把多张图片组合在一起做成一张面板(panel)图。很多的同学会先会先画出单个图,然后借助其他工具,比如 PPT 进行组合。其实,完全没有必要,面板图直接在 SAS 里即可完成。想知道如何实现,来看这篇推文 。
以前用 SAS 的人懒得用 SAS 画图,不过自从SAS 9.2 推出 ODS Graphics System 之后,SAS 的绘图变得简单统一了。一般来说, 三行代码即可完成一张统计图形的绘制。具体可参考此前的教程
NEJM 期刊的生存曲线, 有两个特点:曲线带 No. at risk 的表格;大图内嵌了一个局部放大的K-M曲线小图。如何通过 SAS 来直接绘制呢?第一点:No. at risk 表格,利用 SAS 自带的生存分析过程步 proc lifetest中plot选项的atrisk子选项,可以轻松实现;第二点:大图套小图,比较复杂,需要用到 GTL 啦。具体参考 这篇推文
SAS 绘图的默认样式都是比较“老成稳重”的,不过利用自定义style ,可以为SAS备上各华丽的外套。我曾利用自定义style 模仿 过 ggplot2 。更换一下样式,一秒钟即可实现 统计图形的改头换面。如果你想知道细节,看SAS是如何变身ggplot2 风格的,可戳 这篇推文 。
大多数期刊要求的图片的格式,无非两种格式:PDF 或者 TIFF。统计软件里面直接输出的 PDF 图 都是矢量图,放大不会变模糊,后期也方便编辑。因此,我强烈建议直接输出PDF格式,至于TIFF格式,我个人建议是能不用就别用了吧。关于 SAS 的实现方法,可戳 这篇推文
我用 SAS 绘制过各种统计图形,精选了选一部分案例,希望快速上手,依葫芦画瓢的同学,请瞅 这篇推文
医学研究中,森林图 (forest plot)其实非常常见。我曾给森林图下这个这样一个定义:以无效线(横坐标刻度为0或1的竖线)为中心,同时结合数字、文本以及图形,以展示各研究以及汇总各研究结果,或者亚组分析、回归分析结果的综合图形。如此说来,细究的话,森林图其实至少有三种:(1)meta 分析森林图;(2)亚组分析森林图;(3)回归分析森林图。经过meta 的洗礼,大家对第一种一定不会陌生;经常读 NEJM 的 大型临床试验 paper 的话,对第二种也不会陌生。第三种,其实和第二种一样,都是将效应指标(OR, RR, HR)用带 95% CI 的 点图呈现出来而已。
森林图的实现方法,多种多样。最笨(麻烦),也可能是最容易上手的方法,其实是 Excel 。我曾写过一篇教程,教大家如何用 Excel 复现 NEJM 风格的 森林图,广大的临床医生经常使用,爱得不得了。你也试试的话,参考这篇推文 。
森林图的实现方法, 除了此前分享的 Excel 大法,如果你会一点R,用两三行代码就能轻松解决。R 包 forestplot ,forestmodel 都提供了非常方便的函数。关于 forestplot ,可戳 这篇推文,关于 forestmodel,可戳这篇推文。
森林图的实现方法, SAS 也可以。以前SAS 画森林图需要借助 GTL , 随着 SAS 加入了 yaxistable 语句 和 indentweight 选项,即便是亚组分析的森林图, SAS 也能很好的处理了。如果你一直习惯了用 SAS, 或者好奇如何用 SAS 绘制森林图,可戳这篇推文。
Big Book of R 是一本R书籍的索引,目前已经收集了 200 多本 R 书籍,其中大部分都是免费开源的,推荐感兴趣的同学去扫一遍。
Meta 分析确实是非常适合作为科研训练的入门技能。如果真的能深入理解 PI(E)COtS 准则,理清研究的效应量,搞懂合并效应量合并的统计方法和原理,那科研思维就是真的能建立起来了。
说起 meta 分析的学习材料,最正统的当然 Cochrane 的 Handbook,目前最新版是 6.2:https://training.cochrane.org/handbooks, 网上也有四川大学华西医院中国 Cochrane 中心和兰州大学循证医学中心 翻译的 5.2 版的中文版。理念建立起来了,后续操作,就简单了。可以用官方的无需编程的 RevMan, 不过我更推荐使用 R 软件,可以更方便的做更丰富的分析。
Meta 分析的 操作软件,我推荐 R。几个原因:1. R 免费开源,易获得;2. meta 分析的 R 软件包 丰富;3. 相关开源教程多,学习方便。随手推荐一本 非常优秀的 bookdown 开源书籍:Doing meta-analysis in R, 地址:https://bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/ 。
如果你喜欢吃快餐,那可以看看我几年前写的极简教程:Meta 分析的10个问题:从理论概念到编程实践 。
SAS 宏编程的本质是文本替代,可以实现用“元编程”的功能,即“让代码自己写代码” 。我的一个好哥们,曾经写一个SAS 宏编程的系列教程:SAS 岩论,非常用心,质量非常高。推荐给大家。SAS 岩论首篇。
即便是在 RCT 和前瞻性队列研究中,研究者也将校正的 OR 作为主要的效应指标,这种做法背后原因是啥?对吗?可以计算报告校正的 RR 吗?有哪些方法?其原理是啥?该如何选择?又如何实现呢?这篇文章 一次性帮你搞定。
关于校正的率的计算,其实有多种不同的思路,一种是基于”标化“的方法,另一种是基于模型的校正方法。不过两种方法,并不是完全割裂的。这篇文章做了一个详细的总结,请戳这篇推文
一个基于 learR 软件包开发的 R 学习教程:adventr , http://milton-the-cat.rocks/home/adventr.html 。还有相应的 配套教材 https://www.discoveringstatistics.com/books/an-adventure-in-statistics/
关于校正的RD, 有一篇文章做个系统介绍 (BMC Med Res Methodol. 2016;16(1):113.),比较了6 种方法: binomial identity, Poisson identity , normal identity (linear), log binomial, log Poisson, and logit binomial (logistic )。其中,binomial identity 是一种方便可用的方法。
对于ICC,其实有多种不同的定义。一个比较通用的定义是:组间的变异占总体变量的比例。但这个解读和其名称“矛盾”,明明是组内相关系数,为什么说的是组间的变异。其实可以这样来理解:ICC = 0 时,说明组间没有差别,那就是没有什么“组”,大家都是独立的个体;ICC=1 时,说明变异全是组间变异,组内没有什么差别,也即“组内”几乎是完全等同(相关)的个体。
NIH 出品的 关于 RCT 的思考:https://rethinkingclinicaltrials.org/,非常值得一读,里面有关于PCT 的详细介绍,更多的 slide 可见:https://dcricollab.dcri.duke.edu/sites/NIHKR/KR/Forms/AllItems.aspx
基于网页版的屏幕共享小软件,非常轻量、方便。https://app.screego.net/
绘制森林图时,若效应指标是绝对效应指标,则可以用原始尺度;若是相对效应指标,应当用 log 尺度的横坐标,如此,0.5 和 2 与 1 的距离才是等距的。SAS 中具体实现的技巧是 给 sgplot 的 xaxis 语句添加 type=log logbase=e logstyle=LOGEXPAND logvtype=EXPANDED 选项。
校准度是预测模型评价中非常重要的指标,此前具体展现时用的校准度曲线是十分法的散点和45度斜线的组合,目前推荐用同时用图+统计量的展示方法。图:基于 loss 平滑或者样条函数的个体水平的非线性曲线;统计量:(1)(总体校准度 (calibration-in-the-large):限定校准斜率为1 时的校准截距,O/E。(2)校准斜率(3) 其他 如 ECI (Estimated Calibration Index),ICI (Integrated Calibration Index) 。
Binary 和 binomial 这两个词特别容易弄混。与之相关的两个术语就是 Bernoulli 和 binomial 分布。Binary 就是单纯指 0,1 取值分布,也即 Bernoulli 分布。模型中 Y 的取值是 0,1。Binomial 是 重复n 次 Bernoulli 试验,也即 Bernoulli 随机变量的和。模型中 Y 的形式是:n/m 。
对于匹配的case-control ,一直以来有两个误解:一是匹配可以消除混杂;二是匹配的数据需要用“匹配”的分析,如条件 logistic 回归。BMJ 这篇文章告诉你,正确的做法:匹配的case-control 分析时需要校正 匹配的变量,但并不总是需要采用 “匹配” 数据分析方法。
推荐: 可以保存以下照片,在b站扫该二维码,或者b站搜索【庄闪闪】观看Rmarkdown系列的视频教程。Rmarkdown视频新增两节视频(写轮眼幻灯片制作)需要视频内的文档,可在公众号回复【rmarkdown】
R沟通|Rmarkdown教程(4)
R沟通|Rmarkdown教程(3)
R沟通|Rmarkdown教程(2)