ADHDにはコンサータおよびインチュニブならびにストラテラ等の有効な治療薬が存在しますが、これらの処方には医師による診断が必要です。現在ADHDの診断はDSM-5という基準に従って実施されていますが、その解釈は医師よって異なり、誤診による不適切な治療が後を絶ちません。治療薬の正しい処方のため、医師の主観によらない客観的な診断方法の確立が急務となっています。
ADHDは遺伝的に決まる側面がある一方、発症には環境要因も強く関わっています。そこで、健常人とADHD患者の全血トランスクリプトームのデータを比較し、環境要因も加味したバイオマーカーを調べる研究が報告されています。
本研究では上記の研究にて公開されているデータに基づき、血液トランスクリプトームからADHDか判定する機械学習モデルを作成します。特に本記事では、レプリケートを考慮した次元削減について説明します。
1. レプリケートの平均をとる
ライブラリをimportし、データをロードしてからレプリケートの平均をとります。
import time import pickle import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from scipy.stats import pearsonr from sklearn.decomposition import PCA from sklearn.manifold import TSNE import umap from scipy.sparse.csgraph import connected_components import warnings warnings.filterwarnings('ignore') df_std = pd.read_csv("src/df_std.csv", index_col=0) names = list(set([s.split("_rep")[0] for s in df_sample["Sample Name"].tolist()])) data = [] for n in names: idxes = [] for i, s in enumerate(df_sample["Sample Name"].tolist()): if n in s: idxes.append(i) # print(df_sample.iloc[idxes, 0]) v = df_std.iloc[idxes, :].apply(lambda x: np.mean(x)).tolist() y = 0 if "CTRL" in n else 1 v.append(y) data.append(v) df_rep = pd.DataFrame(data, index=names, columns=df_std.columns.tolist()+["y"]) df_rep.to_csv("src/df_rep.csv") df_rep.shape
(76, 16043)
GLYCTK-AS1 | RN7SL762P | KDM8 | … | TNFSF10 | y | |
P14.2016-03-31T12_40_25.0220160771004.fc1.ch8 | 1.468904 | 6.854884 | 1.958538 | 0.979269 | 19.789397 | 1 |
P14.2016-03-31T12_40_25.0220160771004.fc1.ch10 | 0.837903 | 7.541126 | 5.027417 | 4.189514 | 25.137086 | 1 |
P14.2016-03-31T12_40_25.0220160771004.fc1.ch12 | 0 | 5.632148 | 5.632148 | 8.448221 | 20.103638 | 1 |
P14.2016-03-31T12_40_25.0220160771004.fc1.ch15 | 2.700708 | 13.503541 | 0.900236 | 2.700708 | 22.505902 | 1 |
P14.2016-03-31T12_40_25.0220160771004.fc1.ch19 | 2.559553 | 20.476422 | 0 | 0 | 25.168936 | 1 |
… | … | … | … | … | … | … |
P13.2016-11-22T13_16_36.0234063021020.fc2.ch11 | 0 | 9.755917 | 1.393702 | 0 | 38.036464 | 0 |
P13.2016-11-22T13_16_36.0234063021020.fc2.ch15 | 0 | 0 | 0 | 0 | 42.685478 | 0 |
P13.2016-11-22T13_16_36.0234063021020.fc2.ch24 | 0 | 38.228511 | 2.012027 | 6.036081 | 17.940573 | 1 |
P13.2016-12-08T21_33_13.0249463261006.fc2.ch17 | 0 | 71.393385 | 0 | 0 | 11.898897 | 0 |
P13.2016-12-08T21_33_13.0249463261006.fc2.ch18 | 0 | 63.391107 | 0 | 0 | 8.80432 | 0 |
2. 標準化
x = df_rep.iloc[:, :-1] x_scaled = (x - x.mean()) / x.std()
3. PCA
まずは次元削減を実施し、現在のデータのまま十分にADHDであるか判定できそうか大雑把に調べます。
PCA、tSNE、UMAPの順に試していきます。
pca = PCA() pca.fit(x_scaled) score = pd.DataFrame(pca.transform(x_scaled), index=x_scaled.index) plt.scatter(score.iloc[:, 0], score.iloc[:, 1], c=df_xy.iloc[:, -1], cmap=plt.get_cmap('jet')) clb = plt.colorbar() clb.set_label('ADHD Status', labelpad=-20, y=1.1, rotation=0) plt.xlabel('PC1') plt.ylabel('PC2') plt.show()

# 寄与率 contribution_ratios = pd.DataFrame(pca.explained_variance_ratio_) cumulative_contribution_ratios = contribution_ratios.cumsum() cont_cumcont_ratios = pd.concat([contribution_ratios, cumulative_contribution_ratios], axis=1).T cont_cumcont_ratios.index = ['contribution_ratio', 'cumulative_contribution_ratio'] # 行の名前を変更 # 寄与率を棒グラフで、累積寄与率を線で入れたプロット図を重ねて描画 x_axis = range(1, contribution_ratios.shape[0] + 1) # 1 から成分数までの整数が x 軸の値 plt.rcParams['font.size'] = 18 plt.bar(x_axis, contribution_ratios.iloc[:, 0], align='center') # 寄与率の棒グラフ plt.plot(x_axis, cumulative_contribution_ratios.iloc[:, 0], 'r.-') # 累積寄与率の線を入れたプロット図 plt.xlabel('Number of principal components') # 横軸の名前 plt.ylabel('Contribution ratio(blue),\nCumulative contribution ratio(red)') # 縦軸の名前。\n で改行しています plt.show()

4. tSNE
tsne = TSNE(n_components=2, random_state=42) corrdinates = pd.DataFrame(tsne.fit_transform(x_scaled)) plt.scatter(corrdinates.iloc[:, 0], corrdinates.iloc[:, 1], c=df_xy.iloc[:, -1], cmap=plt.get_cmap('jet')) clb = plt.colorbar() clb.set_label('ADHD Status', labelpad=-20, y=1.1, rotation=0) plt.xlabel('tSNE 1') plt.ylabel('tSNE 2') plt.show()

5. UMAP
embedding = pd.DataFrame(umap.UMAP().fit_transform(x_scaled)) plt.scatter(embedding.iloc[:, 0], embedding.iloc[:, 1], c=df_xy.iloc[:, -1], cmap=plt.get_cmap('jet')) clb = plt.colorbar() clb.set_label('ADHD Status', labelpad=-20, y=1.1, rotation=0) plt.xlabel('UMAP 1') plt.ylabel('UMAP 2') plt.show()

6. まとめ
レプリケートを考慮してもADHD患者と健常人はうまく分かれませんでした。
このまま機械学習のモデルを作成しても、通常はうまい判別モデルはできません。
モデル作成の前に一工夫する必要がありそうです。
コメント