e1071ってSVMでregression analysisできるのね

スポッポユーザー会で雑談してたら教えてもらった。

知らんかった。マニュアル読んだら確かに書いてあるよ。
http://cran.md.tsukuba.ac.jp/src/contrib/Descriptions/e1071.html http://bg9.imslab.co.jp/Rhelp/R-2.4.0/src/library/e1071/man/svm.html

で、単なるsupport vector regressionって二値分類の拡張なのかね?と思ったので帰ってきてから調べたらそれっぽいものがヒット。

おーナイス!とかいって、A Tutorial on Support Vector Regressionをps2pdfでpdfに変換したら70p以上あった。うーん、後で読もう。

Rのtempdirは変更できないっぽい

R-2.3.1を立ち上げると/tmp/RtmpXXXってな感じにテンポラリのディレクトリができる。

R 2.3.0 の変更点 - RjpWiki

The R session temporary directory is now set in C code using the same algorithm whether or not the shell front-end is used and on all platforms. This looks at environment variables TMPDIR, TMP and TEMP in turn, and checks if they point to a writable directory.

環境変数変えてみてもその下にRtmpXXXができてしまう。

> tempdir()
[1] "/tmp/Rtmpoo9Vt4"

tempdirでテンポラリのディレクトリを返すことはできるが、任意のディレクトリをセットすることができないし、Rを起動してからテンポラリのディレクトリを変更できなさげ。必要な関数を探すこつを見ながら組み込み関数探してみたけどやっぱないっぽい。

rpy

Statistics::RもRSPerlもイマイチ感が強かったので、rpyを使い始めているが、こんなに便利とは思わなかった。

というわけで、rpyで主成分分析を行い、できたモデルで新しいデータの主成分を求めてみるというサンプルを。  今回はrpyのテストなのでデータはrnormで作った。普通バイオインフォとかケモインフォなパターンだと、遺伝子の発現レベルとか、化合物のディスクリプターを使うけど。

>>> from rpy import *
>>> r.library('stats')
>>> a = r.matrix(r.rnorm(15),5)
>>> b = r.matrix(r.rnorm(15),5)
>>> model = with_mode(NO_CONVERSION,r.prcomp)(a)
>>> model
<Robj object at 0xb7f9f1c0>
>>> r.predict(model,b)
array([[ 0.28817526, -2.20038126,  0.42937523],
      [ 0.76682094, -1.38050702,  0.24898564],
      [-0.28308137, -0.51609132,  0.12062971],
      [-0.68531169,  1.42599763,  0.03987597],
      [-1.35685327,  0.02394946, -1.03868517]])

と数行ほどで、予測したいデータセットの主成分がpythonのarray型で返ってくるので、このあとの処理が凄く楽チンになる。

rpyはデータのコンバージョンのやり方だけきちっと押さえておけばあとはRと一緒に扱えるのだが、コンバージョンのモードが色々あって、初めのほうは悩まされることが多かった。特にモデルをRで適用する場合、python形式にコンバートしてしまうとRで扱えなくなってしまうのでNO_CONVERSIONモードにしないといけない。

RSOAP

Rをネットワークで使うには、CGIwithRで十分だろうと考えていたが、まぁいろいろあって(単にSOAPいじりたくなっただけともいう)RSOAPを入れてみることにした。

正直なところがパイソンいじったことがないので、ちょっと避けてたのもあるヨ。

用意するものは結構多い

  • fpconst-0.7.2.tar.gz
  • PyXML-0.8.4.tar.gz
  • logging-0.4.9.5.tar.gz
  • R-2.1.0.tar.gz
  • session_1.0.1.tar.gz
  • rpy-0.4.2.1.tar.gz
  • SOAPpy-0.11.6.tar.gz
  • RSOAP-1.1.3.tar.gz

まずRはrpyのために--enable-R-shlibオプションをつけてインストールしなければならない。ということで勢いtarボールから。

#./configure --enable-R-shlib #make #make install

いやー、Rのコンパイルは長い。RH4xあたりでのカーネルコンパイルくらい(古い?)こんなにかかるとは思わず、昨晩makeしたら、U隊長に大不評(僕のマシンは寝室においてあるので排気音とガリガリ音がうるさい)。で朝起きてからセッションいれとく。

