CellFishing.jlを試してみる

Published: Wed 12 December 2018
By oec

In Julia.

CellFishing.jlを試してみる

高速に大量の細胞の類似度を解析するツールのCellFishing.jlを試してみました。

CellFishing.jlはJuliaで動くツールなのですが、Juliaを使うのも初めてのため、実行環境からたどたどしく設定していきます。

MacにJuliaの環境を作る

macOS Sierraだとbrew installでjuliaをインストールできる

brew cask install Caskroom/cask/julia

$ juliaで対話環境がスタートします。

対話環境は

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.0.2 (2018-11-08)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> 

こんな感じです。

CellFishingはJulia 0.7.0以降をサポートしているようです。 brewでインストールされるJuliaのバージョンは1.0.2(これを書いている時点で)なので、JuliaのバージョンはOKと思われます。

CellFishingをインストールする

公式のREADMEを見ながらCellFishing.jlをインストールしてみます。

Juliaをインストールする前に対話環境で"HDF5"と"DocOpt"を対話環境でインストールします。

※ juliaでHDF5をインストールする前にbrew install hdf5する必要があるかもしれません。

$ julia
julia > using Pkg
julia > Pkg.build("HDF5")
julia > Pkg.build("DocOpt")

次にCellFishing.jlのインストール。 これも対話環境でインストールできます。

julia > ]
(v1.0) pkg> add git@github.com:bicycle1885/CellFishing.jl.git

エラーメッセージがでなければインストール成功とのこと。

$ julia -e 'using Pkg; Pkg.test("CellFishing")'

で、ユニットテストできます。

コマンドラインインターフェースでCellFishing.jlを試す

実際に解析を試すにはデータが必要ですが、こちらのブログを参考に loomフォーマットのデータを取得します。

$ curl -O http://bimsbstatic.mdc-berlin.de/rajewsky/PSCA/all_sgete_4GU75.loom.gz 
$ gzip -dc all_sgete_4GU75.loom.gz > Plass2018.dge.loom

公式のREADMEにあるように、bin/cellfishingスクリプトをこのファイルを使ってコマンドラインインターフェースで呼び出します。

$ ./bin/cellfishing build Plass2018.dge.loom

Build a search database from Plass2018.dge.loom.
  Loading data ―――――――――――― 17 seconds, 22 milliseconds
  Selecting features ―――――― 1 second, 46 milliseconds
  Creating a database ―――――  ** On entry to SLASCLS parameter number  4 had an illegal value
 ** On entry to SLASCLS parameter number  4 had an illegal value
 ** On entry to SLASCLS parameter number  5 had an illegal value
6 seconds, 637 milliseconds
  Writing the database ―――― 779 milliseconds
The serialized database is in Plass2018.dge.loom.cf.

Plass2018.dge.loom.cfファイルが生成されるのですが、 "Creating a database ――――― "の行が怪しいような。。

処理を続けます。

$ ./bin/cellfishing search Plass2018.dge.loom.cf Plass2018.dge.loom >neighbors.tsv

  Loading the database ―――― 409 milliseconds
  Loading query data ―――――― 14 seconds, 822 milliseconds
  Searching the database ―― ERROR: LoadError: MethodError: no method matching findneighbors(::Int64, ::Array{Float32,2}, ::Array{String,1}, ::CellFishing.CellIndex; inferparams=false)

no method matching findneighbors()のように、LoadErrorとMethodErrorが発生し、は実行後に空のneighbors.tsv生成されます。

Juliaの対話環境でCellFishing.jlを試す

先ずは小さなテスト用のデータ("test.csv")を作成して Juliaの対話環境からCellFishing.jlを試してみます。

テスト用のデータはPythonで作ることにしました。

import numpy as np
data = np.random.rand(10, 10)
np.savetxt('test.csv', data, delimiter=',', header="A,B,C,D,E,F,G,H,I,J", comments='')

これをJuliaで読み込みます。

$ julia

julia> using CellFishing
julia> using CSV
julia> data = CSV.read("test.csv", delim=',')

