Mishima.syk #5やります

最近モンストばかりですが、Mishima.sykの次回の開催は3/7となりますので、参加をお待ちしています。

内容はまだ確定していませんがchemoinformaticsとbioinformaticsまわりになるのではないかと。

僕も何か話せればいいなと思っていますが、モンストしかしてないからなぁ…w

息子と阿修羅をやっつけにいくという冒険談くらいしかw

尚、先ほど二体目のハンターキングに神化させたので、ヤマタケソロで行けるかな?

ぬらりひょんも手に入れたのでイザナミはソロで行けそう。

1423125381

実験医学増刊 Vol.32 No.20 今日から使える! データベース・ウェブツール 達人になるための実践ガイド100

実験医学の増刊号です、meso本を見て知った。只今絶賛予約受付中です☆

ナニゲに実験医学に記事を載せるのは二度目だったりする。

前回の記事はバイオインフォマティクス的な話題で、ゲノムの配列から、以下に創薬ターゲット(キナーゼとかプロテアーゼとか)の遺伝子を探すかという話だったと思う。そういえばこの前もそういうイメージを保たれていたので、筋金入りの社内ニートというイメージを定着させたい。

Mishima.syk #4やりました

参加されたみなさんお疲れ様でした。

僕はNGSの解析の話が聞けたし、ネットワークまわりの色々なヒントが聞けて非常に勉強になりました

反省点

  • 懇親会は予約する (脱香香飯店w)
  • 告知は余裕を持ってする
  • 反省会はちゃんと反省をする

反省会は忘年会を兼ねてやればいいですかね(やごみで)…w

私のスライド

自分のスライドというかハンズオンのセッションは、Cytoscape以外に色々いれないといけない感じになってしまったので、予めサンプルを用意しておけばよかったかなぁと思った。

これからigraphを使ったネットワーク分析をしてみようと思う人が増えてもらえると嬉しいなと。

ProductName ネットワーク分析 (Rで学ぶデータサイエンス 8)
鈴木 努
共立出版 / 3564円 ( 2009-09-25 )


懇親会は(安定の?)香香飯店

1414309037

二次会はワインバーみたいなとこ(名前忘れた)

1414309038

1414309040

週末の僕のハンズオンはCytoscape, iGraph, RDKitあたり

RDKItはインストールが面倒くさいのと、実務だとPipelinePIlotとかOpenEye使うだろうからさらっと流すかも。その分iGraphのいじり方を多めに説明するかもしれない。

まだスライドに手をつけてないからわからないけどw

iGraphを使えばノードとエッジに属性を簡単に付加できてgml形式で出力できる。このファイルはすぐにCytoscapeで開くことが出来て便利です。sifとかタブ区切りテキストは色々と面倒ですね。

DT

from rdkit import Chem
from rdkit.Chem import AllChem, DataStructs, MolToSmiles
import numpy as np
from igraph import Graph
import numpy as np
import logging
logging.basicConfig(level=logging.DEBUG)

threshold = 0.5

suppl = Chem.SDMolSupplier('syk.sdf')

fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 2) for mol in suppl]
smiles = [MolToSmiles(mol) for mol in suppl]

mat = []
for i in range(len(fps)):
    mat.append([DataStructs.FingerprintSimilarity(fps[i],fps[j]) for j in range(len(fps))])

sm = np.array(mat)

def search_root(sm, remain):
    cand = None
    max_c = 0
    for l in remain:
        num_c = len(np.where(sm[l] > threshold)[0].tolist())
        if num_c > max_c:
            max_c = num_c
            cand = l
    return cand

def check_edge(sm, current, root):
    cand = None
    max_c = 0
    candidates = set(np.where(sm[root] > threshold)[0].tolist())
    for c in candidates:
        if c in current:
            if sm[root, c] > max_c:
                max_c = sm[root, c]
                cand = c
    return cand

edges = []
sim_edges = []
np.fill_diagonal(sm, 0)
remain = set(range(len(sm[0])))
current = set()
new = set()
ith = 1

