Install Anaconda, Anacondaのインストール

  • Let's use Anaconda。Anacondaを使う

www.anaconda.com

    • Why? どうして? (1)
      • It provides basic libraries/packages for data science (numpy, scipy, pandas).
      • データサイエンス用の基本ライブラリ・パッケージが入っているから (numpy, scipy, pandas)
      • numpy: matrix, linear algebra 行列と線形代数
      • scipy: mathematical functions 数学の関数
      • pandas: data stocking structures and analysis functions for statistical analysis 統計解析用のデータ格納構造と解析関数
    • Why? どうして? (2)
      • It provides Jupyter-notebook, useful to make your skills better and to record your activities.
      • Jupyter-notebookという、スキルアップと記録保存に便利なツールがついているから
  • How to install Anaconda in English

docs.anaconda.com

    • Win

docs.anaconda.com

www.python.jp

    • Win

www.python.jp

numpy.ndarray と Rのapply()

  • Rの行列で、各行の和を出そうと思ったら
M <- matrix(rnorm(100),10,10)
apply(M,1,sum)
  • だろう
  • 同じことをPythonでやるのはどうするのかな、と思った
  • Pythonで行列を扱うならnumpyがよいのでそうすることにしたとして
  • 値のセットの和を出すsum()関数を、軸方向に指定して計算することもできて
M = np.array(np.random.randint(5,18000,100)).reshape(10,10)
np.sum(M,axis=1)
  • とするらしい。Rのapply(M,1,sum)と同じ構成
  • それとは別に:
  • numpyのndarrayにはuniversal functionsというのがある。名前は「大層」だが、全要素に同じ処理をして、同じサイズのndarrayを作る関数のこと(種類がたくさんある)
  • このuniversal functionを繰り返し使って、答えをたたんでいくという処理をしろ、という指示である、reduceという「高階関数」と組み合わせるらしい
M = np.array(np.random.randint(5,18000,100)).reshape(10,10)
np.add.reduce(M,axis=1)
  • ちなみに、universal functionsのリストはここにある
  • また、recude以外にも、「高階関数的ndarray処理」として、以下のようなものがあるらしい。どういううまみがあるのかまだわからない
    • ufunc.reduce(a[, axis, dtype, out, …])
      • Reduces a’s dimension by one, by applying ufunc along one axis.
    • ufunc.accumulate(array[, axis, dtype, out])
      • Accumulate the result of applying the operator to all elements.
    • ufunc.reduceat(a, indices[, axis, dtype, out])
      • Performs a (local) reduce with specified slices over a single axis.
    • ufunc.outer(A, B, **kwargs)
      • Apply the ufunc op to all pairs (a, b) with a in A and b in B.
    • ufunc.at(a, indices[, b])
      • Performs unbuffered in place operation on operand ‘a’ for elements specified by ‘indices’.
  • reduceのほかに、基本となる「高階関数」についてはこちらなどで。

RとPythonの両方で使えるplotlyでの3Dスキャタープロットを覚える

  • Rもpythonもjupyter notebookで文書作成できる
  • 3次元プロットをしなくてよいのなら、Rでは普通の二次元プロッティング関数を使えばよいし、Pythonではmatplotlibを使えばよい
  • 3次元プロットを描いてぐりぐり動かすとなると、Rではplot3dを使い、pythonでは…、plotlyが使えるか…となる
  • が、両方を別々に覚えるのが、記憶力の減退と共につらい
  • jupyter notebook上ならRもPythonもplotlyで3Dぐりぐりができるということらしいので、両者を比較しながら、使ってみることにする
  • 準備
    • R
install.packages("plotly")
    • として
library(plotly)
pip install plotly
    • が必要なのは陶然として、jupyter内で動かすには
pip install npm
jupyter labextension install @jupyterlab/plotly-extension
    • としないと、plotlyの画像出力がjupyter notebook上に現れない