10×10 DataFrames.DataFrame
│ Row │ A         │ B         │ C        │ D        │ E         │ F         │ G        │ H         │ I        │ J        │
│     │ Float64⍰  │ Float64⍰  │ Float64⍰ │ Float64⍰ │ Float64⍰  │ Float64⍰  │ Float64⍰ │ Float64⍰  │ Float64⍰ │ Float64⍰ │
├─────┼───────────┼───────────┼──────────┼──────────┼───────────┼───────────┼──────────┼───────────┼──────────┼──────────┤
│ 10.534841  │ 0.639309  │ 0.951326 │ 0.51084  │ 0.322408  │ 0.523939  │ 0.27006  │ 0.163017  │ 0.434338 │ 0.901502 │
│ 20.0446897 │ 0.304389  │ 0.75983  │ 0.300121 │ 0.219402  │ 0.56748   │ 0.347568 │ 0.456145  │ 0.227494 │ 0.170003 │
│ 30.91494   │ 0.631714  │ 0.938954 │ 0.580154 │ 0.329751  │ 0.277192  │ 0.749877 │ 0.770334  │ 0.219486 │ 0.290027 │
│ 40.517408  │ 0.764021  │ 0.131445 │ 0.711081 │ 0.0529305 │ 0.626505  │ 0.522473 │ 0.405844  │ 0.526721 │ 0.298303 │
│ 50.105178  │ 0.981811  │ 0.650602 │ 0.245692 │ 0.59703   │ 0.0556564 │ 0.659795 │ 0.963262  │ 0.644763 │ 0.880459 │
│ 60.404249  │ 0.240975  │ 0.983174 │ 0.502272 │ 0.606391  │ 0.367596  │ 0.452079 │ 0.257366  │ 0.973874 │ 0.838456 │
│ 70.576502  │ 0.714612  │ 0.414675 │ 0.267715 │ 0.493334  │ 0.400844  │ 0.70549  │ 0.377676  │ 0.299713 │ 0.739577 │
│ 80.370031  │ 0.0245976 │ 0.629839 │ 0.7359   │ 0.158023  │ 0.27708   │ 0.319453 │ 0.0474918 │ 0.923331 │ 0.605994 │
│ 90.196867  │ 0.65604   │ 0.821253 │ 0.260594 │ 0.221491  │ 0.737735  │ 0.453375 │ 0.634916  │ 0.477798 │ 0.387817 │
│ 100.304881  │ 0.864026  │ 0.293561 │ 0.210086 │ 0.543985  │ 0.796436  │ 0.222279 │ 0.729611  │ 0.403505 │ 0.678046 │

julia> typeof(data)
DataFrames.DataFrame

CSV.read()で生成したデータはJuliaのDataFrame.DataFrameになる模様 (テーブルの上にも表示されていますが)

CellFishing.jlの処理に続きます。

julia> cellnames = string.(names(data))
julia> featurenames = ["1","2", "3","4","5","6","7","8","9","10"]
julia> counts = Matrix(data[:,:])

生成したJuliaのDataFrameにはindex nameが含まれません(行番号のみ)。 とりあえずfeaturenamesには行番号的数字を渡してみます。 このDataFrameは属性的な文字列を含まないのでcountsにはdata全体を渡して、処理を続けます。

julia> features = CellFishing.selectfeatures(counts, featurenames)
julia> database = CellFishing.CellIndex(counts, features, metadata=cellnames)
ERROR: MethodError: no method matching CellFishing.CellIndex(::Array{Union{Missing, Float64},2}, ::CellFishing.Features; metadata=["A", "B", "C", "D", "E", "F", "G", "H", "I", "J"])
Closest candidates are:
  CellFishing.CellIndex(::Any, ::Any, ::Any, ::Any, ::Any) at /Users/oec/.julia/packages/CellFishing/xKKa0/src/index.jl:103 got unsupported keyword argument "metadata"
  CellFishing.CellIndex(::AbstractArray{#s17,2} where #s17<:Real, ::CellFishing.Features; metadata, index, keep_counts, normalize, scalefactor, transformer, n_dims, randomize, standardize, n_bits, n_lshashes, superbit) at /Users/oec/.julia/packages/CellFishing/xKKa0/src/index.jl:178
Stacktrace:
 [1] top-level scope at none:0

MethodErrorに。。no method matching CellFishin.CellIndex() とのこと。

この処理に渡すcsv・arrayが妥当かどうかがまず妖しいところなので、 テスト用のデータをCellFishing.jlgithubに置いていただけたりすると ありがたいかもしれません。

links

social