New PubMed

US National Library of Medicineが運営する医学文献データベースPubMedが新しくなりました。2020年の春には、今までのLegacy PubMedは無くなり、New PubMedに完全に移行するそうです。

デザインが変わっただけでなく、機能的にもかなり変わっています。デフォルトのソーティングがBest Matchになり、AIも導入して、それまでの類似の検索でクリックされた文献の情報を学習して、テーマと関連があると思われる文献を上位に表示するそうです。The New PubMed is Hereというページに簡単な解説があります。

検索結果のリストでCiteという部分をクリックするといくつかのフォーマットで引用文献に使えるよう、クリップボードにコピーすることができます。論文を書くときに引用文献を付ける作業に便利でしょう。Shareという部分をクリックすると、FB、TwitterにPubMed内のその文献へのリンクをアップしたり、リンク(PERMALINK)をコピーしたりできます。その検索式でのアラートCreate alertの作成もできるとのことです。

検索結果のソーティングをMost recentに変更することもできます。従来通り、左サイドバーにARTICLE TYPEでMeta-analysis, Randomized controlled trial, Systematic reviewを指定したり、Additional filtersからはObservational Studyなどを指定できます。

SAVEからはSummary, RIS, PMID, Abstract, CSVの形式でファイルとしてダウンロードできます。RISはResearch Information SystemのことでEndNoteで直接読み込める形式のテキストファイルです。従来のMEDLINE形式に似てますが、MeSHの情報が含まれていません。MEDLINE形式のファイルを利用していたプログラムは改修が必要ですね。

現在1分に2件のスピードで新たに文献が収載されているそうです。文献数の増加に伴い、より効率的な検索法が必要になり、それを開発しているということですね。New PubMedでは、PCだけでなく、タブレット、スマートフォンでも同じ機能が使用できるそうです。

2020年4月1日のNewPubMedに関する投稿はこちらです。

EBM 2019年

“Evidence-Based Medicine: How to practice and teach EBM”という本はSackett DLが第一著者の初版が1997年に出版されました。その後、2000, 2005, 2011年と改訂版が出版され、 2019年に第5版が出版されました。もうSackett先生の名前は著者に入ってませんが、Dedication: This book is dedicated to Dr. David L. Sackett.と書かれています。Sackett先生は2015年に他界されました。

Straus SE, Glaszious P, Richardson WS, Haynes RB: Evidence-Based Medicine: How to practice and teach EBM. (5th edition) 2019,  Elsevier Ltd., New York.です。

初版から22年経過し、その間には社会に、医療に、医学に大きな変化がありました。特にICT (Information and Communication Technology)の発展・普及、患者中心の医療、さまざまな疾患の病態の解明と新しい診断法・治療法の開発と実用化、介護・医療制度改革、医学研究や医療の情報量の増大、等々です。

EBMは医療者個人の医療の実践体系ととらえられ、個人でクリニカルクエスチョンに基づいて、文献検索を行い、関連のある研究論文を見つけ、批判的吟味をして、エビデンスを活用するというステップで考えられてきたと思います。しかし、医療情報が莫大になり、検索は簡単にできても、関連のある文献を選定する作業に時間がかかりすぎるようになってきました。さらに、それを読んでまとめるとなると非常に時間がかかり、ひとりでできる作業ではなくなってきています。医療でEBMを実践することが、個人ではできない時代になりつつあるのではないでしょうか?

下の図に示すP5のレベル3の診療ガイドライン、レベル4のレベル1~3をまとめたもの、などを情報源として用いれば十分やっていけるという考えもあるかもしれません。レベル4はUpToDate, DynaMed, Medscape Reference, Best Practice, Micromedexなどがリストアップされています。

”医療上の疑問が生じた際に、タイムリーに科学的に妥当な、最新の情報を、短時間で理解できる内容にまとめた形で、入手して、意思決定に適切に用いられるようにするにはどうすればいいのか?”それには、医師、看護師、薬剤師など医療提供者だけでは実現できません。医療提供者、医療利用者など当事者だけでなく、ICT技術者、ICT企業、出版社、クラウドサービス提供企業なども協働で参加しないとできないでしょう。

今後はレベル5のSystemsを追求すべきで、さらにエビデンス生成の分野も統合して、…こんな風に考えながら、このEBMの本のEBHC Pyramid 5を眺めているところです。

どんどん変わっていきますね。Take a “P5” approach to evidence-based information accessって書いてあるんですね。