import plotly.offline as offline
import plotly.graph_objs as go
offline.init_notebook_mode()
    • として、ようやく、offline.iplot()関数にpyplotで作ったグラフ表示情報オブジェクトを渡すことで、グラフが現れる
  • 散布図
    • Rの場合
p <- seq(from=0,to=1,length=100) * 10
q <- sin(p)
fig = plot_ly(x=p,y=q,type="scatter")
fig

f:id:ryamada22:20201225152049p:plain

    • Pythonの場合
    • もともとのplotlyはplotly.graph_objsという仕様で、細かく描画条件を指定するようになっているらしいが、さすがに面倒だ、ということで、簡単にした(機能を落としつつ、コマンドを簡略化した)plotly.expressというものがある。以下ではそれを使う
import numpy
import plotly.express as px
p = numpy.arange(100) * 0.1
q = numpy.sin(p)
fig = px.scatter(x=p, y=q)
fig.show()

f:id:ryamada22:20201225152845p:plain

    • ちなみにこのplotly.expressはplotly.graph_objects.Figureを返すので、fig.show() として描画することも、offline.iplot()として描画することもできるようである
  • 3D scatter plot
    • Rの場合(このブログでは動かせないがjupyter notebook上では動かせる)
xyz <- matrix(rnorm(10000*3),ncol=3)
xyz <- xyz/sqrt(apply(xyz^2,1,sum))
fig2 <- plot_ly(x=xyz[,1],y=xyz[,2],z=xyz[,3],type="scatter3d",marker=list(size=1,color=xyz[,3]))
fig2

f:id:ryamada22:20201225153628p:plain

    • Pythonの場合
      • 2D scatterplotではplotly.expressを使ったが、3D scatterplotだと、点のサイズ指定で(少なくとも自分の環境では)エラーがでるので、簡易版expressではなく、plotly.graph_objsを使うこととする
import plotly.offline as offline
import plotly.graph_objs as go
offline.init_notebook_mode()

import numpy 
import numpy.random
def my_unit_vector(X):
    return(X/numpy.linalg.norm(X,axis=1).reshape(-1,1))
    
xyz = numpy.array(numpy.random.randn(1000,3))
xyz_ = my_unit_vector(xyz)

trace = go.Scatter3d(
   x = xyz_[:,0], y = xyz_[:,1], z = xyz_[:,2],mode = 'markers', marker = dict(
      size = 1)
   )
fig = go.Figure(data = [trace])
offline.iplot(fig)
    • 以下のように、描くべきオブジェクト fig を作って、offline.plot()に渡すだけでも描ける
fig = go.Figure(go.Scatter3d(x = xyz_[:,0], y = xyz_[:,1], z = xyz_[:,2],mode = 'markers', marker = dict(size = 1)))
offline.iplot(fig)
    • 最後の描画のところは、offline.iplot(fig)の代わりに
fig.show()
    • でも3Dぐりぐりプロットが現れる(ようだ)
    • もう、細かいことはいいから、Rのplot3d()的に描ければいいや、ということなら、関数を定義して
def my_go_scatter3d(X,size=1):
    fig = go.Figure(go.Scatter3d(x =X[:,0], y = X[:,1], z = X[:,2],mode = 'markers', marker = dict(size = size)))
    offline.iplot(fig)

my_go_scatter3d(xyz_)
    • でもよいようだ
  • pythonのnumpy.apply_along_axis()関数
    • 上述の単位球面乱数座標生成では、
def my_unit_vector(X):
    return(X/numpy.linalg.norm(X,axis=1).reshape(-1,1))
    • という関数を定義して使った。これは、numpyの線形代数関連関数を納めたlinalg配下にあるnormを取る関数を列(axis=1)に関してつぶした結果を返すという処理。この処理は(おそらく)高速実装されている。
    • これに似たやり方で、自作の関数 my_fun()を定義して、同様に、numpy ndarrayに作用するには
