にしもと.blog

色々してます。

論文(Abst)メモ:Recirculating Intestinal IgA-Producing Cells Regulate Neuroinflammation via IL-10

論文 

www.ncbi.nlm.nih.gov

IL-10が腸内での炎症を抑制するのは知られてたけど、それが神経系でも働いていることが示された論文。

前パッとAbst読んだときに全然理解できなかったので、15分くらいかけてAbstを読んだ。若干違う分野なので、超勉強になる。

ざっくりまとめ

①腸由来の形質細胞(PC)が中枢神経系へ移動

②腸由来の形質細胞(PC)がIL-10産生し、中枢神経系の炎症を抑制

①は知られてたけど、②が明らかにされたこと。

ハイライトのまとめ

・腸内由来のIgA+ 形質細胞(PC)は定常状態で腸以外のところにも働きかけている
・腸内由来のIgA+ 形質細胞(PC)は自己免疫性脳脊髄炎(EAE)マウスにて中枢神経系(CNS)に働きかけ、炎症を抑制している
・IgA+形質細胞(PC)がEAEマウスにて炎症抑制しているのはIL-10依存
・IgA促進する原生生物とBAFFの過剰発現(たぶんどちらもIgA増やすってこと)はEAEに対して抵抗性を示す

Abstのまとめ

【前置き】
・形質細胞(PC)は多発性硬化症(MS)患者の中枢神経系(CNS)に多く見られる
(形質細胞は血液細胞の一種で、Bリンパ球が変化した最終の細胞)
・PCがどこから来ているか、また、PCがどのような役割をしているのかは不明であった。

 

【結果】
・実験的自己免疫性脳脊髄炎(EAE)マウスのCNS中のPC細胞が腸由来でIgAを産生していた
・IgAを産生するPC細胞がEAEマウスの腸内で減少している
・IgAに結合する腸内細菌がMS患者(疾患再発期)で見られる
・腸内由来のIgAにより正常化されたマウスのPB+とPC細胞を除去したところ、EAEが悪化した
・IgAを産生するPB and/or PC細胞が過剰に発現していると、特異的にresistant to the effector stage of EAE(要するにEAEになりづらいってことだと思われ)
・IL-10の発現が上記のresistantに必須だった。

 

【結論】
IgAを産生する PB and/or PCがMSに対して(IL-10を通じて)いい効果してまっせ

つぶやき

若干違う分野なので、どこまでわかっていて、どこまでわかっていないのかイマイチわからん…

Abstの1文が1実験で、実験の多さにふるえています。

 

Sublime Text3で言語ごとにsublime-settingsする

結論

Macpython用のセッティングをしたい場合、以下の場所に置く

~/Library/Application\ Support/Sublime\ Text\ 3/Packages/Python/python.sublime-settings

メモ

全言語共通の設定は以下に置いてあるが、そことは置くべきディレクトリが違う!!

~/Library/Application\ Support/Sublime\ Text\ 3/Packages/User/Preferences.sublime-settings

参考

qiita.com

pandasで新しい行を追加(合計値の行を追加)

ソースコード

import pandas as pd

df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [2, 4, 6],
    "C": [3, 6, 9]
}, index=["R1", "R2", "R3"])

series_mean = df.sum()
series_mean.name = "mean"

df.append(series_mean)

メモ

df.append(pd.Series())で行を足すことができる。 自分で定義したい場合は、for文で定義できるとよい。

series = pd.Series()
for col in df.columns:
    series[col] = "A"

Jekyllでbreadcrumbs(パンくずリスト)

概要

jekyllでのパンくずリストの設置方法をメモします。

基本的には以下を使用。

github.com

手順

・jekellのhome下にhttps://github.com/git-no/jekyll-breadcrumbs/tree/master/lib/_includesを置く

・載せたくないtopページなどはnoToc: true

・default.htmlに以下を記載

{% include nav-breadcrumbs.html %}
{{ content | toc_generate }}

・あとはURLに従ってパンくずリストを生成します。

以上。

PythonでKruskal-wallis検定とDunn検定

ソースコード

R

library("PMCMR")
require(stats)
data(InsectSprays)
attach(InsectSprays)
kruskal.test(count, spray)
posthoc.kruskal.dunn.test(count, spray, "none")

Python

a = [10, 7, 20, 14, 14, 12, 10, 23, 17, 20, 14, 13]
b = [11, 17, 21, 11, 16, 14, 17, 17, 19, 21, 7, 13]
c = [0, 1, 7, 2, 3, 1, 2, 1, 3, 0, 1, 4]
d = [3, 5, 12, 6, 4, 3, 5, 5, 5, 5, 2, 4]
e = [3, 5, 3, 5, 3, 6, 1, 1, 3, 2, 6, 4]
f = [11, 9, 15, 22, 15, 16, 13, 10, 26, 26, 24, 13]
l = [a, b, c, d, e, f]