P5というのが面白いでしょ。一番上の5.Systemsって最初何のことがわからなかったけど、これってGAFAが隆盛を誇っていることとも関係してるよね。そう思わない?P4 medicineというのもあるけど。 predictive, preventive, personalized, and participatoryって言うんだけれど。これは、Pyramid 5なんだ。

ハハハハ。面白い。Google, Apple, Facebook, Amazon!医療情報の検索はiPhoneからGoogleで、論文の内容はAIがまとめます、ドクター探しは、Facebookで、医療費の支払いもリブラで、お薬はAmazonで、ですか?それはどうかな?

でも彼らが本気で取り組めばできるんじゃないかな?資金も技術力もあるし、タレントを世界中から集められるし。

第4版では、Take a “6S” approach to evidence-based information accessになってますね。わかりやすくするために番号を付けると、一番上が(6) Systems: Computerized decision supportになってますよ。
次が、(5) Summaries: Evidence-based textbooks, (4) Synopses of syntheses: Evidence-based journal abstracts, (3) Syntheses: Systematic reviews, (2) Synopses of studies: Evidence-based journal abstracts, (1) Studies: Original journal articlesの順ですね。

こういうのは第1版、第2版には少なくともなかったね。

Synopsis、summary, abstract概要、抄録などを見ればいいのではないかと思えてしまうよね。他の人たちが批判的吟味を行ったその結果のまとめという意味だね。結論に至った過程を信用して。。自分の頭では考えないで。。

EBM実践のステップについても、Step 3にエビデンスの妥当性とインパクト(:効果の大きさ)の批判的吟味を行うことが述べられています。この”効果の大きさ”は意思決定には非常に重要な項目です。しかし、”患者の価値観に基づいてBenefit and harmあるいはBenefit and riskを明らかにして”というような表現はStep 4にはまだ取り上げられていません。

でもこれよくできてますね。しかも、これはずっと変わっていないですね。

わかる?Impact (size of the effect)って書いてあって、エビデンスの確実性、ここでは妥当性validity (closeness to the truth)って書いてあるんだけど、それの批判的吟味を重要と考え効果の大きさのことはあまり考えない人が多いので、ここのところはいいなって思ってるんだ。

そうですよね

個人レベルでのBenefit and harm益と害の大きさを判断するには概要や抄録の結論だけでは無理ですよ。health literacyヘルスリテラシーとnumeracyニューメラシーの理解の深さがどこまで求められるかよく考えないと。

今後は、SynopsisやSummaryが個人個人の意思決定に必要な数値データを提示する必要があるんじゃないかな?

EBMの定義については、以下の様になっています。(下の方の3つの項目は自分の解釈です。)

これは巻末の用語解説に書いてあるもので、最初のIntroductionの冒頭にも”What is evidence-based medicine?”と書いてあって、”Evidence-based medicine (EBM) requires integration of the best research evidence with our clinical expertise and our patient’s unique values and circumstances.”なんて書いてあるんですよ。これは”EBMは最善の研究エビデンスと我々の臨床的専門的技能・知識と患者さん固有の価値と状況と統合することを必要とする”ということだけを述べています。

ふーん、なるほど。最初の部分がないんですね。最初の部分も重要だと思うんですけどね。状況というのはその患者さんの置かれた状況のことらしいですね。

このあたりの記述もずっと変わっていないですね。

1998年のMulrow CEの臨床決断に関与する要素にはほぼ同じような内容が示されていました。

さて、最後にForeground questionsとBackground questionsについてわかりやすい説明があります。今回はこれで最後です。

OpenBUGSの使い方:第一歩

ネットワークメタアナリシスって複雑そうですね。

比較する介入が3つ以上はあるからね。原理はペア比較のメタアナリシスと同じなんだけど。

BUGSを使う場合が多いみたいだし、それも難しそうな感じ。BUGSってBayesian inference using Gibbs Samplingのことでしょ。OpenBUGSを使うっていうところでハードルが高いかな。まずは、OpenBUGSって何か知りたいな。

だいたいベイジアンて何だかわからないかもしれないね。でもOpenBUGSを動かして解析結果を得るところまではだれでもできるはず。Network Meta-analysisにはOpenBGUSを使うのが一般的だし、コードもいっぱい発表されているから、全部自分で書かなくてもそれを使って解析ができるようになっている。だから使えるようになりたいですよね。

まずはPCでランダムサンプリングができるということがわかる必要があるんだ。それが確率的シミュレーションの基だし、ベイズ推定Bayesian inferenceで用いるMarkov Chain Monte Carlo (MCMC) simulationの要だから。それをOpenBGUSで実行しながら、OpenBUGSの使い方を見てみよう。

たとえば、BUGSのコード、つまりプログラムで