numpy.apply_along_axis(my_fun,axis=1,m) 
    • のようにして、ndarray オブジェクトm(行列と仮定しておく)の列(axis=1)をつぶすようにmy_fun()を各行に処理させることができる
    • ただし、これは、ループ処理を簡略化して書いてあるだけなので、mの各要素にアクセスするそうで、速くなるわけではないらしい(Rのapply()関数は、場合によっては、ベクトル演算化できるところはベクトル演算化して速くしてくれたはずだが…。要するに、Rで言えばlapply()関数的なものということなのだろう)
    • それよりは、ベクトル化した(必要ならループを使った)コードを書く方が速いらしい(参考はこちら)
  • Python の plotlyは、pythonのディクショナリ形式で必要な情報を持たせて、それをplotly.graph_objects.Figure 形式に修正してFigureデータタイプで持たせ、その情報を読んで視覚化する、という仕組み:こちら
  • それが解れば、あとは、例(https://plotly.com/python/:tilte=こちら)を参考に、合わせて行けばよいようだ

ぱらぱらめくる『Nature Reviews Genetics』2020

離散値の出現順序の独立性を検定する

  • (非負)整数列(ポアソン乱数、負の二項分布乱数など)が生成されたとする。一見、出現する値はバラバラに見えるが、本当にバラバラなのかについて考えたい
  • これは疑似乱数列のランダム性の評価として、様々な方法が提唱されている(たとえばこちら)問題だが、一般に疑似乱数列の評価においては、0,1の列の検定である
  • 整数列であることを利用することにする
  • 整数列であれば、ある値とその次の値との値のペアは整数の組となるから、連続2乱数に関して2元分割表が作れる
  • この分割表の行と列とが独立であるかの検定は、「連続する2乱数間の独立性」の検定に「は」なる
  • 「。。。検定に『は』なる」の『は』とはどういうことかというと、疑似乱数列のランダム性の評価の場合には、連続2乱数の独立性だけではなくて、より大きな周期性が現れないか、など、評価すべき数列のスケールの網羅性も問題とするからである
  • ここでは、連続2乱数間の独立性のみを評価していることから、「必要性」は検定していることになるが、「十分性」は評価していない点に注意したい
  • とはいえ、「必要性」で棄却されるなら、棄却目的にが合致するので、それで目的がある意味では達成できる場合を考えることにする
  • 以下では、整数列のために作られたわけではない、出現順序のランダム性の検定であるruns.test()関数が算出する統計量と、隣接2数の独立性を分割表カイ二乗統計量とを用いることとし、その統計量の帰無分布をパーミュテーション生成してp値を推定してみている
  • 分割表の方でよさそう。。。かな?
  • Rでやってみる

STRINGのinteraction confidence score

  • STRINGと言うタンパク-タンパクネットワークデータベース・ツールがある(こちら)
  • タンパク-タンパク間に数値が出てくるのだが、その数値がどう言う由来なのかがわかりにくい
  • こちらのはてなブログの記事

kazumaxneo.hatenablog.com
に「STRINGのインタラクションスコアは、特定のインタラクションの強さまたは特異性を表すものではなく、利用可能なすべての証拠が与えられた場合に、0から1のスケールで関連が真であるというおおよその信頼を表すことを意味する。 STRINGのスコアは、両方のタンパク質パートナーに既に機能的にアノテーションが付けられている関連付けのサブセットを使用してベンチマークされる。このため、KEGGパスウェイマップ(ref.41)がゴールドスタンダードとして使用されているため、機能的関連付けの粒度も暗黙的に決定される。」と説明がありますが、わかったようなわからないような。。。

  • こちらの論文

academic.oup.com
に英語で、対応するのかもしれないと思われる記述があります。

  • "The scores in STRING are benchmarked using the subset of associations for which both protein partners are already functionally annotated; for this, the KEGG pathway maps"
  • 相変わらずよくわからないです・・・
  • ここ

www.blopig.com
に、それっぽいタイトルの記事がありますが、これも詳しくはよくわかりません。

  • わかるのは、実験データや、種間での類推などかなり雑多な情報をひっくるめてスコアリングしているらしいことくらいでしょうか。
  • マニュアルらしきところのQ&Aに
Q:	
How are scores computed?
A:
The combined score are computed by combining the probabilities from the different evidence channels, correcting for the probability of randomly observing an interaction. For a more detailed description please see von Mering, et al Nucleic Acids Res. 2005
  • と出てきて、ようやく、オリジナル出典があるので、2005年の論文www.ncbi.nlm.nih.govへ行くと
After assignment of association scores and transfer between species, we compute a final ‘combined score’ between any pair of proteins (or pair of COGs). This score is often higher than the individual sub-scores, expressing increased confidence when an association is supported by several types of evidence (Table ​(Table1).1). It is computed under the assumption of independence for the various sources, in a naïve Bayesian fashion. It is thus a simple expression of the individual scores:
  • とあり、雑多なリソースからassociationのサブスコアを出し、それをまとめることが書いてあります。
  • Subscoreをまとめるときは、雑多な情報を全て平等に扱って、
  • S = 1- \prod (1-Si)とまとめるようです。

ぱらぱらめくる『熱力学の数理』

  • 熱力学は温度を持った物理学的系が起こす現象を記載する形式である
  • 統計力学の立場から、多数の要素が取りうる状態の多寡と乱雑度とを使って説明されることもある
  • 本書は、そうではなく、巨視的熱力学現象を数学的に表すにあたり、何の存在を仮定し、それらにどのようなルールを入れると良いか、という話をしている
  • 全順序、順序、preordered set、という順序に関する概念のうち、preordered setというものが出てくる
  • このpreordered setはposetが満たす3ルールのうちの一つを欠いたものになっている
  • 簡単にいうと、同等と、大小との関係が成り立つ集合のこと
  • 熱力学の系を説明するにあたり、系は複数あり、それには温度という、preordered setでの関係を決めるパラメタが存在し、それによって、系がある状態をとっている時、それは、別の系がある状態をとっている時と比べて、関係が定まる、という話
  • それにより、熱力学では、全ての系、全ての状態を納めたpreordered set 空間があり、それが滑らか(微分可能)な多様体となっている、と説明する
  • それを考えていくと、熱力学では、仕事と温度変化との間に関係があるのでそれを説明する必要が出てくる
  • 仕事は、圧と体積とで定義される。それと交換できるものは、温度と何かとで定義されるべきである
  • この時、温度とペアとなるものとして、エントロピーと名付けるものが存在するものとすると、話がうまくいく
  • preordered setで関係を定める必要のために温度(絶対温度)が登場し、仕事と状態変化・温度変化とを結びつけるために、(物理的に存在が明らかな)体積と対等な立場だが、認識しにくい「エントロピー」という物理的存在を、認めよう、という話
  • これで、ぱらぱらめくりは終わりにしよう
  • このぱらぱらめくりによって、何を学んだのだろう?
  • 現象がある
  • 説明する仕組みを構築することは良いことだ
  • 現象に見えていたものだけでは、説明する仕組みが不足した
  • 不足したものが存在するものとしよう
  • と、こういう筋がある、と
  • 「形」は「位相」と「長さ」と「角度」、「曲線」などからなる
  • 「形集合」が何かしらの順序構造を作っており、多様体をなしているとする。形を滑らかに変形することができる、という意味で。
  • 順序構造を成り立たせるためには、「温度」が必要
  • 長さとか角度とか曲線のような、(3次元的な)物理存在は、知っている
  • 何かを知らないから、うまく話が進まないとする
  • その知らないものは「エントロピー」のようなもの。。。「形のエントロピー〜形の複雑さ+対称性」。。。多分