while remain:
    logging.debug("### {} th ###".format(ith))
    ith += 1
    root = search_root(sm, remain)
    if root is None:
        break
    logging.debug("root: {}".format(root))

    cand = check_edge(sm, current, root)
    if cand:
        logging.debug("connect {} and {}".format(cand, root))
        edges.append((cand, root))
        current.remove(cand)
        sm[:, cand] = 0

    remain.remove(root)
    sm[:, root] = 0

    for i in np.where(sm[root] > threshold)[0].tolist():
        if i in remain:
            edges.append((root, i))
            sim_edges.append(sm[root, i])
            new.add(i)

    logging.debug("new nodes: {}".format(new))
    current |= new
    remain -= current
    new = set()

g = Graph(edges)
g.vs["smiles"] = smiles
g.es["similarity"] = sim_edges
g.save("test.gml")

今週末のMishima.sykは化合物ネットワークが多めになりそう

今回はなかなか企業にいると触れることのないと噂のNGSデータの分析のハンズオン(@bonohu)が目玉ですが、他には化合物のネットワーク関連の話が多そうなので興味があれば参加してください。懇親会も、ディープ目のところを攻めていくので出ると楽しいハズw

尚、私の発表は、Cytoscape.jsで化合物ネットワーク解析の触りをやろうというハンズオンにする予定です。ハンズオンが終わったらこんなのを描けるようになるのが目標です。

とかいいつつ、エッジの張り方を色々と試行錯誤しはじめていた。下はある構造最適化の論文の化合物群に対して最近傍同士をつないでいったネットワーク。

なんか細切れになっていて気持よくない。やっぱルートから一本につながってないとあかんよなとw

NNT

どういうネットワークを作るかというのが非常に重要だと思っているので、距離に使う記述子の話とか、どういう風にノード同士をつなげるかとかそういう話もしてみたいかな。

pychembldbをChEMBL19に対応させた

Schema一緒なので旧バージョンでも普通に動くんだけど、テスト周りとドキュメントを変更しました。

使い方はコレを参照して下さい。

また、製薬業界的にというか実践的なchemoinformaticsという意味でインパクトの大きいのが 特許構造のsdfがオープンデータになったではないでしょうかね。

誰でも手軽に(スクリーニングデータではなく)構造最適化プロセスを経た化合物のリストを解析できるようになるっていうのは結構アツいものがありますね。ネットワーク解析とか楽しいだろうし。

次回のMishima.syk(10/25です)ではそのあたりの話かハンズオンをやりたいなーと思っているので、興味のある方は参加して下さい☆

Cytoscapeでchemoinformatics

Chemviz2を使い始めたのでメモ

インストール

  • Cytoscapeのサイトから3.xの最新バージョンをダウンロードしてインストール
  • Apps -> App ManagerからChemviz2を探してインストール

使ってみる

pychembldbを使ってノード用の属性ファイルとnetworkファイルを作った。ネットワークはとりあえずランダムにつないでみた。

Cytoscapeを起動して"network.sif"をインポート。続いてテーブルファイルとして"node.csv"をimport プライマリキーはsmilesにする。

構造描画の設定はApps -> Chemoinformatics Tools -> SettingsでSmiles Attributesをnode.shared.nameを選んでおく。 構造描画するときには右クリックしてオプションダイアログのApps -> Cheminformatics Toolsでpaint allかselectを選ぶ。

サイズをpIC50にして、オーガニックレイアウトで表示してみた。なかなかいい感じ

chemviz2

よく分からなかったところ

  • nameとshared nameの違いがよく分からなくてドキュメントあたってみたけど結局良くわからなかった
  • Chemviz2でsmilesをshared nameにしなきゃいけなくてsifファイルをsmilesで作ったのがダサかった
  • (sifのidはchembl_idとかにしたかったけど)

コード

from pychembldb import *
from copy import copy
from random import shuffle, random
from math import log10
#Inhibition of recombinant Syk
#Bioorg. Med. Chem. Lett. (2009) 19:1944-1949
assay = chembldb.query(Assay).filter_by(chembl_id="CHEMBL1022010").one()