mu~dnorm(0,0.0001)

って書いてある意味わかる?

dはdistributionで分布という意味でしょう。normは正規分布normal distributionのことでしょう。dnorm()は()がついているので、関数という意味で。。。0が平均値、0.0001は標準偏差か分散か、たしかBUGSでは分散の逆数つまり精度で指定するはず。だから、平均値0、精度0.0001つまり分散なら10,000、標準偏差なら100の正規分布からランダムサンプルを1個得て、変数muに格納するという意味ですよね。

そうそう、その通り。関数なんてよく知ってるね。0と0.0001は関数に与える引数(ひきすう)だよね。

そうですね。もしこのコードを繰り返し実行するとmuは0付近の値が一番多くなるけど、標準偏差が100だから、かなり範囲の広い値が得られますね。そうでしょう。

OpenBUGSをインストールして実際に動かしてみよう。MRC Biostatistics UnitのThe OpenBUGS projectのページで、Windows installerと書かれているところをクリックして、インストーラーのexeファイルのZIPファイルをダウンロードできます。ZIPファイルの中のOpenBUGS323setup.exeをダブルクリックしてデフォルトの条件のままインストールする。通常のWindows用のソフトウェアと同じ。

インストールしてOpenBUGSを起動して、FileメニューからNewを選ぶとEditor画面が出てきますね。

そうそう。そこにこう書き込んでみて。
#Random sampling
model{
mu~dnorm(0,0.0001)
}

こんな風にmodel{ }の{ }の中に動かすコードを書き込みます。今回はしないけど、データや初期値はその外側に書きます。コメントは#に続けて書きます。

Attributesメニューからフォントを12 Pointにして、字を大きく表示するようにしてから、書き込みました。

そうこれでいいね。

このコードを動かす手順を説明するね。まず、ModelメニューからSpecification…を選びます。そうするとSpecification Toolの画面が出てきます。そしたら、コードのmodelの文字列をダブルクリックして選択した状態にします。やってみて。

こうですね。

そうそう。そしたら、check modelボタンをクリックしてこのコードを読み込ませるとともにプログラムの整合性をチェックさせます。問題なければ、Editor画面の下の枠にmodel syntactically correctとメッセージが表示されます。

あ、出ました。load dataとcompileのボタンがアクティブになりましたよ。

そうそう。今回はデータの読み込みは必要ないので、load dataは飛ばして、compileボタンをクリックします。

compileボタンをクリックしたら、下にmodel compiledと出ました。load initsとgen initsのボタンがアクティブになりましたね。initsって初期値の設定のことですか?

そうなんだ。Markov Chain Monte Carlo (MCMC) simulationをするときに最初の値を設定する必要があるんです。OpenBUGSは、普通はGibbs samplerを用いてMCMC simulationを実行するために作られているので、初期値の設定をしないと次に進めないようになっているんだ。
このEditor画面のmodel{ }の下に書き込んでおいて、それをload initsで読み込ませて設定することもできるんだけど、今回はdnorm(0,0.0001)を一回実行させて得られた値を用いることにして、gen initsボタンをクリックしましょう。gen initsはgenerate initial valuesという意味ですね。

はーい、やってみました。下の方に、initial values generated model initializedと出ました。これで、コード実行の準備ができたみたいですね。

その通り。それでは、muの値を記録するために、InferenceメニューからSamples…を選んで、Sample Monitor Toolの画面を出しましょう。

はい。こうですね。nodeって書いてありますね。OpenBUGSではvariableじゃなくて、nodeという言い方をするんですね。

そう、そこに記録したい変数の名前を入力してsetボタンをクリックします。今回は、muひとつしかないので、muと入力すると、setボタンがアクティブになるので、そのボタンをクリックするだけです。
普通は、もっとたくさん記録したい変数があるので、コードを眺めながら、設定作業を繰り返すことになります。
記録するという意味は、ランダムサンプリングした値を後で出てくるupdateの数だけ、全部記録するという意味です。その値から、平均値を計算したり、分布を見たりすることになります。
普通のMCMCの場合は、このnodeの設定をする前に、Burn-inという、記録しないで、MCMCを実行させ、平衡状態に達した後にnodeを設定します。今回は、そのステップは飛ばして、最初から記録させます。

はい、muと入力してsetしました。setボタンをクリックするとnodeのフィールドが空になって、下のボタンが全部すぐinactiveになりますね。

そうそう。連続してnodeの設定することがやりやすいようになっているんだね。設定したnode (変数名)はnodeのフィールドの右にあるプルダウンメニューを開くと確認できます。

