Radi_tech’s blog

Radiological technologist in Japan / MRI / AI / Deep learning / MATLAB / R / Python

【Python】PythonでICC(intraclass correlation coefficients)を一括で計算する。


最近の医療論文ではmustなデータとなっているICC

  • ICC(1,k); 検者内信頼性 = ex) 検者AのROIの計測精度。
  • ICC(2,k);検者間信頼性 = ex) 検者A-B間のROIの計測精度。

おもに使うのはこの二つ。検者が3名ならICC(3,k)となる
大量計測データをPythonのfor文で一括処理する。

データはこんな感じ。今回はICC(2,k)を計算していく。



CSVファイルの説明

ID; 患者個々のuniqueな値
rater; 検者
data_1〜24; 実測データ

CSV ICC python
CSV


検者間のデータを縦に並べる。下にいくと検者Bとなる。

CSV python
CSV

keyとなるmoduleは、”pingouin” という統計ツール.
pipでinstallしておく。(なお、当方はpip派。condaと混ぜるのはNG)

〜
pip install pingouin
〜


以下、実行のコード

import os
import numpy as np
import pandas as pd
import pingouin as pg


ws = "ワークスペースとなるフォルダパスを指定"

os.chdir(ws)
print(os.getcwd())


path = "for_ICC.csv"    #csvのpath
df = pd.read_csv(path)           

colum_nm =list(df.columns.values)  #colum nameを得ておく
nm_length = len(colum_nm)     #colum nameの長さ得ておく


#appendの空箱の準備

value   = []
icc_1_2 = []
p_value = []
IC_value= [] 


for x in range(2,nm_length ): 
#for 文をcolumの3番目から回す。(1番目はID,2番目はraterが入っている。)
    
    
    #列を一つずつ抽出してdataframe化して、"pg.intraclass_corr"の引数へ渡す
    tmp_colum_nm = colum_nm[x]
    
    ratings =df[tmp_colum_nm]
    raters  =df["raters"]
    targets =df["ID"]
    
    data = pd.DataFrame({'targets':targets, 'raters':raters, 'ratings':ratings})
    
    #ここで計算
    icc = pg.intraclass_corr(data=data, targets='targets', raters='raters', ratings='ratings')
    

    # 各値を抽出する
    icc_1_2_val= icc.iloc[2,2]
    p_val= icc.iloc[2,6] 
    IC= icc.iloc[2,7] 
    
    # appendで格納していく
    value.append(tmp_colum_nm)
    icc_1_2.append(icc_1_2_val)
    p_value.append(p_val)
    IC_value.append(IC)

# dataframe化
value    = pd.Series(value)
icc_1_2  = pd.Series(icc_1_2)
p_value  = pd.Series(p_value)
IC_value = pd.Series(IC_value)


#dataframeを縦に結合
tmp_df = pd.concat([value,icc_1_2,p_value,IC_value],axis=1)
#dataframeをcolumnの名前を編集
tmp_df = tmp_df.rename(columns={0:'value',1:'ICC(1,2)',2:'p_value',3:'IC'})
#csvを出力
tmp_df.to_csv('ICC1_2.csv', header=True, index=True)
    
    
〜


この方法でどんだけ多いデータでも簡単にICCを計算できる。


出力したcsvを整形してこんな感じ

ICC python
ICC result

検者2人のデータが別のcsvであった場合、dataframeの結合して変数名を編集してからでも機能するとおもいますが、ざっくりコピペでいけるのでcsvのは先に手作業が楽かもです。