with open("node.csv","w") as f:
    f.write('"ID","pIC50","ALOGP","MWT","SMILES"\n')

    for act in assay.activities:
        if act.standard_relation == "=":
            f.write('"{}",{},{},{},{}\n'.format(act.compound.molecule.chembl_id,
                                            9 - log10(act.standard_value),
                                            act.compound.molecule.property.alogp, 
                                            act.compound.molecule.property.mw_freebase,
                                            act.compound.molecule.structure.canonical_smiles))

with open("network.sif", "w") as f:
    smiles_list = [ act.compound.molecule.structure.canonical_smiles for act in assay.activities if act.standard_relation == "="]
    for i in range(len(smiles_list)):
        tl = copy(smiles_list)
        tl[i:i+1] = []
        shuffle(tl)
        f.write('{} randomnetwork {}\n'.format(smiles_list[i], " ".join(tl[:int(random() * 5)])))

やごみでmishima.sykの反省会をした

反省会と次回のテーマとか諸々決めるつもりが、日程しか決まらなかったw

次回は10/25(sat)です。予定を空けておいてください。

僕はGAMESS+pygamessの説明かCytoscapeでchemoinformaticsなハンズオンをやろうかなと思っています。

イワシとエンガワ

1407320222 1407320223

イワシとイカの天ぷら。イワシの天ぷら美味かった

1407320225 1407320227

磯辺揚げとマグロ

1407320228 1407320230

色々話せて楽しい飲み会だった。皆様お疲れ様でした☆

某WSお疲れ様でした

とても勉強になって参加して良かったなと。また今後のキャリアを色々と考えないとなーという話を沢山聞いた。ホント、そろそろどうするかちゃんとしないとなぁと思った。

それから、初めてChemRubyの作者の方とお話出来て良かったです(よく考えるとあたりまえだけどbonohuさんの知り合いだったw)

前回の勉強会のアンケートも揃ったし、次回を三島バルにぶつけるなら、お盆前に反省会と次回のテーマ決めを兼ねてやごみか鈴木屋に集まらないといけませんね☆

p.s.

bgは統合TVのスライドをslideshareにアップロードしておいて下さい

あらかじめクラスタ数を決めないでクラスタリングする方法(Affinity Propagation)

K-meansのように予めクラスタ数を指定すると、「そのクラスタ数は正しいの?」っていう疑問が浮かぶと思う。

「なんらかの統計値に基づいて適切なクラスタに分割して欲しい」そんな願いを叶えるのがAffinity Propagationというクラスタリングアルゴリズムである

exemplara(セントロイドとかクラスタ中心)になるべきパラメータ(responsibility)とクラスタメンバに属しやすさ(availability)を交互に更新していって収束させる手法なので、K-meansのような初期値依存性がないらしい。

クラスタ数は類似度行列の対角要素(自分との類似度)に依存する(デフォルトはmedian)のでここを変更するとクラスタ数も変わるんだけどね。

Scikit-learnではAffinity Propagationが実装されているのでsykのケミストリースペースを作ってクラスタリングしてみた。ちなみにスライドのPCAの説明は間違っていた(pca.fit(fps).transform(fps)としなければいけなかった)。

from rdkit import Chem
from rdkit.Chem import AllChem, DataStructs
from sklearn.decomposition import PCA
from sklearn.cluster import AffinityPropagation
from ggplot import *
import numpy as np
import pandas as pd

suppl = Chem.SDMolSupplier('syk.sdf')

fps = []
for mol in suppl:
    fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
    arr = np.zeros((1,))
    DataStructs.ConvertToNumpyArray(fp, arr)
    fps.append(arr)

print len(fps)
pca = PCA(n_components=2)
x = pca.fit(fps).transform(fps)
af = AffinityPropagation().fit(x)

d = pd.DataFrame(x)
d.columns = ["PCA1", "PCA2"]
d["labels"] = pd.Series(af.labels_)
g = ggplot(aes(x="PCA1", y="PCA2", color="labels"), data=d) + geom_point() + xlab("PCA1") + ylab("PCA2")
ggsave("ap.png", g)

1404818907