今度は、いよいよランダムサンプリングを実行するんだけれど、ModelメニューからUpdate…を選んで、Update Toolの画面を出してみて。そのupdatesというところに、ランダムサンプリングを何回実行するか、つまり何個ランダムサンプルを得るかを設定するんだ。

こうですね。デフォルトではupdatesが1000になってますね。今回は、10000にしてやってみましょうか。

多くの場合、1万から5万回の設定で十分みたいですね。多くすると処理に時間がかかります。モデルが複雑で、nodeの数が多いと何分もかかることはよくあることです。

updates 10000でupdateボタンをクリックして実行しました。あっという間に終了しました。下の方に、6秒かかったと出てます。これで、平均値0、標準偏差100の正規分布から、1万個のランダムサンプルが得られ、変数muに格納されたということですね。

そうですね。実際にランダムサンプリングされた値を見てみましょう。その後に、分布、平均値、中央値、95%確信区間などのデータを見ることにしましょう。
Sample Monitor Tool画面で、nodeのプルダウンメニューを開いて、muを選択してみてください。muと入力してもいいです。

nodeの下のボタンがアクティブになりましたね。statsとdensityとcodaのボタンもアクティブになりました。

そこで、codaのボタンをクリックするとランダムサンプリングされた値が表示されます。ランダムサンプリングってどういうことなのか分かると思うので、見てみましょう。

なんか二つ出てきました。ウインドウが重なるので、その部分だけ出すとこんな感じです。CODA indexとCODAchain 1っていう名前がついてますね。
CODAchain 1に表示されている値を見ると、バラバラですね。本当にランダムな感じですね。平均値0の正規分布だから、0前後の値が多いはずですよね。

CODAってConvergence Diagnostic and Output Analysisのことらしいんだけど、Rのパッケージでcoda: Output Analysis and Diagnostics for MCMCというのがあって、それを使って、このデータを解析することもできるんです。
今回は変数一つだけなので、CODA indexにはmuという変数は1行目から10000行目までの値だということしか書かれていないですね。別の例を見せるけど、それぞれの変数のサンプリングされた値がどの行からどの行までかという情報が含まれています。
C_new 1 20000
C_overall 20001 40000
LAMBDA 40001 60000
S_new 60001 80000
S_overall 80001 100000
THETA 100001 120000

CODA indexもCODAchain 1もそのウインドウを選択して、FileメニューからSave As…でファイルの種類をPlain text(*.txt)にしてテキストファイルとして保存し、あとで利用することもできます。Rからread.table( )で読み込んで解析もできます。CODA indexはdataframeとして行と列の位置を指定して CODAchainの方は数値型のvectorとして、何番目か位置を指定して値を読み出すことができるんだ。

Rはオープンソースウェアで統計解析に広く用いられているのは知ってるよね。もしRで同じことをするなら、mu=rnorm(10000,0,100)を実行するだけで、一瞬で1万個のランダムサンプルが得られるんだけど、今はOpenBUGSの勉強。

さてそれでは、分布をみてみましょうね。densityボタンをクリックしたらグラフが出てきました。statsボタンもクリックしてみました。

グラフを見ると平均値0で標準偏差100の正規分布だとわかりますね。Node statisticsの実際の値を見るとわずかな誤差はあるけど、meanはほぼ0、sdはほぼ100になってますね。updatesをもっと増やすと、さらに正確な値になるでしょう。この分布を代表する値が得られていることが実感できるね。

おもしろいですね。平均値と標準偏差の値を設定するとその正規分布からランダムサンプルを得るシミュレーションが簡単にできるんですね。

さてそれじゃ、load dataとload initsも試してみようか。load dataで平均値と標準偏差の値を設定して、精度は標準偏差の二乗分の1を計算させて、muの初期値は0に設定して、updatesは50000にしてやってみよう。

解析に必要な3つのウインドウは同時に表示できるので、今度はModelメニューからSpecification…、InferenceメニューからSamples…、さらにModelメニューからUpdate…を選んで、Specification Tool、Sample Monitor Tool、Update Toolの3つのウインドウを表示させてから以下の操作をやってみよう。

操作の順序は同じですね。順番に、
1. コードのmodel部分をダブルクリックして選択したらcheck modelのボタンをクリックし、
2. 次に#DATAのlistという部分をダブルクリックして選択してから、load dataボタンをクリックする。
3. 次に、compileボタンをクリックして、
4. 今度は#INITSのlistという部分をダブルクリックして選択してから、load initsボタンをクリックする。
5. 次に、Sample Monitor Toolでnodeにmuと入力して、setボタンをクリックする。
6. Update Toolでupdatesを今度は50000にして、
7. updateボタンをクリックする。ここで少し時間がかかる。
8. シミュレーションが終了したら、Sample Monitor Toolでnodeにmuと入力して、density, stats, codaのボタンをクリックして、結果を見る。

