このコラムでは,前回紹介したpooled QCの定量値を用いて,大規模分析における定量値のドリフトを補正する際の数学的な背景を説明します.原則,QCサンプルは,分析の前後はもちろん,5-8サンプルに1回の割合で分析されているものとします.流れとしては,たとえばAlanineという化合物の定量値に着目した際,
1.LOWESS平滑化(スムージング)により,少しだけ,QC定量値をスムージングする
2.Splineにより,QC値を補間する
3.補間値により,Sampleの定量値を標準化する(補間値で割る)
という流れになります.1の操作に関して,ぞくに言う平滑化(スムージング)ということをする意義の1つに,「傾向を抽出する」ということが挙げられます.上の図の場合だと,「QCの定量値が徐々に上がっているなー」というのを,捉えるようなイメージです.平滑化することで,誤差を取り除き,定量値のドリフト傾向を捉えることが可能です.
平滑化のポイントは,「平滑化窓」つまり「何ポイントつかって平滑化するか」ということと,「どのような平滑化法を使うか」の2つがポイントとして挙げられます.当然,平滑化窓の幅は,狭いとフィッティングしすぎになるし,広いとざっくばらんにしか傾向を捉えられなくなってしまいます.本当は,クロスバリデーションを使って,最適な平滑化窓の幅を決定するべきかと思います.LOWESSという平滑化法では,その平滑化幅は0から1の小数点で記載され,1.0だと全ポイントが平滑化窓に入る,0.2だと20%が平滑化窓に入るという意味になります.普通の移動平均とかでは,「3ポイント」とかいう記載方法を行うこともあり,この場合,着目している点も含めて±1ポイントの範囲のデータを用いてスムージングするという意味合いになります.定義によっては,±3ポイントということを意味することもあるので,説明書を読んで下さいね.
LOWESS平滑化法を使う理由は,俗にいう移動平均法,加重移動平均法等々よりも,ロバスト,つまりアウトライヤーに影響されにくい平滑化法であるということが理由として挙げられると思います.プログラムの実装は,難しいほうかと思いますが…基本的には,平滑化窓のデフォルト値は,0.4から0.7で設定されることが多いようですね.生データの定量値を見てみて,ゆるやかに定量値が変化しているようであれば窓を大きめに,定量値の傾向が頻繁に変わっているようであれば窓を小さめに…という感じです.ここは,決め打ちで窓幅を設定しても良いと思うのですが(以外に綺麗になります),情報系の人は,客観的にやりたいということでクロスバリデーションにより決定することのほうが圧倒的に多いと思います.ちなみに,管理人は,0.4(サンプル数が多い場合)か0.7(サンプル数が少ない場合)の2つの値しかやりません.というのも,
・化合物ごとにクロスバリデーションをする,つまり窓幅を変えるのは,バイアスがかかる
・全部の化合物を同じ窓幅でやるにあたって,「化合物ごとにドリフト具合が異なる」というワンダーな質量分析を使うということに限り,クロスバリデーションで決めることに意味があるのか?
と,思ってしまうため,もう,決め打ちで良いのでは?と思ってしまうので…いや,すみません,ひとりごとです.LOWESSの方法は,少し日本語訳が間違っている所がありますが,下記サイトが結構詳しく説明しています.
https://www.hulinks.co.jp/support/flexpro/v7/dataanalysis_LOESS.html
LOWESSで使う理論は,
1.平滑化窓内において「重み付け最小二乗法」を実施
2.重み付け基準は,着目点からの距離に依存し小さく見積もる
3.上記の距離に依存した重みの他,外れ値と考えられるものは重みを小さくしたいという発想から,(たとえば)まずサンプルに外れ値が無いとして,均等に重み付けを行い,それによって得られた平滑値と実測値の差分を見る.その差分が,他のものよりも明らかに大きいサンプルが存在した時,そのサンプルの重みを少し小さくすることを覚えさせる.その覚えさせた係数を用いてもう一度最小二乗法をする.という操作を,だいたい3-5周くらいさせて,最終的な平滑化の結果とするというのが一般的かと思います.
ここまでが,平滑化の理論です.プログラムで実装するときのポイントですが,結局は最小二乗するわけで,逆行列コードを書くことになると思います.また,外れ値検定を行う際,分母に「差分の中央値(上のリンク見てください)」というものを当てはめることになります.注意しなければいけないのは,たとえば,QCの定量値が全部0とかになっている,もしくは,ある平滑化窓の区間に0だけのときがある,もしくはほとんど0である,などなどがあると,逆行列存在せず(det|A|=0)や外れ値検定で分母が0という,得てしてどうしようもないことがおきます.
まじで,そのようなデータをそもそも入力するなって言いたいと思うのですが,まず,この事実を認識している解析者は,
1.QCの値が,「正常に取得されている」,たとえば,全QCで1000以上のインテンシティがある
2.QCのCV値が50%を超えていない
というような感じで,フィルタリングを最初にしておくことをおすすめします.でないと,エラーが返ってきて,「なんでこのプログラム,動作しないの?」といった事になります.で,プログラム開発者は,どのようなエラーを返して,ユーザーにわかりやすい道筋を与えてあげるかがポイントになります.
ただ,ノンターゲットでやる場合,基本的に,1000-5000ほどのピーク情報それぞれに対してLOWESSを走らせるわけですが,ユーザーがまず,この1000-5000のQC値をチェックして,削減してからLOWESSに持ってきてくれるっていうハッピーなことをするのは稀,ということも,考えてあげて,どのようなサービス精神を持って,「無理やり一応解析しておいて,このLOWESSデータは,そもそも信用ならないから気をつけてね!」というようなマークを付けてあげるっていうのも,1つの手かと思います. QCのフィルタリングをソフトウェア上で実装するというのもありかと思います.ソフトウェアサービスって,こういうところも時間を食いますよね.けど,やらないと,いつまでたってもメタボロの裾野広がりませんよね.ただでさえ質量分析のオペレート難しいのに,解析も難しかったらやる気無くすと思うので,「分析・解析キット」という形で提供し,しかも,データの見直しも簡単にできるソフトウェアを作ってあげることが,管理人の目標なのですが,できているか不明…すみません,久しぶりにスーパー脱線しました.笑
続いて!このように平滑化したQCの値を使って,Splineにより補間します.「補間」というのは,今回,どういうことかというと,上の図の例だと,1番目と6番目にはQCの定量値が存在するけど,2番目から5番目のところには当然のことながら,QCの値は無いわけです.この2番から5番目に,もしQCを分析していたとしたら,QCの値はいくらくらいになったのでしょう?この値を見積もる方法が,補間と呼ばれる操作であり,Splineと呼ばれる方法を今回用いるということです.Splineって何?というのは,以下のホームページを参考にしていただければと!
http://www.akita-nct.ac.jp/yamamoto/lecture/2004/5E/interpolation/text/html/node3.html
今回の場合に関して具体的に説明すると,
1.平滑化後のQC値(1番目,6番目,11番目,16番目,21番目,26番目)の値をすべて通る関数
2.それぞれの区間(たとえば1番目と6番目)の間は,3次関数で近似
ということになります.3次関数なので,それぞれの区間ごとに4つの係数を決定してあげないといけないのですが,管理人は自然スプラインとして解いているので,
・一次導関数と二次導関数の値が,節点(1,6,11,16,21,26)で連続
・端点(1と26)での二次導関数は連続が0,つまり,凹凸が無い状況を想定する
という制約条件を付加して,係数問題を解いています.とにかく,ここで大事なことは,このスプラインによって,「QCを分析していない場所でのQCの値を見積もる」ことができている,ということです.
最後,後は,この補間されたQCの値で,たとえば2番目に分析したサンプルのアラニン定量値を,「2番目にQCを分析していたらこの定量値であったであろう,補間されたQC値」で割る,という操作を,全サンプル,全化合物で行います.
ですので,得られた結果は,ニュアンスとしては,「QCを基準とした,つまり1とした,相対比」としてデータが標準化されることになります.元々の強度値のニュアンスを,標準化後に残したいというのであれば,QCの平均値(もしくは中央値)を算出しておき,その値を標準化したものに掛けてあげたら,せめて「オーダー」情報は保存できると思います.
少し今回はマニアックだったかもしれませんが,「数学背景」を理解することで,用意しなければいけない「実験計画」ならびに「エクセルにおけるデータ前処理」ということが理解でき,信頼性の高いデータが取れるようになるということを,学生の皆様は認識して,これからも勉強に励んでいただければと!思います.
それでは,今日はこの辺で.