def kw_dunn(l, r, names=None):
    fac_flatten = []
    val_flatten = []
    for i, sub_list in enumerate(l):
        val_flatten.extend(sub_list)
        fac_flatten.extend([i for _ in range(len(sub_list))])

    r.assign("vals", val_flatten)
    r.assign("facs", fac_flatten)
    r("vals <- unlist(vals)")
    r("facs <- unlist(facs)")
    r("pre <- kruskal.test(vals, facs)$p.value")
    r("post <- posthoc.kruskal.dunn.test(vals, facs, 'none')$p.value")
    r("post_rowname <- rownames(post)")
    r("post_colname <- colnames(post)")

    pre = r.get("pre")
    post = r.get("post")
    post_rowname = r.get("post_rowname")
    post_colname = r.get("post_colname")
    if names is not None:
        post_rowname = [names[int(val)] for val in post_rowname]
        post_colname = [names[int(val)] for val in post_colname]

    df_post = pd.DataFrame(post, columns=post_colname, index=post_rowname)
    return pre, df_post

def main():
    pre, df_post1 = kw_dunn(l, r, None)
    pre, df_post2 = kw_dunn(l, r, ["a", "b", "c", "d", "e", "f"])
    print(df_post2)

if __name__ == "__main__":
    main()

解説

2次元配列を投げてKruskal-wallis検定 && Dunn検定をやってくれるプログラムがほしかった。

引数3つ目は、dataframeに変数をassignするために付与した。

df_post1とdf_post2を出力すれば違いがわかると思います。

HomeCreditのopen-solutionを読んだので便利そうなところまとめ

前置き

Kaggleのコンペの1つであるHomeCreditに参加しているときに、neptune-ml社の人たちがgithub上で公開しているopen solutionというものを見つけたので読んでみました。
以下、参考になったところをまとめています。

参考①:Kagggleの公式ページ
参考②:OpenSolutionのページ

データの前処理は各クラスのtransform関数に任せる

例えば、Bureauのデータのcleaningには、こんな感じで対応している。

class BureauCleaning(BaseTransformer):
    def __init__(self, fill_missing=False, fill_value=0, **kwargs):
        self.fill_missing = fill_missing
        self.fill_value = fill_value

    def transform(self, bureau):
        bureau['DAYS_CREDIT_ENDDATE'][bureau['DAYS_CREDIT_ENDDATE'] < -40000] = np.nan
        bureau['DAYS_CREDIT_UPDATE'][bureau['DAYS_CREDIT_UPDATE'] < -40000] = np.nan
        bureau['DAYS_ENDDATE_FACT'][bureau['DAYS_ENDDATE_FACT'] < -40000] = np.nan

        if self.fill_missing:
            bureau.fillna(self.fill_value, inplace=True)

        bureau['AMT_CREDIT_SUM'].fillna(self.fill_value, inplace=True)
        bureau['AMT_CREDIT_SUM_DEBT'].fillna(self.fill_value, inplace=True)
        bureau['AMT_CREDIT_SUM_OVERDUE'].fillna(self.fill_value, inplace=True)
        bureau['CNT_CREDIT_PROLONG'].fillna(self.fill_value, inplace=True)

        return {'bureau': bureau}

https://github.com/neptune-ml/open-solution-home-credit/blob/master/src/data_cleaning.py

scikit-learnと同様のtranformでデータの整形を行うことで、各前処理のIFを共通化しています

便利な関数はutils.pyにまとめる

会社とかで使うコードは違うまとめ方をしていたが、utils.pyにまとめる方が便利そう

ディレクトリ構造が参考になる

https://github.com/neptune-ml/open-solution-home-credit/tree/master/

main.py
src
 |- data_cleaning.py         # 前処理1
 |- feature_extraction.py    # 前処理2
 |- hyperparameter_tuning.py # ハイパラチューニング
 |- models.py                # 機械学習モデルを若干カスタマイズして返す
 |- pipeline_blocks.py       # pipelineのより詳細なブロック。
 |- pipeline_config.py       # pipelineのconfig(設定)を扱う
 |- pipelines_manager.py     # pipeline全体の管理(main.pyから呼ばれるのはここ)
 |- pipeline.py              # 機械学習モデルを返す?
 |- utils.py                 # 便利な関数などはここへ

実業務だともう少し荒い精度でまとめてもよいが、
データ処理の流れと、実データ処理は別々に分けるべきだと思いました。