#R CMD INSTALL session_1.0.1.tar.gz

tar xvfz して、パイソン関係のモジュールを順番に入れます。

#python setup.py build #su #python setup.py install

rpy だけちょっとメンドイ。まず、libR.soへのパスを通す。READMEだとbinに通してるけどlibでしょ。

#su #vi /etc/ld.so.conf ## /usr/local/lib/R/lib を記述 #ldconfig

ちなみに、setup.py も適当に書き換えないといけなかったりする場合もあるよ。-lR が見つからんぜよみたいなエラーの場合は、setup.py中の記述のbinをlibに変えるといい(まぁすぐわかる)。あとRのライブラリもtar xvfzする。僕の場合はR-2.1.0なので、

#tar xvfz R-2.1.0.tar.gz R-2.1.0/src/include #su #python setup.py install

最後にRSOAPのインストールは、普通

#python setup.py build #su #python setup.py install

ローカルでテストしたかったら、SimpleExample.pyというのを探してきて、ホスト名をlocalhostに書き換えておく。

#su #RSOAPManager

で、サーバーを立ち上げといて、別の端末から

#python SimpleExample.py

結果が戻ってくればOK

TCP/IPでやりたければ

#su #RSOAPManager --tcp-ip

ここまではうまくいったヨ。今朝、作業したわりには記憶が曖昧なので順番が前後してるかもしれん。

Rでタンパク質の立体構造を扱う

Rで蛋白質の立体構造とか配列を扱えるパッケージをdel.icio.us経由で発見。

Bio3D: Home

Bio3D is an R package containing utilities for the analysis of protein structure, sequence and trajectory data.

Structure Biologyっぽい関数が多くて、MDの解析したりとか。あまり凝ったことはできないみたいだけど、Rからpdbのデータ読めるのはかなり便利。DistanceMatrix綺麗に描いてくれるだけでも、ちょっとした用途に使える。

> library(bio3d)
> pdb <- read.pdb(system.file("examples/1bg2.pdb", package="bio3d"))
[1] "HEADER    MOTOR PROTEIN                           04-JUN-98   1BG2              "
> k <- dm(pdb, selection="calpha")
> plot(k)

distance_matrix

この勢いで膜貫通予測とかできるようにならんかな。あとリガンドとのDistanceMatrixを作るにはマトリックス少しいじればよいかな。というか、こうやって作ったマトリックスそのものをfingerprintに変換してplsとかpcaとかにまわせられたら素敵かも。

この場合、CoMFAとか違いがでるかな?うーん、やってみないとちょっとイメージできないかも。

RNews volume 6/3はオモシロげ

CRANでRNewsの最新版が読めるようになってた。今号はなかなか興味深い記事が多かった。全部読んでみたけど特に印象深かったのはこの3つ

Fitting dose-response curves from bioassays and toxicity testing

毒性試験との用量依存性曲線を描くためのコツというかそんな感じの内容。

酵素アッセイとかだと普通にシグモイド曲線のフィッティングをすればいいが、ED50なんかを求める系だと、hormesisがおきるので、特に低用量下でブランクよりも高い値がでる場合がある。そういう場合は linear-logistic modelを導入するとよいらしい。

The pls package

僕はよく使うので、multi-response modelsのとこと、varidation周りの話題が参考になった。

Generating, Using and Visualizing Molecular Information in R

RからCDKを使う話。SJavaをつかってRから記述子を抽出したりとか画像を表示したりとか。僕はRから他の言語を使おうとはあまり思わないほうなので参考になったという感じ。むしろ、jython+CDKRpyを組み合わせて色々できると面白いナァと思う。

RSPerl

Statistics::R なんかいまいちとか言って、もっぱらRのヒストリファイルをいじってバッチ用に書き換えて使う日々が続いてたが、何を思ったのか、突然RSPerlを使いたくなったのでインストールしてみた。

まずは、Rのインストールから。rpmで楽々。

$ rpm -qa | grep R-
R-devel-2.3.1-1.fc5
R-2.3.1-1.fc5

RSPerlもコマンド一発で楽チン。

$ R CMD INSTALL  --configure-args='--with-in-perl' RSPerl_0.91-0.tar.gz

環境変数の設定スクリプトがあるので、/etc/profileに書いておく

