影像組學(Radiomics)是一個新興的概念,2012 年由荷蘭學者 Philippe Lambin 首次提出,其定義是借助計算機軟件,從醫(yī)學影像圖像中挖掘海量的定量影像特征,使用統(tǒng)計學和/或機器學習的方法, 篩選最有價值的影像組學特征,用以解析臨床信息,用于疾病的定性、腫瘤分級分期、療效評估和預后預測等.
流程概述
第一步:勾畫ROI(三維ROI)
這一步很多軟件都能做到 (工具見第二部分)。請留意使用的工具應能勾畫三維的ROI,并且體素大小、層間距等幾何信息能計算準確,否則跟形態(tài)/輪廓相關的特征會計算錯誤。
第二步:計算ROI內(nèi)影像信號(也就是把ROI內(nèi)的影像摳出來)的特征集。特征集包括:
灰度特征:即常見的直方圖信息譬如均值,均方偏差,偏度之類;
形狀特征:根據(jù)ROI輪廓計算的,如體積、表面積、最大徑之類的;
紋理特征:通過灰度共生矩陣計算出來的高階特征。這些紋理特征其實往往都有顯示意義,舉例:SizeZone特征用于評估ROI內(nèi)影像的塊狀程度,下列兩個瓷磚圖的Small Area Emphasis / Large Area Emphasis就不同。
這一步需要特別留意的是:應該用信號真實值而不是灰度值進行計算。單純把0~4095的灰度值放進去計算,難以把不同被試的圖歸一化。所以作者不推薦用通用的圖像紋理計算軟件。應使用專業(yè)的醫(yī)學影像處理軟件,準確讀入DICOM信息得到真實值。
第三步:數(shù)據(jù)挖掘,預測模型建立與檢驗。
目前最常見的套路是利用Lasso回歸篩選相關變量,然后繪制nomogram,對nomogram性能進行評價。如果再深入一點,那就是基于nomogram做亞組劃分與分析。
重點:本文小編將此軟件按照,ROIs 繪制,Lasso教程,再到nomogram建立,全流程手把手傳授,并結(jié)合案例給大家分析講解。
1. 軟件要求和準備工作
1.1 軟件安裝
Radiomics最主要就是靶區(qū)規(guī)劃(ROIs),有很多軟件都可以實現(xiàn),市面上大部分軟件都是基于python開發(fā)和運行的,需要安裝照Python和設置環(huán)境。那么,有沒有更省事一步到位的解決辦法?答案是,有。這個一步到位的解決方法就是本文要介紹的3D Slicer。3D slicer (https://download.slicer.org/),支持MAC 和Window, 免費!免費!免費!重要的事情說三遍!
1.2 軟件簡介
假定大家已經(jīng)從網(wǎng)站下載最新的4.8.1版本,完成了安裝。軟件啟動后,將顯示下面的界面:
注意到紅色箭頭指向的右上方按鈕圖標了嗎?這不就是Python的代表性Logo嗎?沒錯,只要安裝好3D Slicer,內(nèi)部就會直接準備好了Python 2.7的開發(fā)環(huán)境。點擊這個按鈕,就會在軟件的下方啟動Python的交互式開發(fā)環(huán)境。
1.3 操作示范:
大家可以參考下面這個網(wǎng)站(https://www.slicercn.com),網(wǎng)站里有很多教大家使用的中文視頻,我就不重復講了。
2. 演示如何使用3D Slicer 獲取radiomics
2.1 繪制ROIs
這里推薦AI繪制(Nvidia Clara )
PS: 安裝NvidiaAIAssistedAnnotation擴展(在“分割”類別中),等待安裝完成,然后單擊“重新啟動”
以肝臟為例
轉(zhuǎn)到 示例數(shù)據(jù) 模塊并加載“ CTACardio”數(shù)據(jù)集
轉(zhuǎn)到 Segment Editor
創(chuàng)建一個新的細分
雙擊segment名稱并輸入“ liver”以指定細分內(nèi)容
單擊“ Nvidia AIAA”效果,“從邊界點分割”部分
可選:單擊“過濾器”圖標以僅列出名稱中包含“肝臟”的那些型號
選擇“ annotation_ct_liver”(訓練為在門靜脈期CT圖像中分割肝臟的模型)
單擊“放置標記點”按鈕,然后在切片視圖中的所有6個側(cè)面的肝臟邊緣附近單擊,然后單擊“開始”
在大約30秒內(nèi),自動分割結(jié)果將出現(xiàn)在切片視圖中。要以3D形式顯示結(jié)果,請點擊Segment Editor列表上方的“顯示3D”按鈕。
要在分割完成后調(diào)整先前放置的邊界點,請單擊“開始”按鈕旁邊的“編輯”圖標。
從http://medicaldecathlon.com/下載Task03_Liver \ imagesTr \ liver_102.nii.gz數(shù)據(jù)集并將其加載到3D Slicer中
轉(zhuǎn)到 Segment Editor
點擊“ Nvidia AIAA”效果
在“自動分割”部分中,選擇“ segmentation_ct_liver_and_tumor”模型,然后單擊“開始”
自動分割結(jié)果應在3-5分鐘內(nèi)顯示
可選:轉(zhuǎn)到 Segments 模塊以編輯顯示設置
label: liver / tumor
2.2 提取radiomics
主要使用pyradiomics組件,引用某大神一個完整的視頻給大家介紹下提取,可以只參考視頻的最后一部分就可以了,前面的規(guī)劃,可以參考上述內(nèi)容。
https://www.bilibili.com/video/BV15V411Z73o?from=search&seid=5989594993256922790
3. lasso回歸,確定潛在變量
第一步呢,永遠是讀入數(shù)據(jù)和核查數(shù)據(jù)。
然后,進入到我們此次教程的一個關鍵環(huán)節(jié),分割數(shù)據(jù)。我們這個數(shù)據(jù)集當中共有699例樣本,我們需要將其隨機分割為訓練集和測試集,一般的樣本比例是2:1,也就是2/3的病人用來做訓練,訓練出一個準確的模型,剩下1/3病人用來做測試,驗證我們的這個模型是否可靠。分割數(shù)據(jù)的代碼如下,整個過程都是隨機的:
# 分割數(shù)據(jù)
set.seed(123)
ind <- sample(2, nrow(data), replace = TRUE, prob = c(0.7, 0.3))
# 訓練集
train <- data[ind==1, ] #the training data set
# 測試集
test <- data[ind==2, ] #the test data set
樣本(也就是數(shù)據(jù)的行)分配好了之后呢,下一步就是把采集到的信息(也就是數(shù)據(jù)列)進行分配,在我們的這個測試數(shù)據(jù)中前面V1-V9是采集到的樣本信息,最后一列是我們的診斷,也就是腫瘤的良惡性,下面我們把樣本信息和樣本診斷分割開來:
# Convert data to generate input matrices and labels:
# x相當于臨床信息
x <- as.matrix(train[, 1:9])
# y是臨床結(jié)局
y <- train[, 10]
首先,我們嘗試做K-fold交叉驗證。在glmnet包中使用cv.glmnet()估計λ值,glmnet默認使用10倍交叉驗證。所謂K-fold交叉驗證,就是將數(shù)據(jù)分成k個相同的子集(折疊子集),每次用k-1個子集擬合模型,然后將剩余的子集作為測試集,最后將k個結(jié)果合并(一般采用平均值)來確定最終的參數(shù)。在此方法中,每個子集僅用作測試集一次。在glmnet包中使用K-折交叉驗證非常容易。結(jié)果包括每個相應的MSE值和相應的λ。在這里,我們將訓練集k值定為5,做5-fold cross validation,這也是比較常用的。
# 5-fold交叉驗證,找出最佳lambda值
fitCV <- cv.glmnet(x, y, family = 'binomial',
type.measure = 'class',
nfolds = 5)
plot(fitCV)
上面的圖叫做CV統(tǒng)計圖,CV統(tǒng)計圖與glmnet中的其他圖表有很大的不同,它表示了λ的對數(shù)與均方差以及模型中變量數(shù)量之間的關系。圖表中的兩條垂直虛線表示最小均方誤差的對數(shù)λ(左側(cè)虛線)和最小距離的標準誤差的對數(shù)λ(右側(cè)虛線)。如果存在過擬合問題,那么從最小值到標準誤差位置的距離是解決問題的一個很好的起點。可以看到,我們可以選擇的lambda值有兩個,具體lambda選值要根據(jù)自己實驗設計而定。lambda.min是最佳值,lambda.1se則是一倍SE內(nèi)的更簡潔的模型。這也涉及到臨床模型一個很重要的考量標準,到底是選擇精度高但是復雜的模型,還是放棄部分精度,選擇變量更少更有可能有應用價值的模型呢?本例中我們選擇最佳lambda值。然后我們來看一下,隨著lambda值的變化,每個觀察值對應的系數(shù)的變化趨勢。
# check the coef
fit <- glmnet(x, y, family = 'binomial', alpha = 1) # make sure alpha = 1
plot(fit, xvar='lambda',label = TRUE)
abline(v = log(lambda.min,10), lty = 3,
lwd = 2,
col = 'black')
此圖顯示,隨著λ的減少,壓縮參數(shù)減少,系數(shù)的絕對值增加。這個模型應該如何在文章中描述呢?我們來輸出系數(shù):
# get the coef
coef.min = coef(fitCV, s = 'lambda.min')
coef.min
然后就會生成每個變量所對應的系數(shù),我們也可以通過這個系數(shù)來對模型進行描述。
……
4. nomogram建立和驗證
聯(lián)系客服