MRIcronのNPM (non-parametric mapping) を使いたい人へ。
QandA形式でちょっとしたアドバイス
Q1.これを使ってVLSMをするのは初めてですが、"Error in reading NIFTI headers need to be at least 348 bytes" というエラーが出て実行できません。
A1.
NPMでVSLMを実行する時、まずvalファイル選択画面が出、次に結果出力ファイル名とフォルダの選択画面が出ます。その次です。"select explicit mask [optional]" 画面は、キャンセルするのです。なぜかvalファイルが自動的に選択されますが、それを実行するとそのエラーが出ます。
Q2.out of memory といわれて分析できませんでした。
A2.
病巣例が少ない(1例とかの)voxelも含めて計算しようとしていますか?病巣例が多いvoxelだけを検討する事にして、NPMを再起動してみてください。
Q3."low statistical power as tests computed for voxels damaged in at least ..." という warning が出ました。どうしたらいいのでしょう?
A3.
low statistical power... とは、出る計算結果以外の部に実は本当の機能関連部位があるかもしれませんよ、という意味。調査部位を広く、病巣例が少ない部位まで含めると、そう言われます。論文にpower分析も加える予定がなければ、無視してよいです。
Q4.このt検定はStudent? Welch?
A4.
Studentです。だから作者は推奨してない。
Q5.結果に出るのはz値ですか?t検定をした場合ならt値では?
A5.
マニュアルにはz値と書いてありますね。でもz値は、正常人の大量のデータがないと出せないはず。t値やBM値を便宜的にz値と呼び変えてるのかな、と僕は思っていました。しかし、プログラムを解読すると、作者はt値やBM値をz値に変換しているようです。その方法は不明。
Q6.久しぶりに新しい症例も含めてnpmで分析しようとしたら、"file dimensions differ from mask" といわれて分析できません。
A6.
MRIcronの Windows > information あたりの設定をいつの間にか変えてしまったのでしょう。僕がvoiファイルを作ったとき、2016年以前と2017年以後で dimension の設定を変えてしまったらしく、いっしょに分析しようとしたら 上記のエラーをくらいました。しかたないので2016年以前のvoiファイルは新しい条件で読み込みなおして現在の設定にそろえました。
Q7.NPMって、中身の計算法はどうなってるのでしょう。
A7.
プログラムが
GitHub
に公開されています。以下を参考に。(僕もPascalのプログラムは初めて解読しました。Pascalって、代入に:=を使うんですね。)
・メインメニューを作ってるプログラムはnpmform.pas。
その987行目の
doLesion
関数でprefs.pasの53行目に飛び、その145行目で
turboLDM
関数を呼ぶ。
・
TurboLDM
関数は、turbolesion.pasの291行目以後に定義されてる。これがNPMの計算本体。
・turbolesion.pasの395行目までは変数の初期化など。
373行の
InitPermute
手順はunpm.pasの最後1654行で定義。lnpermuteを初期化。
395行の
ClearThreadData
手順はStatThdsUtil.pas で定義。gPurmuteMaxTを初期化。
・turbolesion.pasの396行目から449行目までがvoxelごとの統計値計算。
・423行目、連続値課題の統計値を出す
TLesionContinuous
オブジェクトは、 LesionStatThds.pas の223行564行で定義されてる。その手順の最後のあたりで
StatPermuteThreaded
手順を呼んでいる。これも同じLesionStatThds.pas 内(179,475行)にある。この
StatPermuteThreaded
手順でgPermuteMaxTが計算される。
・LesionStatThds.pas内の
TLesionContinuous.Analyse
でやってるt検定は、
TStat2
とか
TStat3
という手順。これはstats.pas内で(584,638行)定義されてる。解読すると、Studentのt検定だ。作者はWelchのt検定も実装できるはずなのに、なぜStudentにしたのか不明。
・turbolesion.pasに戻って、450行目以後は全voxelの多重比較を考慮したしきい値計算。
・451行目の
SumThreadData
関数は StatThdsUtil.pas の最後95行目で定義されてる。lPermuteMaxTとは、StatThdsUtil.pasによれば、各スレッドのgPermuteMaxTの一番大きいもの。上記を解読して、僕は多重比較時のしきい値を計算するRスクリプトを書きました。
・turbolesion.pasの475行までで、MRIcronで表示するための全脳図の作成はおしまい。
・あとはしきい値の表示。最後の
reportFDR
(486行)、
reportPermute
(487行)関数はunpm.pasの1570、1584行めで定義されていて、結果が出力される。
・なおunpm.pasの
reportFDR
関数は、statcr.pas内にある
EstimateFDR2
手順を呼んでいる。なるほど一番原典の、単純で堅牢なBH法ですね。
・ところでturbolesion.pasのTtoZ関数(481-484行目)ってどこで定義されてるんだ?GitHubのこのフォルダに見つからないのだけど?