Forest background
バイオインフォの森へようこそ
【ADHD血液診断】次元削減

【ADHD血液診断】次元削減

目次

0. はじめに

本記事は、以下の記事の続きになります。

https://www.bioinforest.com/adhd1-1

1. サンプル情報の追加

ライブラリをimportし、サンプル情報のファイルを読み込みます。

Text
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_sample = pd.read_csv("src/GSE159104_samples.txt", sep="\t")
df_sample
Sample NamePair groupingTwin StatusADHD_StatusChannelHigh Quality Reads
0RNABL30041_ADHD_rep131clean discordantADHDP14.2016-08-30T13_45_39.0220160891013.fc2.ch15495203
1RNABL30041_ADHD_rep231clean discordantADHDP13.2016-10-21T13_04_11.0234062861006.fc2.ch212164087
2RNABL30042_CTRL_rep131clean discordantCTRLP14.2016-08-30T13_45_39.0220160891013.fc2.ch161024974
3RNABL30042_CTRL_rep231clean discordantCTRLP13.2016-10-21T13_04_11.0234062861006.fc2.ch222295331
4RNABL30051_CTRL_rep121clean discordantCTRLP13.2016-11-22T13_16_36.0234063021020.fc2.ch1569296
.....................
149RNABL2044_CTRL_rep3NaNNaNCTRLP13.2016-04-22T14_16_47.0220160891008.fc2.ch18355566
150RNABL2050_CTRL_rep3NaNNaNCTRLP13.2016-04-22T14_16_47.0220160891008.fc2.ch24217718
151RNABL2000_CTRLNaNNaNCTRLP13.2016-05-31T15_11_07.1231461441002.fc1.ch1189097
152RNABL2057_CTRL_rep3NaNNaNCTRLP14.2016-06-07T15_56_34.0231461441003.fc1.ch17189204
153RNABL2058_CTRL_rep2NaNNaNCTRLP14.2016-06-07T15_56_34.0231461441003.fc1.ch19227166

サンプル情報をyとして列に加えます。

Text
table = {}

for i in range(df_sample.shape[0]):
    if df_sample["ADHD_Status"][i] == "CTRL":
        table[df_sample["Channel"][i]] = 0
    else:
        table[df_sample["Channel"][i]] = 1

v = [table[s] for s in df_std.index.tolist()]
df_xy = df_std
df_xy["y"] = v

df_xy
GLYCTK-AS1RN7SL762PKDM8...TNFSF10y
P14.2016-03-31T12_40_25.0220160771004.fc1.ch81.4689046.8548841.9585380.97926919.7893971
P14.2016-03-31T12_40_25.0220160771004.fc1.ch100.8379037.5411265.0274174.18951425.1370861
P14.2016-03-31T12_40_25.0220160771004.fc1.ch1205.6321485.6321488.44822120.1036381
P14.2016-03-31T12_40_25.0220160771004.fc1.ch152.70070813.5035410.9002362.70070822.5059021
P14.2016-03-31T12_40_25.0220160771004.fc1.ch192.55955320.4764220025.1689361
.....................
P13.2016-11-22T13_16_36.0234063021020.fc2.ch1109.7559171.393702038.0364640
P13.2016-11-22T13_16_36.0234063021020.fc2.ch15000042.6854780
P13.2016-11-22T13_16_36.0234063021020.fc2.ch24038.2285112.0120276.03608117.9405731
P13.2016-12-08T21_33_13.0249463261006.fc2.ch17071.3933850011.8988970
P13.2016-12-08T21_33_13.0249463261006.fc2.ch18063.391107008.804320

2. 標準化

Text
x = df_xy.iloc[:, :-1]
x_scaled = (x - x.mean()) / x.std()

3. PCA

まずは次元削減を実施し、現在のデータのまま十分にADHDであるか判定できそうか大雑把に調べます。

PCA、tSNE、UMAPの順に試していきます。

Text
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()

Text
# 寄与率
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

Text
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

Text
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患者と健常人はうまく分かれませんでした。

このまま機械学習のモデルを作成しても、通常はうまい判別モデルはできません。

モデル作成の前に一工夫する必要がありそうです。