$ vi /etc/profile
#for RSPerl
source /usr/lib/R/library/RSPerl/scripts/RSPerl.bsh

これで、OK。

でRSPerlのいいところは

  • 配列をリファレンスで渡せる(Statics::Rとは違う)
  • AUTOLOADでRの関数を呼び出せる。R::plotとかできる

ので、結構便利だ。

でもマトリックスとかデータフレームの扱いがちょっとめんどくさいのと、Rを起動するために、 &R::initR("--silent") とかやらないといけないのと、$r->plotとかやりたいのにR::plotと書かなきゃいけないので、長いコードだとごちゃごちゃしてきて見通しが悪くなる。

結局Rでバッチのほうがコードが読みやすかったりとか。やっぱRpyか。昨日ソフトのインストールに来てた業者の人も最近pythonの案件増えてますよ~とか言ってたし。

ProductName みんなのPython
柴田 淳
ソフトバンククリエイティブ / ?円 ( 2006-08-22 )


うー、欲しくなってきた。

Drug Quiltはフラッシュの動的な変化が楽しい

Drug Quiltが面白い。Ajaxでも同じような表現はできるかな?静的なのはRでも出来るような、、、、

pharmaceutical data landscape - data visualization

a dynamic data visualization of the brand name & generic drugs the US Food & Drugs Administration has approved to. published weekly as a series of data files, this data represents an accurate description of the american pharmaceutical landscape.

FDAのデータだからちょっとデータが少ないけど、PatentQuiltとかにするとかなり凄いかも。あとaから順番に並んでるみたいだけど、ポジショニングの軸入れたり、化合物の類似性の軸入れたりするとかなりヤバげ。

Practical Regression and Anova in R

Rで描画させるの楽しいけど、モデルつくんのにRをちゃんと覚えねばってことで、Practical Regression and Anova in Rもちょっとづつ読み進めてます。

Practical Regression and Anova in R

This a masters level course covering the following topics:Linear Models: Definition, fitting, inference, interpretation of results, meaning of regression coefficients, identifiablity, lack of fit, multicollinearity, ridge regression, principal components regression, partial least squares, regression splines, Gauss-Markov theorem, variable selection, diagnostics, transformations, influential observations, robust procedures, ANOVA and analysis of covariance, randomised block, factorial designs.

書籍にもなってるようだ。

ProductName Linear Models with R (Chapman & Hall/CRC Texts in Statistical Science)
Julian J. Faraway
Chapman and Hall/CRC / 6462円 ( 2004-08-12 )


SAR,SPRは、よくわかんないパラメータをたくさん(1000以上とか)出してみて、activity,propertyをうまく説明できるパラメータを絞り込んでいき、絞り込まれたパラメータとactivity,propertyとの関連性を類推していくプロセスがおもろい。

データセットをテストセットとトレーニングセットにわける

最近、予測モデルスクリーニングとかいって、SVM,Bayes,PLSなんかのアルゴリズムと、構造、物性ディスクリプターの組み合わせを網羅的に試して、調子のいいモデルをセレクションするコードを書くことに凝ってる。

だが、QSARというか予測モデルを構築するのに、データを訓練用とテスト用の二つに分けねばなりませぬ。実はその作業は結構手間で、レンジの狭い(0ばっかで役に立たない)記述子除いたり、ノーマライズ(レンジを-1から1にそろえる)したりと、記述子の選択も手間だけど、データセットを分ける際にも記述子の分布にも気を使わなければならず、、、

正直だるいヨ

実際、この部分をプログラムがある程度面倒見てくれるツールなんかもあるらしいんだけど、、

Rで書いてみようとしてみたナリ。

一応、R NewsのSVMのページからランダムにセットを分ける方法を見つけたのでヒストリをのせた。

http://cran.r-project.org/doc/Rnews/Rnews_2001-3.pdf

nrowは大文字で。

$ library(e1071)
$ library(rpart)
$ library(mlbench)
$ data(Glass)
$ index <- 1:NROW(x)
$ testindex <- sample(index,trunc(length(index)/3))
$ testset <- Glass[testindex,]
$ trainset <- Glass[-testindex,]

あとはパッケージで、dprep,Designあたりがそれっぽいかなって感じ。

説明変数の分布の度合いを考慮したセットの分割をしたいので、もう少し考える必要はある。