影像组学(Radiomics)是一个新兴的概念,2012 年由荷兰学者 Philippe Lambin 首次提出,其定义是借助计算机软件,从医学影像图像中挖掘海量的定量影像特征,使用统计学和/或机器学习的方法, 筛选最有价值的影像组学特征,用以解析临床信息,用于疾病的定性、肿瘤分级分期、疗效评估和预后预测等.
流程概述
第一步:勾画ROI(三维ROI)
这一步很多软件都能做到 (工具见第二部分)。请留意使用的工具应能勾画三维的ROI,并且体素大小、层间距等几何信息能计算准确,否则跟形态/轮廓相关的特征会计算错误。
第二步:计算ROI内影像信号(也就是把ROI内的影像抠出来)的特征集。特征集包括:灰度特征:即常见的直方图信息譬如均值,均方偏差,偏度之类;
形状特征:根据ROI轮廓计算的,如体积、表面积、最大径之类的;
纹理特征:通过灰度共生矩阵计算出来的高阶特征。这些纹理特征其实往往都有显示意义,举例:SizeZone特征用于评估ROI内影像的块状程度,下列两个瓷砖图的Small Area Emphasis / Large Area Emphasis就不同。
这一步需要特别留意的是:应该用信号真实值而不是灰度值进行计算。单纯把0~4095的灰度值放进去计算,难以把不同被试的图归一化。所以作者不推荐用通用的图像纹理计算软件。应使用专业的医学影像处理软件,准确读入DICOM信息得到真实值。
第三步:数据挖掘,预测模型建立与检验。
目前最常见的套路是利用Lasso回归筛选相关变量,然后绘制nomogram,对nomogram性能进行评价。如果再深入一点,那就是基于nomogram做亚组划分与分析。
重点:本文小编将此软件按照,ROIs 绘制,Lasso教程,再到nomogram建立,全流程手把手传授,并结合案例给大家分析讲解。
1. 软件要求和准备工作
1.1 软件安装
Radiomics最主要就是靶区规划(ROIs),有很多软件都可以实现,市面上大部分软件都是基于python开发和运行的,需要安装照Python和设置环境。那么,有没有更省事一步到位的解决办法?答案是,有。这个一步到位的解决方法就是本文要介绍的3D Slicer。3D slicer (https://download.slicer.org/),支持MAC 和Window, 免费!免费!免费!重要的事情说三遍!
1.2 软件简介
假定大家已经从网站下载最新的4.8.1版本,完成了安装。软件启动后,将显示下面的界面:
注意到红色箭头指向的右上方按钮图标了吗?这不就是Python的代表性Logo吗?没错,只要安装好3D Slicer,内部就会直接准备好了Python 2.7的开发环境。点击这个按钮,就会在软件的下方启动Python的交互式开发环境。
1.3 操作示范:
大家可以参考下面这个网站(https://www.slicercn.com),网站里有很多教大家使用的中文视频,我就不重复讲了。
2. 演示如何使用3D Slicer 获取radiomics
2.1 绘制ROIs
这里推荐AI绘制(Nvidia Clara )
PS: 安装NvidiaAIAssistedAnnotation扩展(在“分割”类别中),等待安装完成,然后单击“重新启动”
以肝脏为例
CT对肝脏的基于边界点的分割:转到 示例数据 模块并加载“ CTACardio”数据集
转到 Segment Editor
创建一个新的细分
双击segment名称并输入“ liver”以指定细分内容
单击“ Nvidia AIAA”效果,“从边界点分割”部分
可选:单击“过滤器”图标以仅列出名称中包含“肝脏”的那些型号
选择“ annotation_ct_liver”(训练为在门静脉期CT图像中分割肝脏的模型)
单击“放置标记点”按钮,然后在切片视图中的所有6个侧面的肝脏边缘附近单击,然后单击“开始”
在大约30秒内,自动分割结果将出现在切片视图中。要以3D形式显示结果,请点击Segment Editor列表上方的“显示3D”按钮。
要在分割完成后调整先前放置的边界点,请单击“开始”按钮旁边的“编辑”图标。
在CT上对肝脏和肿瘤进行全自动分割:从http://medicaldecathlon.com/下载Task03_Liver \ imagesTr \ liver_102.nii.gz数据集并将其加载到3D Slicer中
转到 Segment Editor
点击“ Nvidia AIAA”效果
在“自动分割”部分中,选择“ segmentation_ct_liver_and_tumor”模型,然后单击“开始”
自动分割结果应在3-5分钟内显示
可选:转到 Segments 模块以编辑显示设置
label: liver / tumor
2.2 提取radiomics
主要使用pyradiomics组件,引用某大神一个完整的视频给大家介绍下提取,可以只参考视频的最后一部分就可以了,前面的规划,可以参考上述内容。
https://www.bilibili.com/video/BV15V411Z73o?from=search&seid=5989594993256922790
3. lasso回归,确定潜在变量
第一步呢,永远是读入数据和核查数据。
然后,进入到我们此次教程的一个关键环节,分割数据。我们这个数据集当中共有699例样本,我们需要将其随机分割为训练集和测试集,一般的样本比例是2:1,也就是2/3的病人用来做训练,训练出一个准确的模型,剩下1/3病人用来做测试,验证我们的这个模型是否可靠。分割数据的代码如下,整个过程都是随机的:# 分割数据set.seed(123)ind
样本(也就是数据的行)分配好了之后呢,下一步就是把采集到的信息(也就是数据列)进行分配,在我们的这个测试数据中前面V1-V9是采集到的样本信息,最后一列是我们的诊断,也就是肿瘤的良恶性,下面我们把样本信息和样本诊断分割开来:# Convert data to generate input matrices and labels:# x相当于临床信息x
首先,我们尝试做K-fold交叉验证。在glmnet包中使用cv.glmnet()估计λ值,glmnet默认使用10倍交叉验证。所谓K-fold交叉验证,就是将数据分成k个相同的子集(折叠子集),每次用k-1个子集拟合模型,然后将剩余的子集作为测试集,最后将k个结果合并(一般采用平均值)来确定最终的参数。在此方法中,每个子集仅用作测试集一次。在glmnet包中使用K-折交叉验证非常容易。结果包括每个相应的MSE值和相应的λ。在这里,我们将训练集k值定为5,做5-fold cross validation,这也是比较常用的。# 5-fold交叉验证,找出最佳lambda值fitCV
上面的图叫做CV统计图,CV统计图与glmnet中的其他图表有很大的不同,它表示了λ的对数与均方差以及模型中变量数量之间的关系。图表中的两条垂直虚线表示最小均方误差的对数λ(左侧虚线)和最小距离的标准误差的对数λ(右侧虚线)。如果存在过拟合问题,那么从最小值到标准误差位置的距离是解决问题的一个很好的起点。可以看到,我们可以选择的lambda值有两个,具体lambda选值要根据自己实验设计而定。lambda.min是最佳值,lambda.1se则是一倍SE内的更简洁的模型。这也涉及到临床模型一个很重要的考量标准,到底是选择精度高但是复杂的模型,还是放弃部分精度,选择变量更少更有可能有应用价值的模型呢?本例中我们选择最佳lambda值。然后我们来看一下,随着lambda值的变化,每个观察值对应的系数的变化趋势。# check the coeffit
此图显示,随着λ的减少,压缩参数减少,系数的绝对值增加。这个模型应该如何在文章中描述呢?我们来输出系数:# get the coefcoef.min = coef(fitCV, s = 'lambda.min')coef.min
然后就会生成每个变量所对应的系数,我们也可以通过这个系数来对模型进行描述。
……
4. nomogram建立和验证