そうそう。コードはこんな風になっているんだ。

#Random sampling
model{
mu~dnorm(A,prec)
prec<-pow(S,-2)
}
#INITS
list(mu=0)
#DATA
list(A=0, S=100)

このコードはEditor画面を選択して、FileメニューからSave…あるいはSave As…でOpenBUGSの形式であるodcあるいはテキストファイル形式で保存できます。

なるほど、31秒で終了しましたね。結果はほとんど同じですね。でも分布の曲線がなめらかになっている。

コードを見ると、標準偏差Sの2乗分の1を計算して、つまり分散の逆数を計算して、precという変数に代入するコードが追加されていて、<-って書かれていますね。muのところも、dnorm( )に平均値はA、精度はprecが引数として設定されてますね。~はランダムサンプルを代入、<-はその値を代入するんですね。

SとAの値は、データとしてlist形式で与えられているんですね。標準偏差の方がわかりやすいからこっちの方がいいですね。

list部分をダブルクリックして選択してからload dataボタンをクリックすると値が設定されるわけですね。listの中はコンマで区切って複数の変数の設定ができるんですね。それと=で代入が行われるんですね。コードの中では、<-を使うのと違います。

muの初期値も同じように設定したということですね。

なんかすごいですね。OpenBGUSの操作が少し分かってきたので、次は、Network Meta-analysisをやってみたいです。

続きはこちら。

Bayesian meta-analysis of DTA with imperfect reference standard

診断精度研究Diagnostic Test Accuracy (DTA) Studyでは参照基準が完全であること、すなわち参照基準の感度・特異度が100%であることを前提として、インデックス診断法の感度・特異度を求めているが、実際には参照基準が不完全な場合が多い。 参照基準が不完全な場合には、参照基準で陽性と判定された例には、偽陽性の例が含まれるため疾患群には非疾患群の一部が含まれるとともに、陰性と判定された例には、偽陰性の例が含まれるため非疾患群に疾患群の一部が含まれてしまう。そのため、有病率を直接知ることができなくなるとともに、参照基準で分類された疾患群、非疾患群における評価診断法の感度・特異度は真の値の推定値とはなりえないことになる。

また、メタアナリシスで感度・特異度の統合値を算出する場合、研究によって異なる参照基準が用いられている場合もある。また、インデックス診断法と参照基準の間に相関がある場合はそれによる値の調整が必要である。このような場合に対処可能な、ベイジアンアプローチによるメタアナリシスの手法、BUGSコード、RスクリプトがDendukuri Nらによって報告されている。Nandini Dendukuriは自身のウェブサイトでこれらの情報を公開している。

Dendukuri N, Schiller I, Joseph L, Pai M: Bayesian meta-analysis of the accuracy of a test for tuberculous pleuritis in the absence of a gold standard reference. Biometrics 2012;68:1285-93. PMID: 22568612

Dendukuri N, Joseph L: Bayesian approaches to modeling the conditional dependence between multiple diagnostic tests. Biometrics 2001;57:158-67. PMID: 11252592

彼女の作成したBUGSコード、Rスクリプトにさらに、Forest plotを作成するRスクリプトを追加し、データをExcelで用意すれば、一度に解析を実行し、結果を出力するウェブツールを用意した。useRsのメタアナリシスの#5. Dendukuri Nのモデルを用いるR、BRugs、OpenBUGSによる診断精度(Diagnostic Test Accuracy, DTA)研究のベイジアンメタアナリシスである。実際のデータ処理は自分のPCでRとOpenBUGSで行うので、あらかじめRとOpenBUGSのインストールが必要で、さらにRのパッケージでtcltk2、BRugs、forestplotが必要である。これらのパッケージはPのスクリプトを最初にRで実行すれば自動でインストールしてくれる。 これらのパッケージの作者その他の情報についてはuseRsを参照していただきたい。

これらについては以前、国際医学情報センターの医学情報誌のあいみっくに発表しているのでそれらも参照されたい。
森實敏夫:医学統計学シリーズ第46回 RとOpenBUGSによる診断法のベイジアンメタアナリシスからForest plot作成まで。2018年6月。
森實敏夫:医学統計学シリーズ 第26回 参照基準が不完全な場合の診断法のメタアナリシス。2013年9月。
森實敏夫:医学統計学シリーズ 第25回 診断法のベイジアンメタアナリシス。2013年6月。