ゲノムワイド関連解析(GWAS)のマンハッタンプロットManhattan plot

ゲノムワイド関連解析(GWAS)のマンハッタンプロット

アイキャッチ画像のような図を論文で見ていて、どうやって描いたもので何を意味するのか自分でもとデータから図を描きつつ見方を学ぼうという事で書籍を開きながら試してみました。その時のチョコっとした学びを書き留めた備忘録です。

#初心者によるやってみた系の記事

参考にした書籍

参考にしたのは「ゼロから実践する 遺伝統計学セミナー〜疾患とゲノムを結びつける」という本です。参考というか、このホームページに書いていることは、この本に書かれていることをたどっただけです。書籍にはCGYWINのインストール、plinkの使い方から、マンハッタンプロットまで丁寧に書かれていますので、この書籍を読めば私のホームページは見る価値があまりないかもしれません。

Rでのプロット

ここで、今回使用したRのスクリプトを掲載しようと思っていたのですが、そのスクリプトというのが上記書籍を購入したらダウンロードできるというデータの中にあるスクリプトで、ごくわずか変更(ファイル格納ディレクトリやデータファイル名を変更)した程度なので、さすがに掲載したらまずそうだと思いとどまり、別の例で示します。

CRANから、Rのパッケージqqmanをインストールしてあるとして次になります。

library(qqman)
manhattan(gwasResults, chr="CHR", bp="BP", snp="SNP", p="P" )

gwasResultsはパッケージqqman付属のデータで、次のようにSNPの名称・染色体・位置・表現型と当該SNPとの関連性がないと仮定した場合の確率P値の4項目のデータが16470行続きます。

で、このスクリプトの結果は次の図のようになります。

 

色が寂しいので、同じデータでウクライナを思わせるカラーで表現すると

# Load the library
library(qqman)

# Make the Manhattan plot on the gwasResults dataset
manhattan(gwasResults, chr="CHR", bp="BP", snp="SNP", p="P",  col = c("#0057B7", "#FFDD00"))

次のようになります

図の中のSNPを表示するには , annotatePval = 0.01 を追加します

# Load the library
library(qqman)

# Make the Manhattan plot on the gwasResults dataset
manhattan(gwasResults, chr="CHR", bp="BP", snp="SNP", p="P",  col = c("#0057B7", "#FFDD00"), annotatePval = 0.01)

もう少し図にバリエーションを

3番染色体の集中していくつものSNPが高い-log10(p)値を示すのに頂上の変異しか名前が表示されないので annotateTop = FALSE というオプションをつけてみました。

# Load the library
library(qqman)

# Make the Manhattan plot on the gwasResults dataset
manhattan(subset(gwasResults, CHR == 3), chr="CHR", bp="BP", snp="SNP", p="P"
          ,  col = c("#0057B7", "#FFDD00"), annotatePval = 0.001
          , annotateTop = FALSE, main = "Chr 3")

3番目の染色体に関連のありそうなSNPが集中しているようなので3番目のsubsetを表示してみます。肝は subset(gwasResults, CHR ==3) の個所です。

# Load the library
library(qqman)

# Make the Manhattan plot on the gwasResults dataset
manhattan(subset(gwasResults, CHR == 3), chr="CHR", bp="BP", snp="SNP", p="P"
          ,  col = c("#0057B7", "#FFDD00"), annotatePval = 0.001
          , annotateTop = FALSE, main = "Chr 3")

気になるあたりをもう少し拡大します

# Load the library
library(qqman)

# Make the Manhattan plot on the gwasResults dataset
manhattan(subset(gwasResults, CHR == 3), chr="CHR", bp="BP", snp="SNP", p="P"
          ,  col = c("#0057B7", "#FFDD00"), annotatePval = 0.001
          , annotateTop = FALSE, main = "Chr 3", xlim = c(200,500))

 

データの作成

上記の作図は単純で、各Chromosome上のそれぞれの位置でp値をプロットしただけのものなので、結局はp値を計算して大きな外れ値(-> association)を示す位置を目視で確認しやすくしたものだという事がわかりました。

肝となるのはp値の計算になります。それでは、p値をどうやって計算していたかというと、複数人のSNPのデータと、それぞれのサンプル(の人)の興味のある表現型のデータを用いて表現型と無関係なSNPか表現型とassociateしているSNPかを計算しています。

plink.exe (windows用)がインストールされていて、冒頭の書籍の付録のファイル 1KG_EUR_QC.bed, 1KG_EUR_QC.bim, 1KG_EUR_QC.fam とかのデータがあったとして、コマンドプロンプトで次を実施しました。

plink.exe --bfile 1KG_EUR_QC --out 1KG_QC_Pheno1 --pheno phenotype1.txt --logistic --ci 0.95

上記で作成されるファイルから、p値等のデータを抽出するのにawkを使いました。awkを使うのに、MacOSだとawkはデフォルトで入っているのですが、今回はwindowsを使いましたのでCYGWINで実行しました。

awk '{print $2"\t"($1*100000000000+$3)"\t"$12}' 1KG_QC_Pheno1.assoc.logistic > 1KG_QC_Pheno1.assoc.logistic.P.txt

この出力で生成される 1KG_QC_Pheno1.assoc.logistic.P.txt ファイルを上の方で記したRスクリプトのインプットとすることで、マンハッタンプロットを描くことができました。

 

公開データを使って練習

さらなる練習用という事で「心筋梗塞1666症例および対照健常者3198名のGWAS」データが公開されており、使用についての制限がないためこちらのデータで試してみました。
(制限がない=NBDC非制限公開データとは、アクセスに制限を設けることなく、誰でも利用することが可能な公開データです。)
次のサイトからダウンロードしました。

https://humandbs.biosciencedbc.jp/

ゼロから実践する 遺伝統計学セミナー〜疾患とゲノムを結びつける」に従った例でawkで行っっていた、行の抽出の部分はをsqlで行いました。
好みの問題かもしれませんが、windowsでlinux emulatorみたいなのを稼働させてawk走らせるより、Microsoft AccessのSQLで抽出するのが素直に開発しやすいと感じました。

SELECT Release_L12vsUniv06_AllSample.[#SNPID] AS SNP, Release_L12vsUniv06_AllSample.chr AS chr, Release_L12vsUniv06_AllSample.chrloc AS location, Release_L12vsUniv06_AllSample.ptrend AS p INTO [0010 GWAS_results]
FROM Release_L12vsUniv06_AllSample;

で作図は次のようにしました。

library(readxl)
library(qqman)

GWAS_results <- read_excel("0010 GWAS_results.xlsx")
manhattan(GWAS_results, chr="chr", bp="location", snp="SNP", p="p"
          ,  col = c("#0057B7", "#FFDD00"), annotatePval = 0.00001
          ,  annotateTop = FALSE)

manhattan(subset(GWAS_results, chr == 12), chr="chr", bp="location", snp="SNP", p="p"
          ,  col = c("#0057B7", "#FFDD00"), annotatePval = 0.00001
          ,  annotateTop = FALSE, xlim = c(1.1e+8, 1.12e+08))

12番染色体の3’側に不均衡が集中している様なのでそのあたりを拡大したりしました。

 

 

オミクロン株 omicron (o) variant (B.1.1.529)

はじめに

2021.11.26 WHOがCOVID-19の原因ウイルスであるSARS-CoV-2の新規の変異(B.1.1.529)を評価するために、アドバイザリーグループThe Technical Advisory Group on SARS-CoV-2 Virus Evolution (TAG-VE))を開催しました。

南アフリカの最近の感染拡大と、B.1.1.529の検出の増加がcoinciding (一致している?)していて、予備的な検証ではこのバリアントによる再感染のリスクが高いことが示唆されているそうです。

現在のSARS-CoV-2PCR診断では、引き続きこの変異体が検出されます。いくつかの研究室で、広く使用されている1つのPCRテストでは、3つのターゲット遺伝子の1つが検出されない(S遺伝子ドロップアウトまたはS遺伝子ターゲット障害と呼ばれる)ため、シーケンスの確認が完了するまで、このテストをこのバリアントのマーカーとして使用できることが示されています。このアプローチを使用すると、このバリアントは以前の感染の急増よりも速い速度で検出されており、このバリアントが感染拡大にアドバンテージを持っている可能性があることを示唆しています。

アルファベット順で ν(ニュー)とξ(クサイ)をスキップしてのο(オミクロン)だそうです。習という中国で多い名前や英語の単語のnewを避けるためだそうです。

> avoid confusion with the English word “new” and the common Chinese surname Xi

変異が多い

B.1.1.529は多くの変異を示します。(下図はwiki pediaから)多くの箇所に変異が検出されます。

spike蛋白のアミノ酸残基にかかる変異だけでも以下のものが含まれるそうです。

A67V, Δ69-70, T95I, G142D, Δ143-145, Δ211, L212I, ins214EPE, G339D, S371L, S373P, S375F, K417N, N440K, G446S, S477N, T478K, E484A, Q493K, G496S, Q498R, N501Y, Y505H, T547K, D614G, H655Y, N679K, P681H, N764K, D796Y, N856K, Q954H, N969K, L981F

 

どう、料理したら良いかなぁ

SARS-CoV-2 変異

SARS-CoV-2(新型コロナウイルス)のSpikeタンパク質

Spikeのアミノ酸配列

新型コロナウイルス肺炎COVID-19の原因ウイルスである、SARS-CoV-2ウイルスのSpikeタンパク質のアミノ酸配列についてみてみました。一般にウイルスで変異のない株を野生型と呼びます。野生型のタンパク質のアミノ酸残基の配列を見ると、484番目のアミノ酸残基がE(Glutamic Acid, Glu)で、501番目のアミノ酸残基はN(Asparagine, Asn)です。

ちなみに変異の書き方ですが、この484番目のEがK(Lysine, Lys)に変異した場合E484Kと表記します。同様に501番目のNがY(Tyrosine, Tyr)に変異した場合にN501Yと表記します。

LOCUS       QOS45029                1273 aa            linear   SYN 28-OCT-2020
DEFINITION  SARS-CoV-2 spike [synthetic construct].
ACCESSION   QOS45029
VERSION     QOS45029.1
DBSOURCE    accession MW036243.1
KEYWORDS    .
SOURCE      synthetic construct
  ORGANISM  synthetic construct
            other sequences; artificial sequences.
REFERENCE   1  (residues 1 to 1273)
  AUTHORS   Wussow,F., Chiuppesi,F. and Diamond,D.
  TITLE     Development of a Multi-Antigenic SARS-CoV-2 Vaccine Using a
            Synthetic Poxvirus Platform
  JOURNAL   Unpublished
REFERENCE   2  (residues 1 to 1273)
  AUTHORS   Wussow,F., Chiuppesi,F. and Diamond,D.
  TITLE     Direct Submission
  JOURNAL   Submitted (23-SEP-2020) Hematology, City of Hope, 1500 E Duarte Rd,
            Duarte, CA 91010, USA
FEATURES             Location/Qualifiers
     source          1..1273
                     /organism="synthetic construct"
                     /db_xref="taxon:32630"
                     /clone="C35/41"
     Protein         1..1273
                     /product="SARS-CoV-2 spike"
     CDS             1..1273
                     /coded_by="MW036243.1:145058..148879"
                     /transl_table=11
ORIGIN      
        1 mfvflvllpl vssqcvnltt rtqlppaytn sftrgvyypd kvfrssvlhs tqdlflpffs
       61 nvtwfhaihv sgtngtkrfd npvlpfndgv yfasteksni irgwifgttl dsktqslliv
      121 nnatnvvikv cefqfcndpf lgvyyhknnk swmesefrvy ssannctfey vsqpflmdle
      181 gkqgnfknlr efvfknidgy fkiyskhtpi nlvrdlpqgf saleplvdlp iginitrfqt
      241 llalhrsylt pgdsssgwta gaaayyvgyl qprtfllkyn engtitdavd caldplsetk
      301 ctlksftvek giyqtsnfrv qptesivrfp nitnlcpfge vfnatrfasv yawnrkrisn
      361 cvadysvlyn sasfstfkcy gvsptklndl cftnvyadsf virgdevrqi apgqtgkiad
      421 ynyklpddft gcviawnsnn ldskvggnyn ylyrlfrksn lkpferdist eiyqagstpc
      481 ngvEgfncyf plqsygfqpt Ngvgyqpyrv vvlsfellha patvcgpkks tnlvknkcvn
      541 fnfngltgtg vltesnkkfl pfqqfgrdia dttdavrdpq tleilditpc sfggvsvitp
      601 gtntsnqvav lyqdvnctev pvaihadqlt ptwrvystgs nvfqtragcl igaehvnnsy
      661 ecdipigagi casyqtqtns prrarsvasq siiaytmslg aensvaysnn siaiptnfti
      721 svtteilpvs mtktsvdctm yicgdstecs nlllqygsfc tqlnraltgi aveqdkntqe
      781 vfaqvkqiyk tppikdfggf nfsqilpdps kpskrsfied llfnkvtlad agfikqygdc
      841 lgdiaardli caqkfngltv lpplltdemi aqytsallag titsgwtfga gaalqipfam
      901 qmayrfngig vtqnvlyenq klianqfnsa igkiqdslss tasalgklqd vvnqnaqaln
      961 tlvkqlssnf gaissvlndi lsrldkveae vqidrlitgr lqslqtyvtq qliraaeira
     1021 sanlaatkms ecvlgqskrv dfcgkgyhlm sfpqsaphgv vflhvtyvpa qeknfttapa
     1081 ichdgkahfp regvfvsngt hwfvtqrnfy epqiittdnt fvsgncdvvi givnntvydp
     1141 lqpeldsfke eldkyfknht spdvdlgdis ginasvvniq keidrlneva knlneslidl
     1201 qelgkyeqyi kwpwyiwlgf iagliaivmv timlccmtsc csclkgccsc gscckfdedd
     1261 sepvlkgvkl hyt
//

感染・伝播性の増加が懸念されるSARS-CoV-2の変異 E484K N501Y

多くの変異が発生するはずのウイルスで、E484KやN501Yの変異は感染性や伝播性の増加が懸念されるとされています。この変異のある場所は、ヒトの細胞に侵入する際にまず結合する分子であるangiotensin-converting enzyme2 (ACE2)との結合に重要だとされています。このあたりを昨年も見た記憶がありますが、変異のウイルスが国内でも報告されるようになってきましたので、その変異の起こる部分が立体的にどういう位置にあたるのか、SARS-CoV-2 SpikeとAEC2が結合してる立体構造を調べたデータの公開データを元に見てみました。まずは野生型のSpikeで示します。緑色のモコモコしたのが変異すると悪い性質を獲得するのではないかと心配されている場所のアミノ酸残基を示します。(下図)

上図の当該のアミノ酸残基を、変異したアミノ酸残基に置き換えた図もしめします。(下図)側鎖のエネルギーだけ小さくなるように調整はしましたが、示された構造全体は動かない設定ですので本当にこの形になっているとは期待できません。

その変異部分の拡大図です(下図)

 

E484Kは荷電が反転する

アミノ酸の基本的な分類に荷電の陽性・陰性があります。E484Kは484番目のEがKに変異した事を示します。野生型のEは陰性荷電を示す酸性極性側鎖アミノ酸で、一方変異型のKは陽性荷電を示す塩基性アミノ酸です。感染性等が増加する懸念は、荷電が逆転することでACE2への結合に変化が起きると推定されることから来ているものと思われます。また、ワクチンの効果が減弱するという懸念もあります。この懸念は、ワクチンの効果が結合領域(328-533aa)に対する抗体によるところがあって、この変異が結合領域の中心付近の484aaに存在している点に加えて、荷電が逆転することで抗体の結合にも変化が起きると推定されるところからきているのではないかと思います。

ちなみに基礎知識としてアミノ酸側鎖の性質と、略号をまとめた物をコールドスプリングハーバー(CSH)の実験プロトコール集のような書籍のMolecula Cloning a laboratory manual volume 3から抜粋です。E (Glu)がAcidic groupで、K(Lys)がBasic groupとなっています。

cBioPortal を使ってみた〜遺伝子変異を表示してみた

cBioPortalとは何か

cBioPortal for Cancer Genomicsとは何か、という問いについてはオリジナルのサイトをみていただくのが速いのでしょう。公開された遺伝子関連情報(変異情報、遺伝子発現情報、臨床情報他)と解析ツールを組み合わせたもの、というのが私の理解です。これを使って何が判るのか、ということを少し触ってみましたので、メモしてゆきます。

今回はまず第一弾として遺伝子変異にかかる情報を表示してみました。

データセットの選択

cBioPortalでは解析しやすい形で格納されたデータが提供されています。今回はとりあえずこの提供されたデータを表示することにします。次の図はcBioPortalのトップページです。

  1. Pan Cancerのなかの、MSK-IMPACT clinical sequencing cohortのファイルのチェックボックスをクリックして選択します。
  2.  下のほうにある「Query By Gene」ボタンをクリックします。

表示する遺伝子の選択

上記でボタンをクリックすると推移する画面が次です。

  1. Enter Genes: のボックス内に遺伝子名(HUGO gene nomenclature)で入力します。今回はERBB2と入力しています。個人的にはHER2 (erb-b2 receptor tyrosine kinase 2)という名前で、Gefitinibの標的として親しんできた遺伝子ですが、HUGO gene nomenclatureではERBB2というシンボルです。
  2. 「Submit Query」  ボタンをクリックします。

まずは概要が表示されます

上記でクリックしてしばらくすると表示される画面が次の通りです。

この画面はOnco Printというタブの情報が示されています。赤くて太いラインが目に入ります。下のレジェンドをみますと、これはgene amplificationを示しています。この図もよく見るといろいろな情報があります。解析対象の症例の7%の症例に何らかの変異がある、あるいは、解析対象のサンプルの7%のサンプルに何らかの異常があること、ドライバー変異もあれば、意義が不明の変異もあることも示されています。点変異の様なものもあれば他の遺伝子への融合や途中で翻訳が終わるtruncationになる変異もあります。

がん種ごとの情報を見るには

  1. 「Cancer Types Summary」タブをクリックして、がん種ごとの変異情報を表示します

変異の頻度が比較的多いのが食道癌で、Amplificationの頻度が多い様です。

遺伝子のどこに変異が多いか

「Mutation」タブをクリックすると次の画面になります。

この画面では、遺伝子の中のどこに変異があるのか、ある場合は頻度も見て取れます。また、遺伝子の各ドメインが表示されています。たとえば、図の中で飛び出して目立っている、S310F/Yは310 番目のセリンがフェニルアラニンやタイロシンに変わる変異が報告されていることを示しています。その変異がある場所が翻訳後の蛋白質としてはFurin-likeドメインに存在することもわかります。そして、高い位置に丸があるのはその変異の頻度が多いことを示しています。この緑の丸をクリックすると、下の症例リストも変化します。

上図の状態で、右中程にあります虫メガネのアイコンのボックスに「lung」と入力してみますと、肺がんの情報に書き換えられます。(他のがん種の情報を除いた形で表示されます。)

全がん種の情報では変異の頻度が高かった310番目のアミノ酸残基の変異は目立たなくなりまして、代わりにY772_A775 dupという変異の頻度が目立っています。この変異があるのはタイロシンリン酸化酵素ドメインと呼ばれる部分になります。この変異をクリックして置いて、下の症例リストのアノテーションのアイコンにマウスをオーバーする(クリックはしない)と、この変異がhot spotにある事や、oncogenicの変異であることが表示されます。

虫メガネアイコンにBreastと入れて見ると今度は乳がんでの情報が表示されます。若干見た目は代わりますが、乳がんも肺がん同様に、タイロシンリン酸化酵素ドメインでの変異が多いことがわかります。一方、bladderと入力しますと、細胞外ドメインの変異が多く、細胞内のタイロシンリン酸化酵素ドメインの変異が相対的に少ないことがわかります。

今度は右側の「view 3D structure」ボタンを押してみます。

PDB chains のあたりにマウスを持ってくると、PDBのどの立体構造情報で表示するかを選ぶことができる様になります。上図は一番上の行の右側(C末端側)の四角をクリックした状態です。右側の窓に立体構造が表示されまして、これをくりくり回したり拡大縮小して表示したりすることができます。グレーの中に緑やエンジの着色がなされている場所は変異が報告されている場所を示します。

他にも、機能がついていますがとりあえず変異に関しての面白そうな機能はこんなところです。

Full genome sequence of SARS-Cov-2

ゲノム配列を見てみました

COVID19の原因ウイルスであるSARS-Cov-2のゲノム配列が公開されているのでとりあえず眺めてみました。こういうのは、ちょっと遺伝子を扱う研究的なことをやったことのある人にとっては、元ファイルを見た方が速いんでしょうけど。以前はアクセション番号とか言っていましたが、シーケンスのIDは次の通りです;NCBI Reference Sequence: NC_045512.2

約29.9千塩基とシーケンスは長いのでこのページの下の方に示すとして、主な構造です。GC% 約38%。11種類の遺伝子から12種類の成熟タンパク質が翻訳されると報告されています。上流(5′-末)から順に見ていきます。265塩基の5′-UTRに引き続いて出てくるタンパク質をコードしているとされる配列はORF1abとされています。

gene ORF1ab

 gene            266..21555

大きな遺伝子が設定されています

CDS             join(266..13468,13468..21555)

ココは興味深いところで、13468までのコドンをtta aacと読んでおいて、一塩基分5’側に引き返して、その最後のcを次のコドンの頭と読み替えています。(2度Cを読むような感じ)

13451 gca[A]..caa[Q]..tcg[S]..ttt[F]..tta[L]..aac[N]..ggg[G]..ttt[F]..gcg[A]..gtg[V].. taa[stop] -> 

13451 gca[A]..caa[Q]..tcg[S]..ttt[F]..tta[L]..aac[N]..cgg[R]..gtt[V]..tgc[C]..ggt[G]..gta[V]..agt[S]..gca[A]…

ribosomal_slippage
note="pp1ab; translated by -1 ribosomal frameshift"

と注釈が入っています。リボゾームがスリップして、フレームシフトを起こすようです。この現象は2005年にはコロナウイルスで報告があります。1

ORF1 a/bは大きなペプチドで、複数のたんぱく質(mature protein)をコードしています。その機能は、良く判りません。

gene S

ORF1 a/bに続く遺伝子は「S」 スパイクタンパク質をコードする遺伝子です。このタンパク質がACE2と結合してヒト細胞に侵入するのに大きな役割を担っていると報告されています。

gene            21563..25384
                gene="S"

アミノ酸配列です

/translation="MFVFLVLLPLVSSQCVNLTTRTQLPPAYTNSFTRGVYYPDKVFR
SSVLHSTQDLFLPFFSNVTWFHAIHVSGTNGTKRFDNPVLPFNDGVYFASTEKSNIIR
GWIFGTTLDSKTQSLLIVNNATNVVIKVCEFQFCNDPFLGVYYHKNNKSWMESEFRVY
SSANNCTFEYVSQPFLMDLEGKQGNFKNLREFVFKNIDGYFKIYSKHTPINLVRDLPQ
GFSALEPLVDLPIGINITRFQTLLALHRSYLTPGDSSSGWTAGAAAYYVGYLQPRTFL
LKYNENGTITDAVDCALDPLSETKCTLKSFTVEKGIYQTSNFRVQPTESIVRFPNITN
LCPFGEVFNATRFASVYAWNRKRISNCVADYSVLYNSASFSTFKCYGVSPTKLNDLCF
TNVYADSFVIRGDEVRQIAPGQTGKIADYNYKLPDDFTGCVIAWNSNNLDSKVGGNYN
YLYRLFRKSNLKPFERDISTEIYQAGSTPCNGVEGFNCYFPLQSYGFQPTNGVGYQPY
RVVVLSFELLHAPATVCGPKKSTNLVKNKCVNFNFNGLTGTGVLTESNKKFLPFQQFG
RDIADTTDAVRDPQTLEILDITPCSFGGVSVITPGTNTSNQVAVLYQDVNCTEVPVAI
HADQLTPTWRVYSTGSNVFQTRAGCLIGAEHVNNSYECDIPIGAGICASYQTQTNSPR
RARSVASQSIIAYTMSLGAENSVAYSNNSIAIPTNFTISVTTEILPVSMTKTSVDCTM
YICGDSTECSNLLLQYGSFCTQLNRALTGIAVEQDKNTQEVFAQVKQIYKTPPIKDFG
GFNFSQILPDPSKPSKRSFIEDLLFNKVTLADAGFIKQYGDCLGDIAARDLICAQKFN
GLTVLPPLLTDEMIAQYTSALLAGTITSGWTFGAGAALQIPFAMQMAYRFNGIGVTQN
VLYENQKLIANQFNSAIGKIQDSLSSTASALGKLQDVVNQNAQALNTLVKQLSSNFGA
ISSVLNDILSRLDKVEAEVQIDRLITGRLQSLQTYVTQQLIRAAEIRASANLAATKMS
ECVLGQSKRVDFCGKGYHLMSFPQSAPHGVVFLHVTYVPAQEKNFTTAPAICHDGKAH
FPREGVFVSNGTHWFVTQRNFYEPQIITTDNTFVSGNCDVVIGIVNNTVYDPLQPELD
SFKEELDKYFKNHTSPDVDLGDISGINASVVNIQKEIDRLNEVAKNLNESLIDLQELG
KYEQYIKWPWYIWLGFIAGLIAIVMVTIMLCCMTSCCSCLKGCCSCGSCCKFDEDDSE
PVLKGVKLHYT

ORF3a

Sに続く配列がORF3a

gene            25393..26220
                /gene="ORF3a"

 

gene E

ORF3aに続くのは、SARS-Cov-2 ウイルスの構造タンパク質であるエンベロープをコードする遺伝子です。

gene            26245..26472
                /gene="E"

アミノ酸配列です

/translation="MYSFVSEETGTLIVNSVLLFLAFVVFLLVTLAILTALRLCAYCC
NIVNVSLVKPSFYVYSRVKNLNSSRVPDLLV"

Envelopeにはあまり、面白そうなリガンドが含まれる相同性のある構造が報告されていないようなので、アライメントした結果をここに貼っておきます。

gene M

gene E に続くのは、gene Mです。

gene            26523..27191
                /gene="M"

アミノ酸配列です。

/translation="MADSNGTITVEELKKLLEQWNLVIGFLFLTWICLLQFAYANRNR
FLYIIKLIFLWLLWPVTLACFVLAAVYRINWITGGIAIAMACLVGLMWLSYFIASFRL
FARTRSMWSFNPETNILLNVPLHGTILTRPLLESELVIGAVILRGHLRIAGHHLGRCD
IKDLPKEITVATSRTLSYYKLGASQRVAGDSGFAAYSRYRIGNYKLNTDHSSSSDNIA
LLVQ"

M-proteinで相同性検索すると、リガンドが含まれる構造が8種類あるのですが、既知の構造とSARS-CoV-2のM-proteinで相同性がある範囲が狭いのと、テンプレートのリガンドの位置が気に入らないので、これ以上深追いしないという事で、アライメントを公開します。

ORF6, 7a, 7b, 8

gene Mに続くのは、ORF6, 7a, 7b, 8です。

gene            27202..27387
                /gene="ORF6"
gene            27394..27759
                /gene="ORF7a"
gene            27756..27887
                /gene="ORF7b"
gene            27894..28259
                /gene="ORF8"

 

gene N

ORF 8につづくのは、gene Nで、これはnucleocapsid phosphoproteinをコードします。

gene            28274..29533
                /gene="N"

アミノ酸残基です

/translation="MSDNGPQNQRNAPRITFGGPSDSTGSNQNGERSGARSKQRRPQG
LPNNTASWFTALTQHGKEDLKFPRGQGVPINTNSSPDDQIGYYRRATRRIRGGDGKMK
DLSPRWYFYYLGTGPEAGLPYGANKDGIIWVATEGALNTPKDHIGTRNPANNAAIVLQ
LPQGTTLPKGFYAEGSRGGSQASSRSSSRSRNSSRNSTPGSSRGTSPARMAGNGGDAA
LALLLLDRLNQLESKMSGKGQQQQGQTVTKKSAAEASKKPRQKRTATKAYNVTQAFGR
RGPEQTQGNFGDQELIRQGTDYKHWPQIAQFAPSASAFFGMSRIGMEVTPSGTWLTYT
GAIKLDDKDPNFKDQVILLNKHIDAYKTFPPTEPKKDKKKKADETQALPQRQKKQQTV
TLLPAADLDDFSKQLQQSMSSADSTQA"

 

ORF10

gene Nに続いて出てくる読み枠が最も3′-末のORF10です。

gene            29558..29674
                /gene="ORF10"

これに引き続いて3′-UTR配列が来ます。

 

全配列

ORIGIN      
        1 attaaaggtt tataccttcc caggtaacaa accaaccaac tttcgatctc ttgtagatct
       61 gttctctaaa cgaactttaa aatctgtgtg gctgtcactc ggctgcatgc ttagtgcact
      121 cacgcagtat aattaataac taattactgt cgttgacagg acacgagtaa ctcgtctatc
      181 ttctgcaggc tgcttacggt ttcgtccgtg ttgcagccga tcatcagcac atctaggttt
      241 cgtccgggtg tgaccgaaag gtaagatgga gagccttgtc cctggtttca acgagaaaac
      301 acacgtccaa ctcagtttgc ctgttttaca ggttcgcgac gtgctcgtac gtggctttgg
      361 agactccgtg gaggaggtct tatcagaggc acgtcaacat cttaaagatg gcacttgtgg
      421 cttagtagaa gttgaaaaag gcgttttgcc tcaacttgaa cagccctatg tgttcatcaa
      481 acgttcggat gctcgaactg cacctcatgg tcatgttatg gttgagctgg tagcagaact
      541 cgaaggcatt cagtacggtc gtagtggtga gacacttggt gtccttgtcc ctcatgtggg
      601 cgaaatacca gtggcttacc gcaaggttct tcttcgtaag aacggtaata aaggagctgg
      661 tggccatagt tacggcgccg atctaaagtc atttgactta ggcgacgagc ttggcactga
      721 tccttatgaa gattttcaag aaaactggaa cactaaacat agcagtggtg ttacccgtga
      781 actcatgcgt gagcttaacg gaggggcata cactcgctat gtcgataaca acttctgtgg
      841 ccctgatggc taccctcttg agtgcattaa agaccttcta gcacgtgctg gtaaagcttc
      901 atgcactttg tccgaacaac tggactttat tgacactaag aggggtgtat actgctgccg
      961 tgaacatgag catgaaattg cttggtacac ggaacgttct gaaaagagct atgaattgca
     1021 gacacctttt gaaattaaat tggcaaagaa atttgacacc ttcaatgggg aatgtccaaa
     1081 ttttgtattt cccttaaatt ccataatcaa gactattcaa ccaagggttg aaaagaaaaa
     1141 gcttgatggc tttatgggta gaattcgatc tgtctatcca gttgcgtcac caaatgaatg
     1201 caaccaaatg tgcctttcaa ctctcatgaa gtgtgatcat tgtggtgaaa cttcatggca
     1261 gacgggcgat tttgttaaag ccacttgcga attttgtggc actgagaatt tgactaaaga
     1321 aggtgccact acttgtggtt acttacccca aaatgctgtt gttaaaattt attgtccagc
     1381 atgtcacaat tcagaagtag gacctgagca tagtcttgcc gaataccata atgaatctgg
     1441 cttgaaaacc attcttcgta agggtggtcg cactattgcc tttggaggct gtgtgttctc
     1501 ttatgttggt tgccataaca agtgtgccta ttgggttcca cgtgctagcg ctaacatagg
     1561 ttgtaaccat acaggtgttg ttggagaagg ttccgaaggt cttaatgaca accttcttga
     1621 aatactccaa aaagagaaag tcaacatcaa tattgttggt gactttaaac ttaatgaaga
     1681 gatcgccatt attttggcat ctttttctgc ttccacaagt gcttttgtgg aaactgtgaa
     1741 aggtttggat tataaagcat tcaaacaaat tgttgaatcc tgtggtaatt ttaaagttac
     1801 aaaaggaaaa gctaaaaaag gtgcctggaa tattggtgaa cagaaatcaa tactgagtcc
     1861 tctttatgca tttgcatcag aggctgctcg tgttgtacga tcaattttct cccgcactct
     1921 tgaaactgct caaaattctg tgcgtgtttt acagaaggcc gctataacaa tactagatgg
     1981 aatttcacag tattcactga gactcattga tgctatgatg ttcacatctg atttggctac
     2041 taacaatcta gttgtaatgg cctacattac aggtggtgtt gttcagttga cttcgcagtg
     2101 gctaactaac atctttggca ctgtttatga aaaactcaaa cccgtccttg attggcttga
     2161 agagaagttt aaggaaggtg tagagtttct tagagacggt tgggaaattg ttaaatttat
     2221 ctcaacctgt gcttgtgaaa ttgtcggtgg acaaattgtc acctgtgcaa aggaaattaa
     2281 ggagagtgtt cagacattct ttaagcttgt aaataaattt ttggctttgt gtgctgactc
     2341 tatcattatt ggtggagcta aacttaaagc cttgaattta ggtgaaacat ttgtcacgca
     2401 ctcaaaggga ttgtacagaa agtgtgttaa atccagagaa gaaactggcc tactcatgcc
     2461 tctaaaagcc ccaaaagaaa ttatcttctt agagggagaa acacttccca cagaagtgtt
     2521 aacagaggaa gttgtcttga aaactggtga tttacaacca ttagaacaac ctactagtga
     2581 agctgttgaa gctccattgg ttggtacacc agtttgtatt aacgggctta tgttgctcga
     2641 aatcaaagac acagaaaagt actgtgccct tgcacctaat atgatggtaa caaacaatac
     2701 cttcacactc aaaggcggtg caccaacaaa ggttactttt ggtgatgaca ctgtgataga
     2761 agtgcaaggt tacaagagtg tgaatatcac ttttgaactt gatgaaagga ttgataaagt
     2821 acttaatgag aagtgctctg cctatacagt tgaactcggt acagaagtaa atgagttcgc
     2881 ctgtgttgtg gcagatgctg tcataaaaac tttgcaacca gtatctgaat tacttacacc
     2941 actgggcatt gatttagatg agtggagtat ggctacatac tacttatttg atgagtctgg
     3001 tgagtttaaa ttggcttcac atatgtattg ttctttctac cctccagatg aggatgaaga
     3061 agaaggtgat tgtgaagaag aagagtttga gccatcaact caatatgagt atggtactga
     3121 agatgattac caaggtaaac ctttggaatt tggtgccact tctgctgctc ttcaacctga
     3181 agaagagcaa gaagaagatt ggttagatga tgatagtcaa caaactgttg gtcaacaaga
     3241 cggcagtgag gacaatcaga caactactat tcaaacaatt gttgaggttc aacctcaatt
     3301 agagatggaa cttacaccag ttgttcagac tattgaagtg aatagtttta gtggttattt
     3361 aaaacttact gacaatgtat acattaaaaa tgcagacatt gtggaagaag ctaaaaaggt
     3421 aaaaccaaca gtggttgtta atgcagccaa tgtttacctt aaacatggag gaggtgttgc
     3481 aggagcctta aataaggcta ctaacaatgc catgcaagtt gaatctgatg attacatagc
     3541 tactaatgga ccacttaaag tgggtggtag ttgtgtttta agcggacaca atcttgctaa
     3601 acactgtctt catgttgtcg gcccaaatgt taacaaaggt gaagacattc aacttcttaa
     3661 gagtgcttat gaaaatttta atcagcacga agttctactt gcaccattat tatcagctgg
     3721 tatttttggt gctgacccta tacattcttt aagagtttgt gtagatactg ttcgcacaaa
     3781 tgtctactta gctgtctttg ataaaaatct ctatgacaaa cttgtttcaa gctttttgga
     3841 aatgaagagt gaaaagcaag ttgaacaaaa gatcgctgag attcctaaag aggaagttaa
     3901 gccatttata actgaaagta aaccttcagt tgaacagaga aaacaagatg ataagaaaat
     3961 caaagcttgt gttgaagaag ttacaacaac tctggaagaa actaagttcc tcacagaaaa
     4021 cttgttactt tatattgaca ttaatggcaa tcttcatcca gattctgcca ctcttgttag
     4081 tgacattgac atcactttct taaagaaaga tgctccatat atagtgggtg atgttgttca
     4141 agagggtgtt ttaactgctg tggttatacc tactaaaaag gctggtggca ctactgaaat
     4201 gctagcgaaa gctttgagaa aagtgccaac agacaattat ataaccactt acccgggtca
     4261 gggtttaaat ggttacactg tagaggaggc aaagacagtg cttaaaaagt gtaaaagtgc
     4321 cttttacatt ctaccatcta ttatctctaa tgagaagcaa gaaattcttg gaactgtttc
     4381 ttggaatttg cgagaaatgc ttgcacatgc agaagaaaca cgcaaattaa tgcctgtctg
     4441 tgtggaaact aaagccatag tttcaactat acagcgtaaa tataagggta ttaaaataca
     4501 agagggtgtg gttgattatg gtgctagatt ttacttttac accagtaaaa caactgtagc
     4561 gtcacttatc aacacactta acgatctaaa tgaaactctt gttacaatgc cacttggcta
     4621 tgtaacacat ggcttaaatt tggaagaagc tgctcggtat atgagatctc tcaaagtgcc
     4681 agctacagtt tctgtttctt cacctgatgc tgttacagcg tataatggtt atcttacttc
     4741 ttcttctaaa acacctgaag aacattttat tgaaaccatc tcacttgctg gttcctataa
     4801 agattggtcc tattctggac aatctacaca actaggtata gaatttctta agagaggtga
     4861 taaaagtgta tattacacta gtaatcctac cacattccac ctagatggtg aagttatcac
     4921 ctttgacaat cttaagacac ttctttcttt gagagaagtg aggactatta aggtgtttac
     4981 aacagtagac aacattaacc tccacacgca agttgtggac atgtcaatga catatggaca
     5041 acagtttggt ccaacttatt tggatggagc tgatgttact aaaataaaac ctcataattc
     5101 acatgaaggt aaaacatttt atgttttacc taatgatgac actctacgtg ttgaggcttt
     5161 tgagtactac cacacaactg atcctagttt tctgggtagg tacatgtcag cattaaatca
     5221 cactaaaaag tggaaatacc cacaagttaa tggtttaact tctattaaat gggcagataa
     5281 caactgttat cttgccactg cattgttaac actccaacaa atagagttga agtttaatcc
     5341 acctgctcta caagatgctt attacagagc aagggctggt gaagctgcta acttttgtgc
     5401 acttatctta gcctactgta ataagacagt aggtgagtta ggtgatgtta gagaaacaat
     5461 gagttacttg tttcaacatg ccaatttaga ttcttgcaaa agagtcttga acgtggtgtg
     5521 taaaacttgt ggacaacagc agacaaccct taagggtgta gaagctgtta tgtacatggg
     5581 cacactttct tatgaacaat ttaagaaagg tgttcagata ccttgtacgt gtggtaaaca
     5641 agctacaaaa tatctagtac aacaggagtc accttttgtt atgatgtcag caccacctgc
     5701 tcagtatgaa cttaagcatg gtacatttac ttgtgctagt gagtacactg gtaattacca
     5761 gtgtggtcac tataaacata taacttctaa agaaactttg tattgcatag acggtgcttt
     5821 acttacaaag tcctcagaat acaaaggtcc tattacggat gttttctaca aagaaaacag
     5881 ttacacaaca accataaaac cagttactta taaattggat ggtgttgttt gtacagaaat
     5941 tgaccctaag ttggacaatt attataagaa agacaattct tatttcacag agcaaccaat
     6001 tgatcttgta ccaaaccaac catatccaaa cgcaagcttc gataatttta agtttgtatg
     6061 tgataatatc aaatttgctg atgatttaaa ccagttaact ggttataaga aacctgcttc
     6121 aagagagctt aaagttacat ttttccctga cttaaatggt gatgtggtgg ctattgatta
     6181 taaacactac acaccctctt ttaagaaagg agctaaattg ttacataaac ctattgtttg
     6241 gcatgttaac aatgcaacta ataaagccac gtataaacca aatacctggt gtatacgttg
     6301 tctttggagc acaaaaccag ttgaaacatc aaattcgttt gatgtactga agtcagagga
     6361 cgcgcaggga atggataatc ttgcctgcga agatctaaaa ccagtctctg aagaagtagt
     6421 ggaaaatcct accatacaga aagacgttct tgagtgtaat gtgaaaacta ccgaagttgt
     6481 aggagacatt atacttaaac cagcaaataa tagtttaaaa attacagaag aggttggcca
     6541 cacagatcta atggctgctt atgtagacaa ttctagtctt actattaaga aacctaatga
     6601 attatctaga gtattaggtt tgaaaaccct tgctactcat ggtttagctg ctgttaatag
     6661 tgtcccttgg gatactatag ctaattatgc taagcctttt cttaacaaag ttgttagtac
     6721 aactactaac atagttacac ggtgtttaaa ccgtgtttgt actaattata tgccttattt
     6781 ctttacttta ttgctacaat tgtgtacttt tactagaagt acaaattcta gaattaaagc
     6841 atctatgccg actactatag caaagaatac tgttaagagt gtcggtaaat tttgtctaga
     6901 ggcttcattt aattatttga agtcacctaa tttttctaaa ctgataaata ttataatttg
     6961 gtttttacta ttaagtgttt gcctaggttc tttaatctac tcaaccgctg ctttaggtgt
     7021 tttaatgtct aatttaggca tgccttctta ctgtactggt tacagagaag gctatttgaa
     7081 ctctactaat gtcactattg caacctactg tactggttct ataccttgta gtgtttgtct
     7141 tagtggttta gattctttag acacctatcc ttctttagaa actatacaaa ttaccatttc
     7201 atcttttaaa tgggatttaa ctgcttttgg cttagttgca gagtggtttt tggcatatat
     7261 tcttttcact aggtttttct atgtacttgg attggctgca atcatgcaat tgtttttcag
     7321 ctattttgca gtacatttta ttagtaattc ttggcttatg tggttaataa ttaatcttgt
     7381 acaaatggcc ccgatttcag ctatggttag aatgtacatc ttctttgcat cattttatta
     7441 tgtatggaaa agttatgtgc atgttgtaga cggttgtaat tcatcaactt gtatgatgtg
     7501 ttacaaacgt aatagagcaa caagagtcga atgtacaact attgttaatg gtgttagaag
     7561 gtccttttat gtctatgcta atggaggtaa aggcttttgc aaactacaca attggaattg
     7621 tgttaattgt gatacattct gtgctggtag tacatttatt agtgatgaag ttgcgagaga
     7681 cttgtcacta cagtttaaaa gaccaataaa tcctactgac cagtcttctt acatcgttga
     7741 tagtgttaca gtgaagaatg gttccatcca tctttacttt gataaagctg gtcaaaagac
     7801 ttatgaaaga cattctctct ctcattttgt taacttagac aacctgagag ctaataacac
     7861 taaaggttca ttgcctatta atgttatagt ttttgatggt aaatcaaaat gtgaagaatc
     7921 atctgcaaaa tcagcgtctg tttactacag tcagcttatg tgtcaaccta tactgttact
     7981 agatcaggca ttagtgtctg atgttggtga tagtgcggaa gttgcagtta aaatgtttga
     8041 tgcttacgtt aatacgtttt catcaacttt taacgtacca atggaaaaac tcaaaacact
     8101 agttgcaact gcagaagctg aacttgcaaa gaatgtgtcc ttagacaatg tcttatctac
     8161 ttttatttca gcagctcggc aagggtttgt tgattcagat gtagaaacta aagatgttgt
     8221 tgaatgtctt aaattgtcac atcaatctga catagaagtt actggcgata gttgtaataa
     8281 ctatatgctc acctataaca aagttgaaaa catgacaccc cgtgaccttg gtgcttgtat
     8341 tgactgtagt gcgcgtcata ttaatgcgca ggtagcaaaa agtcacaaca ttgctttgat
     8401 atggaacgtt aaagatttca tgtcattgtc tgaacaacta cgaaaacaaa tacgtagtgc
     8461 tgctaaaaag aataacttac cttttaagtt gacatgtgca actactagac aagttgttaa
     8521 tgttgtaaca acaaagatag cacttaaggg tggtaaaatt gttaataatt ggttgaagca
     8581 gttaattaaa gttacacttg tgttcctttt tgttgctgct attttctatt taataacacc
     8641 tgttcatgtc atgtctaaac atactgactt ttcaagtgaa atcataggat acaaggctat
     8701 tgatggtggt gtcactcgtg acatagcatc tacagatact tgttttgcta acaaacatgc
     8761 tgattttgac acatggttta gccagcgtgg tggtagttat actaatgaca aagcttgccc
     8821 attgattgct gcagtcataa caagagaagt gggttttgtc gtgcctggtt tgcctggcac
     8881 gatattacgc acaactaatg gtgacttttt gcatttctta cctagagttt ttagtgcagt
     8941 tggtaacatc tgttacacac catcaaaact tatagagtac actgactttg caacatcagc
     9001 ttgtgttttg gctgctgaat gtacaatttt taaagatgct tctggtaagc cagtaccata
     9061 ttgttatgat accaatgtac tagaaggttc tgttgcttat gaaagtttac gccctgacac
     9121 acgttatgtg ctcatggatg gctctattat tcaatttcct aacacctacc ttgaaggttc
     9181 tgttagagtg gtaacaactt ttgattctga gtactgtagg cacggcactt gtgaaagatc
     9241 agaagctggt gtttgtgtat ctactagtgg tagatgggta cttaacaatg attattacag
     9301 atctttacca ggagttttct gtggtgtaga tgctgtaaat ttacttacta atatgtttac
     9361 accactaatt caacctattg gtgctttgga catatcagca tctatagtag ctggtggtat
     9421 tgtagctatc gtagtaacat gccttgccta ctattttatg aggtttagaa gagcttttgg
     9481 tgaatacagt catgtagttg cctttaatac tttactattc cttatgtcat tcactgtact
     9541 ctgtttaaca ccagtttact cattcttacc tggtgtttat tctgttattt acttgtactt
     9601 gacattttat cttactaatg atgtttcttt tttagcacat attcagtgga tggttatgtt
     9661 cacaccttta gtacctttct ggataacaat tgcttatatc atttgtattt ccacaaagca
     9721 tttctattgg ttctttagta attacctaaa gagacgtgta gtctttaatg gtgtttcctt
     9781 tagtactttt gaagaagctg cgctgtgcac ctttttgtta aataaagaaa tgtatctaaa
     9841 gttgcgtagt gatgtgctat tacctcttac gcaatataat agatacttag ctctttataa
     9901 taagtacaag tattttagtg gagcaatgga tacaactagc tacagagaag ctgcttgttg
     9961 tcatctcgca aaggctctca atgacttcag taactcaggt tctgatgttc tttaccaacc
    10021 accacaaacc tctatcacct cagctgtttt gcagagtggt tttagaaaaa tggcattccc
    10081 atctggtaaa gttgagggtt gtatggtaca agtaacttgt ggtacaacta cacttaacgg
    10141 tctttggctt gatgacgtag tttactgtcc aagacatgtg atctgcacct ctgaagacat
    10201 gcttaaccct aattatgaag atttactcat tcgtaagtct aatcataatt tcttggtaca
    10261 ggctggtaat gttcaactca gggttattgg acattctatg caaaattgtg tacttaagct
    10321 taaggttgat acagccaatc ctaagacacc taagtataag tttgttcgca ttcaaccagg
    10381 acagactttt tcagtgttag cttgttacaa tggttcacca tctggtgttt accaatgtgc
    10441 tatgaggccc aatttcacta ttaagggttc attccttaat ggttcatgtg gtagtgttgg
    10501 ttttaacata gattatgact gtgtctcttt ttgttacatg caccatatgg aattaccaac
    10561 tggagttcat gctggcacag acttagaagg taacttttat ggaccttttg ttgacaggca
    10621 aacagcacaa gcagctggta cggacacaac tattacagtt aatgttttag cttggttgta
    10681 cgctgctgtt ataaatggag acaggtggtt tctcaatcga tttaccacaa ctcttaatga
    10741 ctttaacctt gtggctatga agtacaatta tgaacctcta acacaagacc atgttgacat
    10801 actaggacct ctttctgctc aaactggaat tgccgtttta gatatgtgtg cttcattaaa
    10861 agaattactg caaaatggta tgaatggacg taccatattg ggtagtgctt tattagaaga
    10921 tgaatttaca ccttttgatg ttgttagaca atgctcaggt gttactttcc aaagtgcagt
    10981 gaaaagaaca atcaagggta cacaccactg gttgttactc acaattttga cttcactttt
    11041 agttttagtc cagagtactc aatggtcttt gttctttttt ttgtatgaaa atgccttttt
    11101 accttttgct atgggtatta ttgctatgtc tgcttttgca atgatgtttg tcaaacataa
    11161 gcatgcattt ctctgtttgt ttttgttacc ttctcttgcc actgtagctt attttaatat
    11221 ggtctatatg cctgctagtt gggtgatgcg tattatgaca tggttggata tggttgatac
    11281 tagtttgtct ggttttaagc taaaagactg tgttatgtat gcatcagctg tagtgttact
    11341 aatccttatg acagcaagaa ctgtgtatga tgatggtgct aggagagtgt ggacacttat
    11401 gaatgtcttg acactcgttt ataaagttta ttatggtaat gctttagatc aagccatttc
    11461 catgtgggct cttataatct ctgttacttc taactactca ggtgtagtta caactgtcat
    11521 gtttttggcc agaggtattg tttttatgtg tgttgagtat tgccctattt tcttcataac
    11581 tggtaataca cttcagtgta taatgctagt ttattgtttc ttaggctatt tttgtacttg
    11641 ttactttggc ctcttttgtt tactcaaccg ctactttaga ctgactcttg gtgtttatga
    11701 ttacttagtt tctacacagg agtttagata tatgaattca cagggactac tcccacccaa
    11761 gaatagcata gatgccttca aactcaacat taaattgttg ggtgttggtg gcaaaccttg
    11821 tatcaaagta gccactgtac agtctaaaat gtcagatgta aagtgcacat cagtagtctt
    11881 actctcagtt ttgcaacaac tcagagtaga atcatcatct aaattgtggg ctcaatgtgt
    11941 ccagttacac aatgacattc tcttagctaa agatactact gaagcctttg aaaaaatggt
    12001 ttcactactt tctgttttgc tttccatgca gggtgctgta gacataaaca agctttgtga
    12061 agaaatgctg gacaacaggg caaccttaca agctatagcc tcagagttta gttcccttcc
    12121 atcatatgca gcttttgcta ctgctcaaga agcttatgag caggctgttg ctaatggtga
    12181 ttctgaagtt gttcttaaaa agttgaagaa gtctttgaat gtggctaaat ctgaatttga
    12241 ccgtgatgca gccatgcaac gtaagttgga aaagatggct gatcaagcta tgacccaaat
    12301 gtataaacag gctagatctg aggacaagag ggcaaaagtt actagtgcta tgcagacaat
    12361 gcttttcact atgcttagaa agttggataa tgatgcactc aacaacatta tcaacaatgc
    12421 aagagatggt tgtgttccct tgaacataat acctcttaca acagcagcca aactaatggt
    12481 tgtcatacca gactataaca catataaaaa tacgtgtgat ggtacaacat ttacttatgc
    12541 atcagcattg tgggaaatcc aacaggttgt agatgcagat agtaaaattg ttcaacttag
    12601 tgaaattagt atggacaatt cacctaattt agcatggcct cttattgtaa cagctttaag
    12661 ggccaattct gctgtcaaat tacagaataa tgagcttagt cctgttgcac tacgacagat
    12721 gtcttgtgct gccggtacta cacaaactgc ttgcactgat gacaatgcgt tagcttacta
    12781 caacacaaca aagggaggta ggtttgtact tgcactgtta tccgatttac aggatttgaa
    12841 atgggctaga ttccctaaga gtgatggaac tggtactatc tatacagaac tggaaccacc
    12901 ttgtaggttt gttacagaca cacctaaagg tcctaaagtg aagtatttat actttattaa
    12961 aggattaaac aacctaaata gaggtatggt acttggtagt ttagctgcca cagtacgtct
    13021 acaagctggt aatgcaacag aagtgcctgc caattcaact gtattatctt tctgtgcttt
    13081 tgctgtagat gctgctaaag cttacaaaga ttatctagct agtgggggac aaccaatcac
    13141 taattgtgtt aagatgttgt gtacacacac tggtactggt caggcaataa cagttacacc
    13201 ggaagccaat atggatcaag aatcctttgg tggtgcatcg tgttgtctgt actgccgttg
    13261 ccacatagat catccaaatc ctaaaggatt ttgtgactta aaaggtaagt atgtacaaat
    13321 acctacaact tgtgctaatg accctgtggg ttttacactt aaaaacacag tctgtaccgt
    13381 ctgcggtatg tggaaaggtt atggctgtag ttgtgatcaa ctccgcgaac ccatgcttca
    13441 gtcagctgat gcacaatcgt ttttaaacgg gtttgcggtg taagtgcagc ccgtcttaca
    13501 ccgtgcggca caggcactag tactgatgtc gtatacaggg cttttgacat ctacaatgat
    13561 aaagtagctg gttttgctaa attcctaaaa actaattgtt gtcgcttcca agaaaaggac
    13621 gaagatgaca atttaattga ttcttacttt gtagttaaga gacacacttt ctctaactac
    13681 caacatgaag aaacaattta taatttactt aaggattgtc cagctgttgc taaacatgac
    13741 ttctttaagt ttagaataga cggtgacatg gtaccacata tatcacgtca acgtcttact
    13801 aaatacacaa tggcagacct cgtctatgct ttaaggcatt ttgatgaagg taattgtgac
    13861 acattaaaag aaatacttgt cacatacaat tgttgtgatg atgattattt caataaaaag
    13921 gactggtatg attttgtaga aaacccagat atattacgcg tatacgccaa cttaggtgaa
    13981 cgtgtacgcc aagctttgtt aaaaacagta caattctgtg atgccatgcg aaatgctggt
    14041 attgttggtg tactgacatt agataatcaa gatctcaatg gtaactggta tgatttcggt
    14101 gatttcatac aaaccacgcc aggtagtgga gttcctgttg tagattctta ttattcattg
    14161 ttaatgccta tattaacctt gaccagggct ttaactgcag agtcacatgt tgacactgac
    14221 ttaacaaagc cttacattaa gtgggatttg ttaaaatatg acttcacgga agagaggtta
    14281 aaactctttg accgttattt taaatattgg gatcagacat accacccaaa ttgtgttaac
    14341 tgtttggatg acagatgcat tctgcattgt gcaaacttta atgttttatt ctctacagtg
    14401 ttcccaccta caagttttgg accactagtg agaaaaatat ttgttgatgg tgttccattt
    14461 gtagtttcaa ctggatacca cttcagagag ctaggtgttg tacataatca ggatgtaaac
    14521 ttacatagct ctagacttag ttttaaggaa ttacttgtgt atgctgctga ccctgctatg
    14581 cacgctgctt ctggtaatct attactagat aaacgcacta cgtgcttttc agtagctgca
    14641 cttactaaca atgttgcttt tcaaactgtc aaacccggta attttaacaa agacttctat
    14701 gactttgctg tgtctaaggg tttctttaag gaaggaagtt ctgttgaatt aaaacacttc
    14761 ttctttgctc aggatggtaa tgctgctatc agcgattatg actactatcg ttataatcta
    14821 ccaacaatgt gtgatatcag acaactacta tttgtagttg aagttgttga taagtacttt
    14881 gattgttacg atggtggctg tattaatgct aaccaagtca tcgtcaacaa cctagacaaa
    14941 tcagctggtt ttccatttaa taaatggggt aaggctagac tttattatga ttcaatgagt
    15001 tatgaggatc aagatgcact tttcgcatat acaaaacgta atgtcatccc tactataact
    15061 caaatgaatc ttaagtatgc cattagtgca aagaatagag ctcgcaccgt agctggtgtc
    15121 tctatctgta gtactatgac caatagacag tttcatcaaa aattattgaa atcaatagcc
    15181 gccactagag gagctactgt agtaattgga acaagcaaat tctatggtgg ttggcacaac
    15241 atgttaaaaa ctgtttatag tgatgtagaa aaccctcacc ttatgggttg ggattatcct
    15301 aaatgtgata gagccatgcc taacatgctt agaattatgg cctcacttgt tcttgctcgc
    15361 aaacatacaa cgtgttgtag cttgtcacac cgtttctata gattagctaa tgagtgtgct
    15421 caagtattga gtgaaatggt catgtgtggc ggttcactat atgttaaacc aggtggaacc
    15481 tcatcaggag atgccacaac tgcttatgct aatagtgttt ttaacatttg tcaagctgtc
    15541 acggccaatg ttaatgcact tttatctact gatggtaaca aaattgccga taagtatgtc
    15601 cgcaatttac aacacagact ttatgagtgt ctctatagaa atagagatgt tgacacagac
    15661 tttgtgaatg agttttacgc atatttgcgt aaacatttct caatgatgat actctctgac
    15721 gatgctgttg tgtgtttcaa tagcacttat gcatctcaag gtctagtggc tagcataaag
    15781 aactttaagt cagttcttta ttatcaaaac aatgttttta tgtctgaagc aaaatgttgg
    15841 actgagactg accttactaa aggacctcat gaattttgct ctcaacatac aatgctagtt
    15901 aaacagggtg atgattatgt gtaccttcct tacccagatc catcaagaat cctaggggcc
    15961 ggctgttttg tagatgatat cgtaaaaaca gatggtacac ttatgattga acggttcgtg
    16021 tctttagcta tagatgctta cccacttact aaacatccta atcaggagta tgctgatgtc
    16081 tttcatttgt acttacaata cataagaaag ctacatgatg agttaacagg acacatgtta
    16141 gacatgtatt ctgttatgct tactaatgat aacacttcaa ggtattggga acctgagttt
    16201 tatgaggcta tgtacacacc gcatacagtc ttacaggctg ttggggcttg tgttctttgc
    16261 aattcacaga cttcattaag atgtggtgct tgcatacgta gaccattctt atgttgtaaa
    16321 tgctgttacg accatgtcat atcaacatca cataaattag tcttgtctgt taatccgtat
    16381 gtttgcaatg ctccaggttg tgatgtcaca gatgtgactc aactttactt aggaggtatg
    16441 agctattatt gtaaatcaca taaaccaccc attagttttc cattgtgtgc taatggacaa
    16501 gtttttggtt tatataaaaa tacatgtgtt ggtagcgata atgttactga ctttaatgca
    16561 attgcaacat gtgactggac aaatgctggt gattacattt tagctaacac ctgtactgaa
    16621 agactcaagc tttttgcagc agaaacgctc aaagctactg aggagacatt taaactgtct
    16681 tatggtattg ctactgtacg tgaagtgctg tctgacagag aattacatct ttcatgggaa
    16741 gttggtaaac ctagaccacc acttaaccga aattatgtct ttactggtta tcgtgtaact
    16801 aaaaacagta aagtacaaat aggagagtac acctttgaaa aaggtgacta tggtgatgct
    16861 gttgtttacc gaggtacaac aacttacaaa ttaaatgttg gtgattattt tgtgctgaca
    16921 tcacatacag taatgccatt aagtgcacct acactagtgc cacaagagca ctatgttaga
    16981 attactggct tatacccaac actcaatatc tcagatgagt tttctagcaa tgttgcaaat
    17041 tatcaaaagg ttggtatgca aaagtattct acactccagg gaccacctgg tactggtaag
    17101 agtcattttg ctattggcct agctctctac tacccttctg ctcgcatagt gtatacagct
    17161 tgctctcatg ccgctgttga tgcactatgt gagaaggcat taaaatattt gcctatagat
    17221 aaatgtagta gaattatacc tgcacgtgct cgtgtagagt gttttgataa attcaaagtg
    17281 aattcaacat tagaacagta tgtcttttgt actgtaaatg cattgcctga gacgacagca
    17341 gatatagttg tctttgatga aatttcaatg gccacaaatt atgatttgag tgttgtcaat
    17401 gccagattac gtgctaagca ctatgtgtac attggcgacc ctgctcaatt acctgcacca
    17461 cgcacattgc taactaaggg cacactagaa ccagaatatt tcaattcagt gtgtagactt
    17521 atgaaaacta taggtccaga catgttcctc ggaacttgtc ggcgttgtcc tgctgaaatt
    17581 gttgacactg tgagtgcttt ggtttatgat aataagctta aagcacataa agacaaatca
    17641 gctcaatgct ttaaaatgtt ttataagggt gttatcacgc atgatgtttc atctgcaatt
    17701 aacaggccac aaataggcgt ggtaagagaa ttccttacac gtaaccctgc ttggagaaaa
    17761 gctgtcttta tttcacctta taattcacag aatgctgtag cctcaaagat tttgggacta
    17821 ccaactcaaa ctgttgattc atcacagggc tcagaatatg actatgtcat attcactcaa
    17881 accactgaaa cagctcactc ttgtaatgta aacagattta atgttgctat taccagagca
    17941 aaagtaggca tactttgcat aatgtctgat agagaccttt atgacaagtt gcaatttaca
    18001 agtcttgaaa ttccacgtag gaatgtggca actttacaag ctgaaaatgt aacaggactc
    18061 tttaaagatt gtagtaaggt aatcactggg ttacatccta cacaggcacc tacacacctc
    18121 agtgttgaca ctaaattcaa aactgaaggt ttatgtgttg acatacctgg catacctaag
    18181 gacatgacct atagaagact catctctatg atgggtttta aaatgaatta tcaagttaat
    18241 ggttacccta acatgtttat cacccgcgaa gaagctataa gacatgtacg tgcatggatt
    18301 ggcttcgatg tcgaggggtg tcatgctact agagaagctg ttggtaccaa tttaccttta
    18361 cagctaggtt tttctacagg tgttaaccta gttgctgtac ctacaggtta tgttgataca
    18421 cctaataata cagatttttc cagagttagt gctaaaccac cgcctggaga tcaatttaaa
    18481 cacctcatac cacttatgta caaaggactt ccttggaatg tagtgcgtat aaagattgta
    18541 caaatgttaa gtgacacact taaaaatctc tctgacagag tcgtatttgt cttatgggca
    18601 catggctttg agttgacatc tatgaagtat tttgtgaaaa taggacctga gcgcacctgt
    18661 tgtctatgtg atagacgtgc cacatgcttt tccactgctt cagacactta tgcctgttgg
    18721 catcattcta ttggatttga ttacgtctat aatccgttta tgattgatgt tcaacaatgg
    18781 ggttttacag gtaacctaca aagcaaccat gatctgtatt gtcaagtcca tggtaatgca
    18841 catgtagcta gttgtgatgc aatcatgact aggtgtctag ctgtccacga gtgctttgtt
    18901 aagcgtgttg actggactat tgaatatcct ataattggtg atgaactgaa gattaatgcg
    18961 gcttgtagaa aggttcaaca catggttgtt aaagctgcat tattagcaga caaattccca
    19021 gttcttcacg acattggtaa ccctaaagct attaagtgtg tacctcaagc tgatgtagaa
    19081 tggaagttct atgatgcaca gccttgtagt gacaaagctt ataaaataga agaattattc
    19141 tattcttatg ccacacattc tgacaaattc acagatggtg tatgcctatt ttggaattgc
    19201 aatgtcgata gatatcctgc taattccatt gtttgtagat ttgacactag agtgctatct
    19261 aaccttaact tgcctggttg tgatggtggc agtttgtatg taaataaaca tgcattccac
    19321 acaccagctt ttgataaaag tgcttttgtt aatttaaaac aattaccatt tttctattac
    19381 tctgacagtc catgtgagtc tcatggaaaa caagtagtgt cagatataga ttatgtacca
    19441 ctaaagtctg ctacgtgtat aacacgttgc aatttaggtg gtgctgtctg tagacatcat
    19501 gctaatgagt acagattgta tctcgatgct tataacatga tgatctcagc tggctttagc
    19561 ttgtgggttt acaaacaatt tgatacttat aacctctgga acacttttac aagacttcag
    19621 agtttagaaa atgtggcttt taatgttgta aataagggac actttgatgg acaacagggt
    19681 gaagtaccag tttctatcat taataacact gtttacacaa aagttgatgg tgttgatgta
    19741 gaattgtttg aaaataaaac aacattacct gttaatgtag catttgagct ttgggctaag
    19801 cgcaacatta aaccagtacc agaggtgaaa atactcaata atttgggtgt ggacattgct
    19861 gctaatactg tgatctggga ctacaaaaga gatgctccag cacatatatc tactattggt
    19921 gtttgttcta tgactgacat agccaagaaa ccaactgaaa cgatttgtgc accactcact
    19981 gtcttttttg atggtagagt tgatggtcaa gtagacttat ttagaaatgc ccgtaatggt
    20041 gttcttatta cagaaggtag tgttaaaggt ttacaaccat ctgtaggtcc caaacaagct
    20101 agtcttaatg gagtcacatt aattggagaa gccgtaaaaa cacagttcaa ttattataag
    20161 aaagttgatg gtgttgtcca acaattacct gaaacttact ttactcagag tagaaattta
    20221 caagaattta aacccaggag tcaaatggaa attgatttct tagaattagc tatggatgaa
    20281 ttcattgaac ggtataaatt agaaggctat gccttcgaac atatcgttta tggagatttt
    20341 agtcatagtc agttaggtgg tttacatcta ctgattggac tagctaaacg ttttaaggaa
    20401 tcaccttttg aattagaaga ttttattcct atggacagta cagttaaaaa ctatttcata
    20461 acagatgcgc aaacaggttc atctaagtgt gtgtgttctg ttattgattt attacttgat
    20521 gattttgttg aaataataaa atcccaagat ttatctgtag tttctaaggt tgtcaaagtg
    20581 actattgact atacagaaat ttcatttatg ctttggtgta aagatggcca tgtagaaaca
    20641 ttttacccaa aattacaatc tagtcaagcg tggcaaccgg gtgttgctat gcctaatctt
    20701 tacaaaatgc aaagaatgct attagaaaag tgtgaccttc aaaattatgg tgatagtgca
    20761 acattaccta aaggcataat gatgaatgtc gcaaaatata ctcaactgtg tcaatattta
    20821 aacacattaa cattagctgt accctataat atgagagtta tacattttgg tgctggttct
    20881 gataaaggag ttgcaccagg tacagctgtt ttaagacagt ggttgcctac gggtacgctg
    20941 cttgtcgatt cagatcttaa tgactttgtc tctgatgcag attcaacttt gattggtgat
    21001 tgtgcaactg tacatacagc taataaatgg gatctcatta ttagtgatat gtacgaccct
    21061 aagactaaaa atgttacaaa agaaaatgac tctaaagagg gttttttcac ttacatttgt
    21121 gggtttatac aacaaaagct agctcttgga ggttccgtgg ctataaagat aacagaacat
    21181 tcttggaatg ctgatcttta taagctcatg ggacacttcg catggtggac agcctttgtt
    21241 actaatgtga atgcgtcatc atctgaagca tttttaattg gatgtaatta tcttggcaaa
    21301 ccacgcgaac aaatagatgg ttatgtcatg catgcaaatt acatattttg gaggaataca
    21361 aatccaattc agttgtcttc ctattcttta tttgacatga gtaaatttcc ccttaaatta
    21421 aggggtactg ctgttatgtc tttaaaagaa ggtcaaatca atgatatgat tttatctctt
    21481 cttagtaaag gtagacttat aattagagaa aacaacagag ttgttatttc tagtgatgtt
    21541 cttgttaaca actaaacgaa caatgtttgt ttttcttgtt ttattgccac tagtctctag
    21601 tcagtgtgtt aatcttacaa ccagaactca attaccccct gcatacacta attctttcac
    21661 acgtggtgtt tattaccctg acaaagtttt cagatcctca gttttacatt caactcagga
    21721 cttgttctta cctttctttt ccaatgttac ttggttccat gctatacatg tctctgggac
    21781 caatggtact aagaggtttg ataaccctgt cctaccattt aatgatggtg tttattttgc
    21841 ttccactgag aagtctaaca taataagagg ctggattttt ggtactactt tagattcgaa
    21901 gacccagtcc ctacttattg ttaataacgc tactaatgtt gttattaaag tctgtgaatt
    21961 tcaattttgt aatgatccat ttttgggtgt ttattaccac aaaaacaaca aaagttggat
    22021 ggaaagtgag ttcagagttt attctagtgc gaataattgc acttttgaat atgtctctca
    22081 gccttttctt atggaccttg aaggaaaaca gggtaatttc aaaaatctta gggaatttgt
    22141 gtttaagaat attgatggtt attttaaaat atattctaag cacacgccta ttaatttagt
    22201 gcgtgatctc cctcagggtt tttcggcttt agaaccattg gtagatttgc caataggtat
    22261 taacatcact aggtttcaaa ctttacttgc tttacataga agttatttga ctcctggtga
    22321 ttcttcttca ggttggacag ctggtgctgc agcttattat gtgggttatc ttcaacctag
    22381 gacttttcta ttaaaatata atgaaaatgg aaccattaca gatgctgtag actgtgcact
    22441 tgaccctctc tcagaaacaa agtgtacgtt gaaatccttc actgtagaaa aaggaatcta
    22501 tcaaacttct aactttagag tccaaccaac agaatctatt gttagatttc ctaatattac
    22561 aaacttgtgc ccttttggtg aagtttttaa cgccaccaga tttgcatctg tttatgcttg
    22621 gaacaggaag agaatcagca actgtgttgc tgattattct gtcctatata attccgcatc
    22681 attttccact tttaagtgtt atggagtgtc tcctactaaa ttaaatgatc tctgctttac
    22741 taatgtctat gcagattcat ttgtaattag aggtgatgaa gtcagacaaa tcgctccagg
    22801 gcaaactgga aagattgctg attataatta taaattacca gatgatttta caggctgcgt
    22861 tatagcttgg aattctaaca atcttgattc taaggttggt ggtaattata attacctgta
    22921 tagattgttt aggaagtcta atctcaaacc ttttgagaga gatatttcaa ctgaaatcta
    22981 tcaggccggt agcacacctt gtaatggtgt tgaaggtttt aattgttact ttcctttaca
    23041 atcatatggt ttccaaccca ctaatggtgt tggttaccaa ccatacagag tagtagtact
    23101 ttcttttgaa cttctacatg caccagcaac tgtttgtgga cctaaaaagt ctactaattt
    23161 ggttaaaaac aaatgtgtca atttcaactt caatggttta acaggcacag gtgttcttac
    23221 tgagtctaac aaaaagtttc tgcctttcca acaatttggc agagacattg ctgacactac
    23281 tgatgctgtc cgtgatccac agacacttga gattcttgac attacaccat gttcttttgg
    23341 tggtgtcagt gttataacac caggaacaaa tacttctaac caggttgctg ttctttatca
    23401 ggatgttaac tgcacagaag tccctgttgc tattcatgca gatcaactta ctcctacttg
    23461 gcgtgtttat tctacaggtt ctaatgtttt tcaaacacgt gcaggctgtt taataggggc
    23521 tgaacatgtc aacaactcat atgagtgtga catacccatt ggtgcaggta tatgcgctag
    23581 ttatcagact cagactaatt ctcctcggcg ggcacgtagt gtagctagtc aatccatcat
    23641 tgcctacact atgtcacttg gtgcagaaaa ttcagttgct tactctaata actctattgc
    23701 catacccaca aattttacta ttagtgttac cacagaaatt ctaccagtgt ctatgaccaa
    23761 gacatcagta gattgtacaa tgtacatttg tggtgattca actgaatgca gcaatctttt
    23821 gttgcaatat ggcagttttt gtacacaatt aaaccgtgct ttaactggaa tagctgttga
    23881 acaagacaaa aacacccaag aagtttttgc acaagtcaaa caaatttaca aaacaccacc
    23941 aattaaagat tttggtggtt ttaatttttc acaaatatta ccagatccat caaaaccaag
    24001 caagaggtca tttattgaag atctactttt caacaaagtg acacttgcag atgctggctt
    24061 catcaaacaa tatggtgatt gccttggtga tattgctgct agagacctca tttgtgcaca
    24121 aaagtttaac ggccttactg ttttgccacc tttgctcaca gatgaaatga ttgctcaata
    24181 cacttctgca ctgttagcgg gtacaatcac ttctggttgg acctttggtg caggtgctgc
    24241 attacaaata ccatttgcta tgcaaatggc ttataggttt aatggtattg gagttacaca
    24301 gaatgttctc tatgagaacc aaaaattgat tgccaaccaa tttaatagtg ctattggcaa
    24361 aattcaagac tcactttctt ccacagcaag tgcacttgga aaacttcaag atgtggtcaa
    24421 ccaaaatgca caagctttaa acacgcttgt taaacaactt agctccaatt ttggtgcaat
    24481 ttcaagtgtt ttaaatgata tcctttcacg tcttgacaaa gttgaggctg aagtgcaaat
    24541 tgataggttg atcacaggca gacttcaaag tttgcagaca tatgtgactc aacaattaat
    24601 tagagctgca gaaatcagag cttctgctaa tcttgctgct actaaaatgt cagagtgtgt
    24661 acttggacaa tcaaaaagag ttgatttttg tggaaagggc tatcatctta tgtccttccc
    24721 tcagtcagca cctcatggtg tagtcttctt gcatgtgact tatgtccctg cacaagaaaa
    24781 gaacttcaca actgctcctg ccatttgtca tgatggaaaa gcacactttc ctcgtgaagg
    24841 tgtctttgtt tcaaatggca cacactggtt tgtaacacaa aggaattttt atgaaccaca
    24901 aatcattact acagacaaca catttgtgtc tggtaactgt gatgttgtaa taggaattgt
    24961 caacaacaca gtttatgatc ctttgcaacc tgaattagac tcattcaagg aggagttaga
    25021 taaatatttt aagaatcata catcaccaga tgttgattta ggtgacatct ctggcattaa
    25081 tgcttcagtt gtaaacattc aaaaagaaat tgaccgcctc aatgaggttg ccaagaattt
    25141 aaatgaatct ctcatcgatc tccaagaact tggaaagtat gagcagtata taaaatggcc
    25201 atggtacatt tggctaggtt ttatagctgg cttgattgcc atagtaatgg tgacaattat
    25261 gctttgctgt atgaccagtt gctgtagttg tctcaagggc tgttgttctt gtggatcctg
    25321 ctgcaaattt gatgaagacg actctgagcc agtgctcaaa ggagtcaaat tacattacac
    25381 ataaacgaac ttatggattt gtttatgaga atcttcacaa ttggaactgt aactttgaag
    25441 caaggtgaaa tcaaggatgc tactccttca gattttgttc gcgctactgc aacgataccg
    25501 atacaagcct cactcccttt cggatggctt attgttggcg ttgcacttct tgctgttttt
    25561 cagagcgctt ccaaaatcat aaccctcaaa aagagatggc aactagcact ctccaagggt
    25621 gttcactttg tttgcaactt gctgttgttg tttgtaacag tttactcaca ccttttgctc
    25681 gttgctgctg gccttgaagc cccttttctc tatctttatg ctttagtcta cttcttgcag
    25741 agtataaact ttgtaagaat aataatgagg ctttggcttt gctggaaatg ccgttccaaa
    25801 aacccattac tttatgatgc caactatttt ctttgctggc atactaattg ttacgactat
    25861 tgtatacctt acaatagtgt aacttcttca attgtcatta cttcaggtga tggcacaaca
    25921 agtcctattt ctgaacatga ctaccagatt ggtggttata ctgaaaaatg ggaatctgga
    25981 gtaaaagact gtgttgtatt acacagttac ttcacttcag actattacca gctgtactca
    26041 actcaattga gtacagacac tggtgttgaa catgttacct tcttcatcta caataaaatt
    26101 gttgatgagc ctgaagaaca tgtccaaatt cacacaatcg acggttcatc cggagttgtt
    26161 aatccagtaa tggaaccaat ttatgatgaa ccgacgacga ctactagcgt gcctttgtaa
    26221 gcacaagctg atgagtacga acttatgtac tcattcgttt cggaagagac aggtacgtta
    26281 atagttaata gcgtacttct ttttcttgct ttcgtggtat tcttgctagt tacactagcc
    26341 atccttactg cgcttcgatt gtgtgcgtac tgctgcaata ttgttaacgt gagtcttgta
    26401 aaaccttctt tttacgttta ctctcgtgtt aaaaatctga attcttctag agttcctgat
    26461 cttctggtct aaacgaacta aatattatat tagtttttct gtttggaact ttaattttag
    26521 ccatggcaga ttccaacggt actattaccg ttgaagagct taaaaagctc cttgaacaat
    26581 ggaacctagt aataggtttc ctattcctta catggatttg tcttctacaa tttgcctatg
    26641 ccaacaggaa taggtttttg tatataatta agttaatttt cctctggctg ttatggccag
    26701 taactttagc ttgttttgtg cttgctgctg tttacagaat aaattggatc accggtggaa
    26761 ttgctatcgc aatggcttgt cttgtaggct tgatgtggct cagctacttc attgcttctt
    26821 tcagactgtt tgcgcgtacg cgttccatgt ggtcattcaa tccagaaact aacattcttc
    26881 tcaacgtgcc actccatggc actattctga ccagaccgct tctagaaagt gaactcgtaa
    26941 tcggagctgt gatccttcgt ggacatcttc gtattgctgg acaccatcta ggacgctgtg
    27001 acatcaagga cctgcctaaa gaaatcactg ttgctacatc acgaacgctt tcttattaca
    27061 aattgggagc ttcgcagcgt gtagcaggtg actcaggttt tgctgcatac agtcgctaca
    27121 ggattggcaa ctataaatta aacacagacc attccagtag cagtgacaat attgctttgc
    27181 ttgtacagta agtgacaaca gatgtttcat ctcgttgact ttcaggttac tatagcagag
    27241 atattactaa ttattatgag gacttttaaa gtttccattt ggaatcttga ttacatcata
    27301 aacctcataa ttaaaaattt atctaagtca ctaactgaga ataaatattc tcaattagat
    27361 gaagagcaac caatggagat tgattaaacg aacatgaaaa ttattctttt cttggcactg
    27421 ataacactcg ctacttgtga gctttatcac taccaagagt gtgttagagg tacaacagta
    27481 cttttaaaag aaccttgctc ttctggaaca tacgagggca attcaccatt tcatcctcta
    27541 gctgataaca aatttgcact gacttgcttt agcactcaat ttgcttttgc ttgtcctgac
    27601 ggcgtaaaac acgtctatca gttacgtgcc agatcagttt cacctaaact gttcatcaga
    27661 caagaggaag ttcaagaact ttactctcca atttttctta ttgttgcggc aatagtgttt
    27721 ataacacttt gcttcacact caaaagaaag acagaatgat tgaactttca ttaattgact
    27781 tctatttgtg ctttttagcc tttctgctat tccttgtttt aattatgctt attatctttt
    27841 ggttctcact tgaactgcaa gatcataatg aaacttgtca cgcctaaacg aacatgaaat
    27901 ttcttgtttt cttaggaatc atcacaactg tagctgcatt tcaccaagaa tgtagtttac
    27961 agtcatgtac tcaacatcaa ccatatgtag ttgatgaccc gtgtcctatt cacttctatt
    28021 ctaaatggta tattagagta ggagctagaa aatcagcacc tttaattgaa ttgtgcgtgg
    28081 atgaggctgg ttctaaatca cccattcagt acatcgatat cggtaattat acagtttcct
    28141 gtttaccttt tacaattaat tgccaggaac ctaaattggg tagtcttgta gtgcgttgtt
    28201 cgttctatga agacttttta gagtatcatg acgttcgtgt tgttttagat ttcatctaaa
    28261 cgaacaaact aaaatgtctg ataatggacc ccaaaatcag cgaaatgcac cccgcattac
    28321 gtttggtgga ccctcagatt caactggcag taaccagaat ggagaacgca gtggggcgcg
    28381 atcaaaacaa cgtcggcccc aaggtttacc caataatact gcgtcttggt tcaccgctct
    28441 cactcaacat ggcaaggaag accttaaatt ccctcgagga caaggcgttc caattaacac
    28501 caatagcagt ccagatgacc aaattggcta ctaccgaaga gctaccagac gaattcgtgg
    28561 tggtgacggt aaaatgaaag atctcagtcc aagatggtat ttctactacc taggaactgg
    28621 gccagaagct ggacttccct atggtgctaa caaagacggc atcatatggg ttgcaactga
    28681 gggagccttg aatacaccaa aagatcacat tggcacccgc aatcctgcta acaatgctgc
    28741 aatcgtgcta caacttcctc aaggaacaac attgccaaaa ggcttctacg cagaagggag
    28801 cagaggcggc agtcaagcct cttctcgttc ctcatcacgt agtcgcaaca gttcaagaaa
    28861 ttcaactcca ggcagcagta ggggaacttc tcctgctaga atggctggca atggcggtga
    28921 tgctgctctt gctttgctgc tgcttgacag attgaaccag cttgagagca aaatgtctgg
    28981 taaaggccaa caacaacaag gccaaactgt cactaagaaa tctgctgctg aggcttctaa
    29041 gaagcctcgg caaaaacgta ctgccactaa agcatacaat gtaacacaag ctttcggcag
    29101 acgtggtcca gaacaaaccc aaggaaattt tggggaccag gaactaatca gacaaggaac
    29161 tgattacaaa cattggccgc aaattgcaca atttgccccc agcgcttcag cgttcttcgg
    29221 aatgtcgcgc attggcatgg aagtcacacc ttcgggaacg tggttgacct acacaggtgc
    29281 catcaaattg gatgacaaag atccaaattt caaagatcaa gtcattttgc tgaataagca
    29341 tattgacgca tacaaaacat tcccaccaac agagcctaaa aaggacaaaa agaagaaggc
    29401 tgatgaaact caagccttac cgcagagaca gaagaaacag caaactgtga ctcttcttcc
    29461 tgctgcagat ttggatgatt tctccaaaca attgcaacaa tccatgagca gtgctgactc
    29521 aactcaggcc taaactcatg cagaccacac aaggcagatg ggctatataa acgttttcgc
    29581 ttttccgttt acgatatata gtctactctt gtgcagaatg aattctcgta actacatagc
    29641 acaagtagat gtagttaact ttaatctcac atagcaatct ttaatcagtg tgtaacatta
    29701 gggaggactt gaaagagcca ccacattttc accgaggcca cgcggagtac gatcgagtgt
    29761 acagtgaaca atgctaggga gagctgccta tatggaagag ccctaatgtg taaaattaat
    29821 tttagtagtg ctatccccat gtgattttaa tagcttctta ggagaatgac aaaaaaaaaa
    29881 aaaaaaaaaa aaaaaaaaaa aaa

 

1.
Baranov P, Henderson C, Anderson C, Gesteland R, Atkins J, Howard M. Programmed ribosomal frameshifting in decoding the SARS-CoV genome. Virology. 2005;332(2):498-510. [PubMed]

FDA COVID-19流行下での治験の実施に係るガイダンスを公開

FDAはCOVID-19流行下でのガイダンスを公開

対象

治験依頼者・治験責任医師・IRB

公開日時

2020年3月18日

背景

新型コロナウイルスCOVID-19による感染症が蔓延しつつある。

コロナウイルスに試験施設の人員の感染や被験者の感染などが発生した場合、試験施設の閉鎖、移動制限、治験薬のためのサプライチェーンの障害などが生じうる。このような場合には、プロトコールの変更は避けられない。

COVID-19による影響は、試験中の疾患の特徴、試験デザイン、試験が実施されている地域など多数の要因によって起こりうる。

推奨事項

  • GCP順守を維持し、臨床試験の完全性を損なうリスクを最小化しながら試験参加者の安全性を確保すること

実施中の試験

代替プロセスの実施は可能な限りプロトコールと一致しているべきであり、治験依頼者及び治験責任医師は、実施した不測の措置の理由を文書化すべきである。治験依頼者及び治験責任医師は、COVID-19に関連した制限が、どのように試験実施の変更とその変更の期間につながったのかを文書化し、どの試験参加者が影響を受けたのか、どのように影響を受けたのかを示すべきである。

試験の評価については、電話連絡やバーチャルな訪問などで代替できる方法により実施、また、もはや治験薬や試験サイトにアクセスする必要のない参加者には追加の安全性モニタリングを実施すること

試験の受診スケジュールの変更、欠席、または患者の中止は、情報の欠落につながる可能性がある(例えば、プロトコールで指定された手技の場合)。症例報告書には、欠落したプロトコール指定情報(例えば、COVID-19による試験受診の欠席や試験中止など)のCOVID-19との関係を含め、欠落したデータの根拠を説明する具体的な情報を記載することが重要であろう。臨床試験報告書にまとめられたこの情報は、治験依頼者及びFDAにとって有用である。

臨床現場での予定された診察に大きな影響が出る場合、通常、自己投与で配布されているような特定の治験薬は、代替の安全な投与方法を利用することが可能であるかもしれない。通常、医療環境で投与される他の治験薬については、代替投与(例えば、訓練を受けているが研究者以外 の職員による訪問看護や代替施設など)の計画についてFDAの審査部門に相談することが推奨される。いずれの場合も、治験薬の説明責任を維持するための既存の規制要件は依然として残っており、これに対処し、文書化すべきである。

有効性評価については、可能であれば、バーチャル評価の利用、評価の遅延、研究特異的検体の代替採取等、有効性評価のプロト コルの変更について、適切な審査部門との協議を行うことを推奨する。有効性評価項目が収集されなかった個別の事例については、有効性評価を取得できなかった理由を文書化する(例:COVID-19 によ る具体的な制限事項を明らかにし、プロトコールで指定された評価を実施できなかった理由を明らかにする)。

開始前の試験

治験依頼者、治験責任医師、及び IRB は、試験実施施設における COVID-19 対照措置の結果として試験が中断される可能性がある場合に、試験参加者を保護し、 試験の実施を管理するために使用するアプローチを記述するための方針と手順の確立と実施、又は既存の方針と 手順の改訂を検討すべきである。方針と手順の変更は、インフォームド・コンセントのプロセス、試験の訪問と手順、データ収集、試験のモニ タリング、有害事象の報告、及び渡航制限、検疫措置、または COVID-19 疾病そのものに起因する治験責任医師、治験実施施設のスタッフ、及び/またはモニターの変更への影響に 対処しうるが、これらに限定されるものではない。方針と手順は、COVID-19の管理と管理のために適用される(地域または国の)方針に準拠しているべきである。上記の変更の性質に応じて、適用される規則の下でプロトコルの修正が要求されることがあります。

以上は一部抜粋の情報です。詳細はオリジナルをご参照ください。

ガイダンス(オリジナル)

EMAも治験依頼者向けガイダンスを3月20日付で公開

PMDAも関連のQAを3月30日付で公開

各施設での対応状況(5月14日付)

CDCのサーベイランスアルゴリズム

CDC(Centers for Disease Control and Prevention)

最近安倍総理大臣もこの言葉を覚えた模様で「日本版CDC」をというような使い方がなされています。業界の人にとっては、ガイドラインを出しているのでその周辺でお目にかかることが多いのではないかと思います。私は、1995年公開の映画「アウトブレイク」で初めて耳にしました。1999年に留学したFDAとは、同じHHSの下部組織、つまりFDAとCDCは組織図上は横並びでした。CDCはどういった仕事をしているのでしょうか?業務は多岐にわたります。CDCの仕事を身近に感じたのは、1999年留学した年に、テレビで「鳥の死骸から西ナイルウイルスが検出された」という発表でした。米国には鳥の死骸のウイルス検査をしている行政機関があることに驚きました。その後ニューヨークでは夜間にヘリコプターで住宅街に殺虫剤をまくというプロジェクトが放送されていました。夜間に殺虫剤をまくので窓を閉めて寝るようにという放送がされていました。テレビの放送によると、「人体には無害な殺虫剤をまくが、念のため窓を閉めておくように」という事でした。

次に私が目にしたのは、FDAのCBERと共同してワクチンの副反応を集めて集計している業務です。パピローマウイルスワクチン、いわゆる「子宮頸がんワクチン」を知り合いたちと集計したのを覚えています。当時日本では上市前でしたが、すでに上市されていた米国のデータではStill病のような副反応が報告されているという内容でした。

サーベイランスのアルゴリズム

そして今回の新型コロナウイルス肺炎の騒ぎで、伝染病のサーベイランスと結果次第では早めの対応を日本でもできるようにという事で、「日本版CDC」をという議論が出てきているのだろうと思います。ただ、良く判らないのがその機能を担う機関が日本に全くないのかというとそういう訳でもないように思います。それは、さておき感染症のサーベイランスはどんな風にデータを評価しているのか少し調べてみました。Getting started with outbreak detection (アウトブレイクを検出することから始めよう)という論文によるとCDC algorithmという手法があります。新たに発症した症例数を週ごとに集計して、過去の発症例数と比較して変動の範囲を超えて感染者が増加した場合に、そのシグナルを検出する手法です。どんなふうになるのか、論理的な事や数式が出てきて良く判らなくなるよりは、実際のCOVID-19の日本のデータ(3月10日までの集計)を流し込んでどういったアウトプットが得られるのか、ながめてみることにしました。

とりあえず結果です

図はFarringtonアルゴリズムの出力です。四角い柱で1日ごとの度数が表示されています。右端のピークが3月6日。初めのアラートが1月28日(3例報告の日)。

Rplot

実は、CDCが感染の流行をモニターしているアルゴリズムは週ごとのデータしか解析しないということで、今回のような短期のデータを日ごとで集計しようとするとエラーになりました。そこで教科書にCDCのアルゴリズムと列挙されていましたもう一つのアルゴリズム Farringtonのアルゴリズムで集計してみました。とりあえず、過去50日分の報告件数から、変動の範囲内なのか流行の兆しなのかを計算しているようです。この手法は、日ごろから散発的に報告があるような疾患で、急に増えて流行の兆しではないかというのを早期に発見する目的で使用するのに適している様で、COVID-19の様に全く新しい疾患に対しては、この手法は向いていないように思いました。残念。

A statistical algorithm for the early detection of outbreaks of infectious disease, Farrington, C.P.,Andrews, N.J, Beale A.D. and Catchpole, M.A. (1996), J. R. Statist. Soc. A, 159, 547-563.

https://www.jstor.org/stable/2983331?seq=1


library(“surveillance”)
library(readxl)

X0020_STS <- read_excel(“COVID_STS.xlsx”)

CovidDisProg <- create.disProg(week = X0020_STS$week,
observed = X0020_STS$observed,
state = X0020_STS$state,
start = c(2018, 1),
freq=365,
epochAsDate=TRUE)

#Do surveillance for the last 50 days.
n <- length(CovidDisProg$observed)
#Set control parameters.
control <- list(b=2,w=3,range=(n-50):n,reweight=TRUE, verbose=FALSE,alpha=0.01)
res <- algo.farrington(CovidDisProg,control=control)
#Plot the result.
plot(res,disease=”COVID-19″,method=”Farrington”)

# sts.cdc <- algo.cdc(CovidDisProg, control = control)
# <<<error>>> algo.cdc only works for weekly data.
# plot(sts.cdc, legend.opts=NULL)


使用した集計済ファイル

https://gis.jag-japan.com/covid19jp/?fbclid=IwAR3FWAcLkQvXDTUUMtNwm7qRFhplIxSREML5m-rrPXWzfz7IxVANOBdSeSY

COVID-19 の原因病原体であるコロナウイルスSARS-CoV-2のタンパク質の構造

COVID-19の原因ウイルスであるSARS-CoV-2のMproというタンパク質の構造がPDBに公開されていました。エントリは6LU7。PDBの解説の書き方からすると、このウイルスのタンパク質で他にも構造が決定されている分子があるけれども、(無料で無条件に)公開されているのはこれだけだという様に取れます*1。新しいものを発見したとして、その知財を囲い込んで自分達の金儲けにするというのは20世紀的なアメリカンドリームであって、ものが不足していた頃の考え方で時代遅れでないかと。発見したもので社会の様々な問題を解決したり、世の中を良くする様にというような考え方が広がらないかなぁ。それはさておき、タンパク質の発現にバキュロと昆虫細胞を使った系が多い中、このタンパク質は私が慣れ親しんだBL21(DE3)で発現しています。公開されたものを見てみましょう。(レンダリングは私がしましたが、構造はPDB 6LU7を使用しています)

*1 その後多くの構造が公開されています。ACE2とウイルスのタンパク質の結合についてを別記事に追加しました。(2020.04.11)

SARS-CoV-2コロナウイルス3CLヒドロラーゼ(Mpro)のタンパク質で、登録された構造全体(1分子分)を表示しています。Mpro(白)以外にオリゴペプチド様の阻害薬(薄紫)が一緒に含まれています。

Covid2019A

阻害薬付近が見えやすいように薄切り(Slab)にしてみます。

Covid2019C

両分子間で水素結合がありそうなところを見やすい表示にしてみました。ちゃんとはまり込んでいるような感じになっています。

Covid2019B

PDB newsによると、「PDBアーカイブのエントリーと比較すると、少なくとも90%の配列相同性を持つ蛋白質が95件のPDBエントリーで同定されました。さらに、これらの関連蛋白質構造には、約30個の異なる低分子阻害薬が含まれており、新薬の発見に役立つ可能性があります。」とのこと。それらの阻害薬は治療薬の開発の出発点になるかもしれません。

self-controlled case series (SCCS) – (3)

はじめに

Self-controlled case series (SCCS) の解析方法を試しはじめてしばらく時間が経過しました。その間に、このSCCSを計算するためのRのパッケージが開発されていまして、一見したところ便利そうです。とりあえず、ご多分に漏れず、このパッケージを利用して、過去にやった方法論文1と同じ結果が得られるのか試してみました。

まずはインストール

install("SCCS")

適切なサーバーを選択してインストールが完了するのを待ちます。

読み込みます

library("SCCS")

オックスフォード伯爵のマーチ

以前Observation Islandで試したoxfordデータが,このパッケージではamdatという名前で含まれています。どんな内容か確認してみます。

amdat
   case sta end  am mmr
1     1 366 730 398 458
2     2 366 730 399 750
3     3 366 730 413 392
4     4 366 730 449 429
5     5 366 730 455 433
6     6 366 730 472 432
7     7 366 730 474 395
8     8 366 730 485 470
9     9 366 730 524 496
10   10 366 730 700 428

以前使用したoxfordデータは次の通りです

良く似ているけど微妙に調整が必要そうです

indiv eventday start end exday
1 398 365 730 458
2 413 365 730 392
3 449 365 730 429
4 455 365 730 433
5 472 365 730 432
6 474 365 730 395
7 485 365 730 470
8 524 365 730 496
9 700 365 730 428
10 399 365 730 716

観察の開始日

前回試したoxfordデータでは開始日が365でした。このパッケージのamdatでは366に。うるう年にかかってしまったかな?などと思うのも良いのですが、とりあえず同じデータで開始したいので、試行する間はパラメータを投入する際にこの部分を前回と同じになるように調整。具体的にはスクリプトでパラメータを与える際に、

astart=sta

と与えるべきところを

astart=sta-1

にして調整しました。

症例2のMMR接種日が前回と違う

前回試したoxfordデータでは症例10の接種日は716日目だったのが、今回パッケージ附属のamdatでは同じ症例が「症例2」になっていて,接種日が750日目になっていました。とりあえずここも、前回に合わせておきたいので

amdat[2,5] <- 716

とやります。なんだか、細かい質の部分に齟齬が残っているな。

スクリプト

上記2点の調整を含むスクリプトは次のようになります。


library("SCCS")

amdat[2,5] <- 716
am.mod2 <- standardsccs(event~mmr+age, indiv=case, astart=sta-1,
aend=end, aevent=am, adrug=mmr, aedrug=mmr+35,
expogrp=15, agegrp=547, data=amdat)
am.mod2

実行結果

解りにくいかもしれませんが、mmrのオッズ比が12.037 (95%CI, 3.00226, 48.259)となりました。

 

次に示すのが論文で掲載された結果です。今回の集計結果と論文の結果で、小数点以下2桁くらいまでは一致しています。誤差範囲と考えられますので、今回試したRのSCCSパッケージが思ったように機能することが確認できました。投入する前のデータさえきちんとしていたら、使えそうだという印象を持ちました。

 

reference

1.
Whitaker H, Farrington C, Spiessens B, Musonda P. Tutorial in biostatistics: the self-controlled case series method. Stat Med. 2006;25(10):1768-1797. [PubMed]

インフルエンザ治療薬に耐性のインフルエンザウイルスのキャップ依存性エンドヌクレアーゼ

耐性ウイルス

新規インフルエンザ治療薬に耐性を持つというウイルスが、その新規治療薬を使用した患者さんから検出されたという事で、2018.1.25にニュースが流れました。その治療薬は、キャップ依存性エンドヌクレアーゼ (cap-dependent endonuclease) 阻害薬で、一般名バロキサビルマルボキシル (baloxavir marboxil) と呼ばれる医薬品です。ニュースではどういった検査をして「耐性」を確定したかは述べられていませんでした。ソースの情報によるとターゲット分子であるキャップ依存性エンドヌクレアーゼの変異であるPA I38T、I38F等を監視していることが述べられています。これらの変異はNCBIのデータベースに以前より存在していますので、普通に世の中にいるウイルスが持っていた変異だろうと思われます。そして、治験時には10%弱の被験者にこの変異が見られました。治験の情報によりますと、この変異を持っているウイルスにかかった被験者では、治療5日目、9日目にウイルスが検出された割合が野生型のウイルスにかかった被験者より高くなりました。1

この治験データで少し目に留まるのは、プラセボ治療群より変異ウイルスに対する実薬治療群の方がウイルスが検出される被験者の割合が高くなる様に見える点です。力価のグラフを見ていると、耐性ウイルスは一旦力価が低下した後、6日目あたりに再び力価が上昇するようなカーブを描いて見えます。これらのデータが、臨床的に深刻な問題なのかは何とも言えません。詳しく知りたい方は原著1販売メーカーの資材を見てご検討ください。

PAに耐性変異があると医薬品が全くPAと相互作用しないのか?

PA分子の結晶構造が公開されています2ので、これを利用し耐性のメカニズムに迫る。とか言うたいそうな話ではなく、とりあえず眺めてみました。黄色がbaloxavir acidです。(医薬品のbaloxavir marboxilとは、若干構造が違います)青が活性中心付近に側鎖を出しているアミノ酸残基。そして、ピンクが変異がある場所です。

野生型構造

PA I38T の耐性を有する構造

I38Tの変異があっても、作用点にbaloxavir acidが一見きちんとハマっているようです。水素結合を作っているであろう原子間の距離が微妙に違うので、ファンデルワールス力が違い、結合の強さに差が出るのかもしれません。科学的に厳密なディスカッションは、論文2をご確認ください。

お遊びで、いつもより多めに回してみました。

1.
Hayden F, Sugaya N, Hirotsu N, et al. Baloxavir Marboxil for Uncomplicated Influenza in Adults and Adolescents. N Engl J Med. 2018;379(10):913-923. [PubMed]
2.
Omoto S, Speranzini V, Hashimoto T, et al. Characterization of influenza virus variants induced by treatment with the endonuclease inhibitor baloxavir marboxil. Sci Rep. 2018;8(1):9633. [PubMed]

血管内皮増殖因子(Vascular Endothelial Growth Factor:VEGF)シグナル阻害薬と大動脈解離が相関していることが示唆されました

国内の副作用データベースであるJADERを用いた解析の結果を論文として公表しました。この論文は2017年に公表したもので、ごく最近出版という訳ではありません。出版された際に著者には無料で見ることのできるリンクが提供されています。そのリンクは個人で楽しむ目的で使用するものと思っていましたが、Circulationのインストラクションを読んでいましたところ、自身のホームページにリンクを張ることが許可されている事が判明しました。ですので、個人ブログにそのリンクを張ります。
…Circulation誌のインストラクション Q&Aパート…
QCan I post my article on the Internet?
A—Corresponding authors will receive “toll-free” links to their published article. This URL can be placed on an author’s personal or institutional web site. Those who click on the link will be able to access the article as it published online in the AHA journal (with or without a subscription). Should coauthors or colleagues be interested in viewing the article for their own use, authors may provide them with the URL; a copy of the article may not be forwarded electronically.

<http://circ.ahajournals.org/content/135/8/815>
Yasuo Oshima, Tetsuya Tanimoto, Koichiro Yuji, Arinobu TojoAssociation Between Aortic Dissection and Systemic Exposure of Vascular Endothelial Growth Factor Pathway Inhibitors in the Japanese Adverse Drug Event Report Database 

https://doi.org/10.1161/CIRCULATIONAHA.116.025144
Circulation. 2017;135:815-817Originally published February 21, 2017

医薬品副作用報告のアンダーレポーティング

Under-reporting of adverse drug reactions

アンダーレポーティングとは

市販後の副作用報告データベースを解析して、副作用を研究するにあたって、意識しておくべき問題の一つに、アンダーレポーティングがあります。医薬品を製造販売する企業は、その医薬品の副作用情報を知った際には、一定の基準に該当する場合には、設定された期限内に規制当局へ報告することが義務付けられています。(一定の基準とは、自社の医薬品と有害事象の間に因果関係がある、有害事象が重篤である、の2点です。このほかに、「噂(うわさ)」ではなく、副作用を起こしたとされる患者が実在すること、医療目的で使用された医薬品であること、国内で使用された医薬品であることなど周辺の手続き的なコンディションが若干あります。)これに対して、医療現場の主プレーヤーである医師には、「保健衛生上の危害の発生又は拡大を防止するため必要があると認めるとき(薬機法68条の10-2)」に限って当該副作用を報告するように義務付けられています。もちろん、治験や臨床研究で一定基準のものを、どこかへ報告するように定めた契約が存在する場合には、その契約に基づく義務が発生します。

企業で副作用の仕事をしていると、規制当局であるPMDAの査察の際に厳しくチェックされるため、知った副作用情報の報告漏れが無いようにと意識を働かせる動機があります。一方、医師は副作用報告について、発現したものを報告漏れだというような指摘を受ける機会はほとんどなく、実際に発現した副作用を、どこかへ報告するという、動機が働きません。どこへも報告されない副作用が、だれに知られることもなく埋もれてしまう、というようなことも十分想定されます。その、発現しているにもかかわらず、規制当局に報告されない副作用が一定程度存在することをアンダーレポーティングと言っています。

アンダーレポーティングは何が問題なのか

アンダーレポーティングがある事で、規制当局や製造販売元企業がリスクに気づくのに遅れる可能性があります。また、様々な集計の際にしばしば2つ以上の何かを比較します。例えばA薬とB薬を比較する時に、この2つの薬剤で同じ頻度でアンダーレポーティングが起きているという前提がないと厳密になりません。この前提が正しいかどうかを明らかにするのは難しいものです。

アンダーレポーティングは本当に存在するのか

感覚としては、起きた副作用がすべて規制当局に報告されているとことはないと思いますが、実際にそういう事が起きているというのが科学的に記述されているでしょうか。この点について、臨床現場の先生が有害事象を選んで報告していることを明らかにした英国及びアイルランドからの研究報告があります1,2

また、スロベニアで一次市中病院から四次紹介先病院までの入院カルテをレビューした報告によると、医薬品の副作用による入院を医師が認識していても、コーディングしてデータを登録して報告することはまれでした3

アンダーレポーティングの要因

副作用が起きたとして、全てが規制当局に集約される様な仕組みではないので、仕方ないというか。全てが報告されることを基準にして、それより低いから「アンダー」という発想が現実からかけ離れたことを想定しているというか。まぁ、医療関係者も忙しいし、報告自体よりその仕組みを理解するのが面倒だったりというのもあり。全体に違和感のある部分ではあるのですが要因を分析して見ないことには、次に繋がらないのでこの辺りも少し調べました。

ベネズエラでの研究グループは、医師が自発報告のシステムについての知識が乏しい事が示され、これがアンダーレポーティングの原因であるという仮説を主張しました4

スペインからの報告5では、

  1. ADR(S)であると診断することの困難さ
  2. 医師が多忙である事
  3. 薬物モニタリングシステムをどう使って報告するのか知られていない事
  4. 利益相反

がアンダーレポーティングの要因として提唱されました。スペインからのもう一つの報告6では

  1. 薬剤師の関心の低さ
  2. 薬剤師が多忙である事
  3. ADR(S)であると診断することの困難さ

がアンダーレポーティングの要因として提唱されました。

ちょっと寄り道

スペインの報告2の(1)を「関心の低さ」と訳しましたが、原文ではforgetfulnessでした。スペインでは薬剤師が(3)の判断をしているのかと少々驚きました。日本で調剤薬局の薬剤師から受ける報告では、「薬を使った」→「何か症状を訴えている」で、ほぼ何も考えず「副作用である」かのごとき報告がなされます。「副作用名」もほぼ「患者が訴える症状」あるいは、「診断根拠が希薄な病名」です。調剤薬局の薬剤師からの情報は処方箋に書かれた医薬品情報と患者さんとの会話でしか病状を把握できないことがほとんどで、基礎疾患や臨床検査値や治療の経過等の正確な情報が得られることはほとんどありません。その上、多くの場合処方した医師に対して、薬局薬剤師や企業が因果関係を問う事も難しいことが多く、薬局薬剤師の置かれた立場からすると、得られる情報が限定的なのもやむを得ないことです。結果として薬局経由の情報は症例評価には限界があります。

更なる取り組みに向けて

ドイツからの報告7で、メールにより1315名の医師にアンケートした結果によると、規制当局のシステムを使って報告するより、製薬企業を通して報告する方を好む医師が多かったということです。この報告によると、アンダーレポーティングを抑制するには、医師による自発報告を支援する事が提案されました。経済的インセンティブや教育活動によって、臨床家が副作用を報告する活動が改善することを報告した論文は複数あります8–12。副作用を疑ったら、規制当局に報告するという活動があることを知る患者は少なく、患者自身による副作用報告を提案する論文もあります13–15

ちょっと待った

インセンティブを厚くすると、その副作用も心配です。容易に想像できるのはそのインセンティブ(お金)目当てで、あまり大したことのない副作用を多数報告する臨床家や、最悪存在しない副作用を報告するものも現れるかもしれません。私としては報告を少々増やすことと引き換えに、これらのノイズを多く混入させることが解析上の困難を引き起こすことを懸念します。

患者自身の副作用報告については、医学的な判断の入った診断と言うよりは主観的な症状が中心になります。患者は副作用を経験したと思ったら、規制当局に報告するより、疑わしい医薬品を処方した医師に相談して、医学的判断を仰ぐので良いのではないでしょうか。忙しそうにしている医師にわざわざ報告するほどでもない、という副作用であれば、規制当局的にも必ずしも重要視しないような病態ではないかと思います。

現在の自発報告の状況は完璧とは程遠いものです。でも、これまでいくつかの薬害を乗り越えて、副作用報告の制度が洗練されてきた医療用医薬品に関しては、深刻なほど、新規の副作用の検出力が低いとも思えません。

実際にあった悪質なケース

医薬品関連の業者Aが、「副作用の収集業務を始めました。サンプルとしてこういう情報を入手しています」として、数件の副作用情報を製薬企業Bに提供しました。薬事法(現薬機法)に基づきますと、製造販売元企業Bが副作用情報を入手した際には規制当局に報告する義務が発生します。ですのでその情報も当局へ報告しました。企業Bも海外本社のグローバルカンパニーで、一定の基準に合致する副作用は、米国FDAや欧州EMAをはじめ各国の規制に従ってそれぞれの規制当局へ報告されました。

製薬企業は、入手した情報について、具体的で詳細な情報を確認に行くように、と規制当局より常々指導されています。当初業者Aより入手した情報に基づき、情報源とされる調剤薬局や卸業者さんへ企業Bの営業担当者がそれぞれ手分けして確認に行きました。すると、行った先では「そのような副作用情報を報告していない」「業者Aが何かないかとしつこく聞くので適当に作り話を言った」というようなケースばかりで、副作用症例が実在しないことが明らかになったのです。ねつ造情報でも、それらしいものを企業に送り付ければ、ビジネスになるというような安易な理解で参入しようとしていたとの結論に至りました。副作用報告の規制の細やかさを理解していれば、虚偽の情報を企業が裏を取らない訳にはいかない事は明白なのですが、その規制すら理解していないようです。

ねつ造情報に基づいて、各地の営業担当者が薬局や卸さんを訪れ、さらに、「そんな情報はない」と言うような話のかみ合わない不快な時間を過ごしました。訪問された方も、業者Aにしつこく副作用の情報を求められ、その後製造販売元のAから再度詳細情報を求められ、と無意味な問い合わせの対応に時間を取られました。企業Bでは日本をはじめ各国の規制当局には、副作用情報を報告した後、さらに、取り下げの手続きを行ったりと大変な無駄な業務を余儀なくされました。その時には業者Aが解りやすくねつ造していましたので、まもなくねつ造が確認できました。でも、情報源である医療関係者が虚偽の報告を(少額の)お金のために作り始めると、なかなか裏を取ることは難しそうです。

References

1.
Martin R, Kapoor K, Wilton L, Mann R. Underreporting of suspected adverse drug reactions to newly marketed (“black triangle”) drugs in general practice: observational study. BMJ. 1998;317(7151):119-120. [PubMed]
2.
Williams D, Feely J. Underreporting of adverse drug reactions: attitudes of Irish doctors. Ir J Med Sci. 1999;168(4):257-261. [PubMed]
3.
Brvar M, Fokter N, Bunc M, Mozina M. The frequency of adverse drug reaction related admissions according to method of detection, admission urgency and medical department specialty. BMC Clin Pharmacol. 2009;9:8. [PubMed]
4.
Pérez G, Figueras A. The lack of knowledge about the voluntary reporting system of adverse drug reactions as a major cause of underreporting: direct survey among health professionals. Pharmacoepidemiol Drug Saf. 2011;20(12):1295-1302. [PubMed]
5.
Vallano A, Cereza G, Pedròs C, et al. Obstacles and solutions for spontaneous reporting of adverse drug reactions in the hospital. Br J Clin Pharmacol. 2005;60(6):653-658. [PubMed]
6.
Irujo M, Beitia G, Bes-Rastrollo M, Figueiras A, Hernández-Díaz S, Lasheras B. Factors that influence under-reporting of suspected adverse drug reactions among community pharmacists in a Spanish region. Drug Saf. 2007;30(11):1073-1082. [PubMed]
7.
Hasford J, Goettler M, Munter K, Müller-Oerlinghausen B. Physicians’ knowledge and attitudes regarding the spontaneous reporting system for adverse drug reactions. J Clin Epidemiol. 2002;55(9):945-950. [PubMed]
8.
Lopez-Gonzalez E, Herdeiro M, Piñeiro-Lamas M, Figueiras A, GREPHEPI group. Effect of an educational intervention to improve adverse drug reaction reporting in physicians: a cluster randomized controlled trial. Drug Saf. 2015;38(2):189-196. [PubMed]
9.
Herdeiro M, Ribeiro-Vaz I, Ferreira M, Polónia J, Falcão A, Figueiras A. Workshop- and telephone-based interventions to improve adverse drug reaction reporting: a cluster-randomized trial in Portugal. Drug Saf. 2012;35(8):655-665. [PubMed]
10.
Figueiras A, Herdeiro M, Polónia J, Gestal-Otero J. An educational intervention to improve physician reporting of adverse drug reactions: a cluster-randomized controlled trial. JAMA. 2006;296(9):1086-1093. [PubMed]
11.
Biagi C, Montanaro N, Buccellato E, Roberto G, Vaccheri A, Motola D. Underreporting in pharmacovigilance: an intervention for Italian GPs (Emilia-Romagna region). Eur J Clin Pharmacol. 2013;69(2):237-244. [PubMed]
12.
Pedrós C, Vallano A, Cereza G, et al. An intervention to improve spontaneous adverse drug reaction reporting by hospital physicians: a time series analysis in Spain. Drug Saf. 2009;32(1):77-83. [PubMed]
13.
Tapsfield J, Mathews T, Lungu M, van O. Underreporting of side effects of standard first-line ART in the routine setting in Blantyre, Malawi. Malawi Med J. 2011;23(4):115-117. [PubMed]
14.
Kiguba R, Karamagi C, Waako P, Ndagije H, Bird S. Recognition and reporting of suspected adverse drug reactions by surveyed healthcare professionals in Uganda: key determinants. BMJ Open. 2014;4(11):e005869. [PubMed]
15.
Avery A, Anderson C, Bond C, et al. Evaluation of patient reporting of adverse drug reactions to the UK “Yellow Card Scheme”: literature review, descriptive and qualitative analyses, and questionnaire surveys. Health Technol Assess. 2011;15(20):1-234, iii-iv. [PubMed]

有害事象と医薬品の因果関係評価について

<この記事は内科学会雑誌に掲載した記事のセルフアーカイブです。誤字脱字等も含め内容は公開版の最終稿と同一です。>

Evidence-based Medicine (EBM)

有害事象と医薬品の因果関係評価について

大島康雄

東京大学医科学研究所 先端医療研究センター・分子療法分野

郵便番号 108-8639

住所 東京都港区白金台4丁目6-1

℡ 03-6301-3845

電子メール 0-oshima@umin.ac.jp

 

はじめに

医薬品医療機器総合機構(PMDA)のWebpageによると、2010年1月から11月までの期間に使用上の注意の改訂指示があった医薬品情報は170件あった (http://www.info.pmda.go.jp/kaitei/kaitei_index.html)。 この中でアンジオテンシンII受容体拮抗薬、いわゆるARBである、オルメサルタン メドキソミル、テルミサルタン、バルサルタンおよびそれらを薬効成分として含む合剤の使用上の注意へ、「横紋筋融解症」の副作用の記載をするようにとの指示が私の目を引いた。横紋筋融解症は一旦発現すると死亡に至る割合が1割近くもある深刻な病態である(1)。それに加え、ARBは臨床現場で多くの患者さんへ使用されているため、規制当局からの情報は大きな影響力を有しかねない。しかし、気になったのはそのためだけではない。HMG-CoA還元酵素阻害薬、いわゆるスタチン類では個人的な臨床経験としてあるいは同僚医師らとのコミュニケーションの中で、クレアチンキナーゼ上昇あるいはこれに筋症状等の伴った筋炎と考えられる症例を経験することがあり、スタチンの筋組織に対する傷害性を感じる機会があった。これに対して、ARBではこうした身近な経験をする機会が乏しかったのだ。厚生労働省のWebpage掲載文書である医薬品・医療機器等安全性情報No.271の記載によると、オルメサルタン メドキソミルでは、平成21年度1年間での使用者数おおよそ180万人に対し、集計当時の直近3年間に横紋筋融解症症例のうち因果関係が否定できない症例が1例報告されている、との記載がある。 同じくテルミサルタンでは1年間使用者数190万人に対し直近3年間で3症例、バルサルタンでも同じく410万人に対し4症例との記載である (http://www1.mhlw.go.jp/kinkyu/iyaku_j/iyaku_j/anzenseijyouhou/271-2.pdf)。医薬品・医療機器等安全性情報No.271には改訂指示の根拠となった症例の概要等に関する情報が紹介されている。それぞれの症例の臨床経過を見ると、症例で副作用が報告されていることは理解できるものの、添付文書上で注意喚起を行うという一種のリスクコミュニケーションが必要であると判断したロジックは読み取れない。医薬品・医療機器等安全性情報No.271に記載された数字には、副作用症例を経験された臨床現場の先生方が任意でご報告される、いわゆる自発報告に基づく数字が含まれると考えられる。自発報告の弱点として、発現していても報告されない症例が少なからずあると思われる、いわゆるアンダーレポーティングの問題が指摘されている。言い換えるならば、実際には報告されている症例より多くの有害事象が発現している可能性が考えられる。それにしてもこの程度の報告数であれば身近な経験が情報共有されないのも納得ができる。と同時に、添付文書上で注意喚起を行うというリスクコミュニケーションが本当に必要なのか、情報の受け手としての医師はこの情報をどの様に日々の臨床に生かすことが求められているのか疑問が湧く。

本稿では、医薬品使用中または投与後におきた医療上の好ましくない事象である有害事象が、本当に医薬品が原因で起きた副作用であるかどうか、すなわち有害事象と医薬品の因果関係についてどのような判断の方法があるのかについて、いくつかの例を紹介させていただく。

 

個別症例の有害事象に関する因果関係

臨床試験中に生じた有害事象と試験薬との因果関係の評価は、重要な意味を持ちうるにもかかわらず、客観的で確立された基準があるとは言えない。疾患の経過中に起きた有害事象は、被疑薬による副作用のほか、被験者がもともと有していた病態に関連した症状、併用薬剤による事象、治療手技の合併症、それらとは無関係に偶然おこる偶発症などさまざまな可能性がある。原因についてのさまざまな可能性を臨床的に推論してゆく中で、相対的に他の要因が考えにくい場合に被疑薬との因果関係があると考えられる。つまり、いわゆる臨床推論そのものであり、一律に基準を設けるのは困難である。治験中に得られる安全性情報の取り扱いについて、INTERNATIONAL CONFERENCE ON HARMONISATION (ICH) E2Aという国際的ガイドラインがある。その規定によると、薬物投与後に起きた有害事象について、完全に否定することは論理的には困難であるにもかかわらず、「因果関係が否定できない場合に、合理性を以て因果関係の可能性があるとする」との考え方が記載されている(2)。脚注 このように基準となるべき文言についても客観的で一定の判断が常にできる基準とは言い難い。このほかにも考慮するべき点はいくつか報告されている。上記ICH E2Aの記述および、同じく国際的な治験や市販後の医薬品評価にかかわる議論を深めてきた国際医科学団体協議会(CIOMS, council for international organizations of medical science)が、因果関係の判断に関して考慮するべきとして指摘している点を4点以下に列挙する。あるべき姿として、評価できるだけの十分な医療上の情報を得たうえで判断がなされるべきである。

  1. 再投与によって有害事象の再発がある(リチャレンジ)
  2. 被偽薬中止により有害事象が軽快する(ディチャレンジ)
  3. 発現時期が副作用として妥当
  4. 事象を引き起こしうる他の要因がない
  1. については、被疑薬を再投与することは通常推奨されておらず、情報が得られにくいと思われる。しかし、再投与により再現性が確認できる場合には被疑薬によって有害事象が起きていたとの因果関係が強く支持される。
  2. 深刻な有害事象が起こり、被疑薬の中止によって有害事象が軽快することが期待される場合には被疑薬が中止される場合が多いであろう。被疑薬の中止によって有害事象が軽快することが通常期待できない発がん等の例を除いて、被偽薬中止によって有害事象が軽快しない場合は、因果関係は考えにくいと判断するかもしれない。
  3. 好発時期が知られている有害事象、例えばアナフィラキシーショックや抗がん薬の骨髄抑制性の副作用等については、個別症例の発現時期と知られている好発時期とで矛盾がないかが、因果関係を評価するために考慮されるだろう。変異原性試験やがん原生試験等の結果に特に問題となる所見がない薬物については、被疑薬投与開始から1-2年目程度までに発症した悪性疾患については薬剤との因果関係が否定的と考えるだろう。放射線被ばくは遺伝子に障害をもたらすと考えられるが、その放射線被ばくをもたらす原子爆弾投下後の甲状腺がんや白血病の発症のピークが数年後にあるとの調査結果が知られている。また、腫瘤の成長速度に関する基礎的な研究の結果等もふまえ、放射線や薬物への曝露によるイニシエーションから臨床的な発がんには一般的に数年が必要と考えられているからである。
  4. 報告された有害事象が、被験者がもともと有していた疾患によってしばしばみられる症状であるような場合や併用薬剤の副作用として良く知られているような事象の場合には、被疑薬と有害事象の因果関係は確定的とは言えなくなる。こうした要因がある場合でも、個別の症例の基礎疾患の病状や併用薬剤の使用状況、有害事象の重症度や発現時期によっては被疑薬の因果関係を積極的に疑うことが合理的な場合もありうる。

また、有害事象の性質や、被疑薬(代謝物を含む)の類薬についての以下のような情報がもしあれば、これらも含め総合的に因果関係が評価される場合もある。

  1. (事故による)過量投与により起きることが報告されていないか
  2. 事象が一般人口中ではまれか、頻度が高いとされているか
  3. 一般に薬剤性とされている事象か
  4. 薬物動態的証拠(薬物相互作用等)として矛盾はないか
  5. 公知の作用機序によって説明できるか
  6. 公知の共通薬効群の副作用として知られているか(クラスエフェクト)
  7. 動物やin vitroの試験結果で副作用が起きることが示唆されているか
  8. 同じ有害事象を起こすことが知られている薬剤に、被疑薬の特徴が似ているか

 

上述の情報を考慮しても、個別症例の有害事象が被疑薬と因果関係があるのか否かの判断が困難なケースが少なくない。

治験で報告される有害事象の取り扱い

臨床試験のうち、新医薬品等の承認を得るための臨床試験を治験と呼び、これはいわゆるGCP省令に基づいて行われ、治験届がなされている。治験では、個別症例の有害事象について、治験責任医師等がその因果関係判断を行う。治験責任医師等が当該有害事象と試験薬との因果関係を否定しないと、治験依頼者によって個別症例の副作用として報告等の必要な手続きが検討される。この場合試験が継続中であれば、規制当局および治験に参加している他施設への迅速報告が検討されるとともに、その重要度によっては試験の継続についても検討される。しかしながら、試験が終了し、集積検討をする段階では、個別症例についての因果関係評価に基づいてそのまま、「当該試験薬が当該副作用を引き起こす」というように医薬品が評価されるわけではない。むしろ逆である。Food and Drug Administration (FDA)では審査官(reviewer)向けのガイドブックが作成され公開されている。このFDAレビューワーガイダンスによると、有害事象の報告に責任のある治験責任医師(investigator)あるいは治験依頼者(新医薬品等の申請者としてapplicantの用語で登場する)が行った個別症例についての因果関係判断からは、あまり有用な情報が得られない、あるいは、無視するようにとも取れる記述がみられる。以下に因果関係評価についての記述をFDAのレビューワーガイダンスより引用する。(http://www.fda.gov/downloads/Drugs/GuidanceComplianceRegulatoryInformation/Guidances/ucm072974.pdf)

7.1.1 死因についての記述で、In most cases, these events need to be examined for frequency but discussion of individual cases is not helpful.

7.1.2 転帰死亡以外の重篤な有害事象について、The reviewer should identify, without regard to the applicant’s causality judgment, all serious adverse events.

7.1.5.3 Incidence of Common Adverse Eventsについて、For the most part, attributions of causality by the investigators should be discounted, and adverse events should be assessed without regard to attribution.

(FDAレビューワーガイダンスより)

 

どうして個別症例の因果関係評価を無視するような記述になっているかと言うと、集積検討をする場合には個別症例の因果関係評価とは別の情報が加わるからである。どのような情報かについては、具体例を提示することで解説したい。以下に臨床試験に関する教科書であるStatistical Issues in Drug Developmentからの例を2つほど引用する(3)。元の教科書を参照していただければわかるが、これらの例は架空の例であり、過去に実施された治験についての記録ではない。しかし、本稿では過去に起きたような時制で文章を記述させていただくことをあらかじめお断りしておく。

例1:

小児を対象とした臨床試験で、β作動薬とプラセボの気管支喘息に対する有効性を盲検下で評価する比較試験での話である。試験薬による治療開始された後の診察時に、ある母親が「うちの子が夜尿をした」と報告した。この被験者の夜尿は一回限りであり、担当医師は、この有害事象について試験薬との因果関係はないと記載した報告書を作成した。しかし、この試験は多施設共同治験で、他の施設でも各施設1-2件ずつ夜尿の有害事象が見られた。多くの施設でも担当医師は因果関係を否定していた。開鍵した結果、ほとんどの夜尿は実薬であるβ作動薬が投与された被験者にみられており、プラセボ群ではほとんど報告がなかった。そこで、個別症例の多くは因果関係が否定されていたにもかかわらず集積検討の結果、夜尿が実薬によって起きた、すなわち、有害事象と実薬に因果関係があると判断することができた。副作用であると判断したら、次は、その機序について考えるかもしれない。hypothesis creationである。喘息のため夜間眠りが浅かった被験者は治験開始後、実薬の薬効によって夜間の睡眠が深くなり、少々の尿意では目が覚めにくくなったのではないか、などと。

 

例2:

今度は成人の高血圧症の治療薬として開発中の、新規ACE阻害薬の試験の例である。こちらの試験も、プラセボをコントロールとした、盲検下での比較試験であった。試験が開始され被験者が担当医師に咳を報告した。ACE阻害薬は咳の副作用が広く知られている。この試験を担当した他施設の担当医師らも、咳を副作用だろうと考え、その結果多くの「因果関係の否定できない咳」が収集された。試験が終わり開鍵した結果、プラセボと実薬で同程度の「咳」が報告されていた。この集積検討の結果、個別症例では「因果関係あり」とされていたにもかかわらず、試験で収集された「咳」の有害事象は実薬との因果関係がなかったと結論することができる。

 

これらの例で興味深いのは、個別症例の因果関係判断が、集積検討の結果覆る点である。集積検討で得られる情報で重要な情報は、比較対象であるプラセボ群との発現頻度についての情報である。お示ししたような例が論理的にはあり得るため、FDAでは医薬品の有害事象の因果関係判断を行うに当たって、治験責任医師や治験依頼者の行った個別症例の因果関係判断を必ずしもそのままでは受け入れず、7.1.1の死因の記述にある通り頻度を確認するようにしている。頻度が同程度であっても、実薬で早期に発現していないか、重症度が実薬で高くないか等が比較されることもある。

ここで、本稿の趣旨とははずれるが、もう一点強調しておきたい点がある。先の例では集積検討の結果、当初報告してきた治験担当医の因果関係評価は「誤り」となる。にもかかわらず、医薬品評価としては何の問題も生じない点である。開鍵後の集積検討の結果を知ることなしに、それまでの医学的な知識に基づいて、一定の合理的な判断をしている限り、結果として因果関係評価が誤りであったとしても、試験上は問題にはならないのである。筆者の知る限り、国内で試験に参加される先生の中には、こうした「結果として誤り」となることを恐れるあまりか、例1のような場合で、因果関係は絶対に否定しないお考えの先生方もおられる。そうした判断の考え方は例2のような場合には逆に結果として「誤り」となってしまう恐れがあることも考慮されておくべきであろう。治験責任医師らはご自身の知識と経験そして、目の前の患者さんの状況を鑑み、因果関係があるのかないのかを素直に医学的に判断して、それでも「結果として誤り」となることは避けられないものである。

また、臨床試験に参加される先生方のご心配は他にもあるようだ。「因果関係はないと思うが、治験責任医師らが因果関係を否定してしまうと、その事象が誰からも評価されることなく承認審査が行われるのではないか」と懸念され、因果関係を否定することに躊躇する先生方もおられる。これにも、誤解がある。個別症例の因果関係を「なし」とした場合、確かに試験継続中の他施設や規制当局への迅速な報告はなされないであろう。しかし、FDAレビューワーガイダンスに示した通り集積検討の段階では、因果関係が否定されている事象も含め、有害事象のリストに記載され、集計され、規制当局へ報告される。これは国内でも同様である。言い換えるならば個別症例の因果関係を否定したとしても、その有害事象の情報が闇に埋もれてしまう心配はない。

治験責任医師らは、自身の医学的知識と経験にもとづき、目の前の被験者の状況を鑑み、因果関係があるのかないのか、医学的に判断することに専念することが求められる役割であろう。

 

臨床試験の限界

残念ながら、前述の例のようにプラセボと比較して実薬で発現頻度の高いものを「実薬による」とするように明快な判断ができる有害事象は、条件が整った限られたケースのようである。プラセボの情報が不十分な場合では、治療対象疾患の経過中に起きることが知られている合併症としての事象の頻度や、一般人口中での発症頻度、類薬での発現頻度などを比較の対象として判断する場合もあるかもしれない。いずれにしても上市時に得られている医薬品の副作用情報は限られている。市販後に初めてわかるような安全性情報も少なからずある。開発段階での安全性情報が不十分となる要因を先ほどとは別の教科書から引用する(4)。

開発段階の安全性情報を不十分にする要因

  • 臨床試験で評価された症例数が、その薬が世の中で使用される患者数に比べて圧倒的に少ない
  • 発現頻度が高くないあるいは稀な副作用については臨床試験での検討が不十分である
  • 臨床現場で安全性上の問題が稀に起こるかもしれない状況を開発段階で予測するには限界がある
  • 市販後の適応外使用
  • Breakthrough medicineを早く患者が利用できるようにしたいという社会的な要求
  • 開発段階で組み入れられなかったリスク集団への使用
  • 過剰投与に関する情報不足

 

このリストの中の問題の多くは、治験では選択基準に合致する限られた被験者に限られた期間のみ投与され、一定の観察期間のみの情報が収集されることから、市販後に起きる状況が十分評価できないのである。この要因の中で異質な点が5番目の要因である。ここに記載されている社会的要求が安全性の情報とのトレードオフとするような考え方に抵抗感を示す先生方もおられるかもしれない。しかし、過度な社会的要求は治験を最低限の期間で、かつ最小の被験者数で進めるような圧力になりかねない因子の一つである。そうした圧力の有無にかかわらず、治験段階での安全性評価は限られた情報であるとの認識に基づいて、市販後に安全性を監視し続けることが臨床医には求められていると考えられる。

 

市販後の副作用報告の取り扱い

市販後の安全性情報にはSolicited とUnsolicitedな情報がある。 Solicitedとは試験や調査等登録患者を一定期間観察して、有害事象が発症しないかを観察する、つまり観察される集団があらかじめ定義されている安全性情報をいう。市販後の情報の報告数を見るとSolicitedな情報も一部にはあるものの、数として多いのは自発報告等のUnsolicitedな情報である。自発報告とは、副作用症例を経験された臨床現場の先生方が任意でご報告される、副作用報告のことである。自発報告は2つの大きな問題を抱えており信頼できる発現頻度を計算することができない。第一は薬物曝露状況つまり、どのくらいの被疑薬投与症例に被疑薬がどのくらいの期間投与されたのか、事象の発現頻度であるincidenceを計算する場合の分母にできる数字がない。分母にできる数字の代替として思いつくものに、出荷数量から推計できる使用患者数がある。これについては、ヨーロッパの規制当局であるEMEA のガイドライン案によると、「すでに市販されている医薬品で、自発報告された有害事象数あるいは有害反応数を分子に、販売数を分母にした報告率は、医薬品使用者での有害反応の発生率の推定値として提示すべきではない。」とあり、少なくともヨーロッパでは好ましくないことと考えられている。出荷数量は流通在庫や期限切れによる廃棄の問題や一人当たりの使用量の推計が、どの程度実臨床の状況を反映されているのかが不明であるといった問題がある。このため分母が不正確にならざるを得ない状況があり、発生率の推定値としては好ましくないとしているのであろう。

第二は、実際に起きている有害事象のうち一部しか報告されていない、つまりアンダーレポートの問題があり、incidenceを計算する場合の分子にできる数字は、実際に事象が起きている件数より小さいと推定できる。そのほかにもいくつかの重要な問題があり以下にリスト化する。

自発報告の問題点

  • 診断が不確である
  • 重要な情報が報告されてこないことがある
  • 報告される事象の選択が任意である
  • 因果関係が不確かである
  • 市場の大きさを無視した副作用報告

 

不確実な診断は副作用報告の深刻な問題の一つである。自発報告では通常ごく限られた情報が報告されてくることから、規制当局や製薬企業が診断を確認することは困難である。さらに、報告者が薬局薬剤師、患者やその家族等であった場合は、診断や診断根拠を報告者自身が十分把握していない場合もある。副作用を診断した医師が報告する場合であっても、報告医師の専門分野以外の副作用については診断が正確でない場合が考えられる。また、他の病院などからの転院患者を引き受けて、その後起きた副作用を報告するような場合、前医で治療されていた基礎疾患やその臨床経過についてのデータを十分引き継いでいない場合もある。さらに、自発報告では仮によく知られている絞絡因子が当該症例にあったとしても、報告されてこないかもしれない。

診断自体に困難な点がない場合でも報告事象名の選択が悩ましいケースがある。例えば、高齢者の多発性骨髄腫の患者に化学療法が行われ、その後発熱および下痢を発症した。経過中、腎不全となり、死亡した。このように一連の経過で複数の病態が観察された場合に、報告者が副作用として選択する事象名にはぶれが生じうる。より多くの種類の病態が起きるような場合はさらに事象名の選択は複雑になる。これとは別の問題として、新聞やテレビといったマスメディアでセンセーショナルに取り上げられた副作用については、過去の経験にさかのぼって報告するなどにより急に副作用報告件数が増えることが知られている。また、多くの患者に使用される医薬品は、薬物とは因果関係のない偶発症等の情報を含め、多くの有害事象が報告されてくることになる。

 

自発報告の集積検討の試み

臨床試験では開鍵後に集積検討をすることができるが、自発報告には分母にできる数字や比較対象にできるプラセボ群もない。かといって、集積検討が全くできない訳ではない。世の中で起きている医薬品の副作用について迅速にうかがい知るうえで、現状として最大の情報を蓄積しているのが市販後の自発報告を含む副作用データベースである。前項のような自発報告の欠点があることを把握したうえで、精度は落ちるものの大量のデータから科学的推論をすることは可能であるとされ、医薬品曝露情報(incidence の分母に相当する情報)に代わる何らかの指標を用いる手法がいくつか開発されている。原理のもとにある考え方は単純である。表に示した通り、安全性データベースの中で、興味の対象である医薬品Xについて、興味の対象である有害事象Aが何件報告されているかをn(X,A)と表現する(表 パネルA)。

表.PNG

医薬品XについてA以外のすべての有害事象(!Aとする。以下同じ)の件数n(X,!A)とのオッズ比であるn(X,A)/n(X,!A)を計算する。X以外のすべての医薬品についても同様のオッズ比n(!X,A)/n(!X,!A)を計算し、この2つのオッズ比を比較する、すなわち、n(!X,A)/n(!X,!A)に対するn(X,A)/n(X,!A)の比を見ることで、相対的に医薬品Xについて有害事象Aが多く報告されていないかを検出する。これらの数字の比をROR(reporting odds ratio)と呼ぶ。具体的な数字を用いて計算過程を例示するため、2004年の第一四半期の3か月間にFDAに報告された副作用が疑われた症例の報告件数を表のパネルBに示す。この例ではゲフィチニブを興味の対象である医薬品とし、また、興味の対象である副作用を間質性肺炎とした。この3か月間にゲフィチニブが被疑薬として報告された間質性肺炎は22件あり、それ以外の報告事象は159件であった。ゲフィチニブについて、全有害事象報告件数に対する間質性肺炎の報告件数の比は、約0.138であった(パネルC-(1))。これに対して、同じ期間にゲフィチニブ以外の医薬品が被疑薬として報告された間質性肺炎は180件、ゲフィチニブ以外の医薬品が被疑薬として報告された間質性肺炎以外の事象は49983件であった。ゲフィチニブ以外の医薬品について、全有害事象報告件数に対する間質性肺炎の報告件数の比は、約0.00360であった(パネルC-(2))。ゲフィチニブのROR値は0.138と0.00360の比である、約38.3となる。ゲフィチニブについて、それ以外の医薬品と同程度の間質性肺炎が報告されてくると仮定すると期待されるROR値(帰無仮説H0 に基づくROR値)は1.00であるのに対し、計算結果は約38.3であった。閾値をどうするかという議論はあるが、この値は一般的にはシグナルと判断できる程度に大きい値である。ここで、原理を考えていただくためにお示ししたRORは、データベースに入力されている件数が少ない事象や被疑薬としての報告件数が少ない医薬品についての精度が不十分であるとの指摘もある。その精度を上げるべく開発されているものがいくつかある。「はずれ値」を検出するという目的から、neural networkやsupport vector machineといったアルゴリズムを応用することも検討されているが、本稿ではそうしたデータマイニング手法の一つを次の例としてお示しする。それは世界保健機構(World Health Organization, WHO)が開発したBayesian Confidence Propagating Neural Network (BCPNN) という手法であり、BCPNNを用いてFDAが公開しているAdverse Event Reporting System (AERS)データベースのデータを集計し、一般によく知られているいくつかの副作用等を継時的に表現し簡単な解説を加える。

本稿ではBCPNNの計算結果出力されるInformation Components (IC)値およびstandard deviation (SD) 値を示すが、BCPNNの計算方法や解釈についての詳細は他論文を参照していただきたい(5)。FDA AERSのデータを2004年第1四半期から2010年第2四半期まで過去に報告した方法に従い入手した(1)。四半期ごとにそれまでの集積状況をもとに計算した結果を表示したのが図1である。スタチンとして集計した医薬品には、simvastatin, atorvastatin, rosuvastatin, pravastatin, fluvastatin, losuvastatin, cerivastatin and pitavastatinが含まれる。また、アンジオテンシン変換酵素(ACE)阻害薬には、captopril, enalapril, alacepril, delapril, cilazapril, lisinopril, benazepril, imidapril, temocapril, trandolapril, perindoprilが含まれる。そしてARBには、olmesartan, telmisartan, valsartan, candesartan, irbesartan, losartanが含まれる。プロットされている点は2004年第1 四半期から各報告期間までに集積された累積のIC値である。エラーバーはSD の2倍である2SD が表示されている。BCPNNの開発時に過去の事例でシグナルの検出を試した結果、IC-2SD > 0 すなわち、図で言えばエラーバーの下限が0のラインより上に来たらシグナルとみなすこととされている。本稿の例ではゲフィチニブの間質性肺炎、スタチンの横紋筋融解症、ACE阻害薬の咳についてのIC値は、いずれの時点で見てもそれらのエラーバーの下限が0のラインを上回っている。言い換えるならば、BCPNN法を用いてFDAのデータを解析すると、医薬品リスクのシグナルが検出されたことになる。これに対し、ARBの横紋筋融解症についてのIC値は解析した期間中にエラーバーの下限が0のラインを上回っているポイントはなく、BCPNN法ではシグナルは検出されない。つまり、BCPNNのように相対的な報告頻度という観点からの集計では、ARBによって横紋筋融解症が起こりかねないと懸念する根拠を見出すことはできなかった。

なお、FDAのデータは日本からの報告も含まれるが、間質性肺炎等日本からの報告が多い一部の例を除くと、日本よりは米国での発現状況を色濃く反映していると考えられる。つまり、日本国内での副作用発現状況については、FDA AERSとは異なる可能性は否定できない。国内の副作用状況はPMDAが医薬品ごとの副作用情報を公開している。しかし全医薬品についての報告数を集計する必要のあるBCPNN等のデータマイニング手法は、PMDAの外部の研究者にとって現実的には難しい。本稿では紹介しなかったが、イギリスの規制当局で採用されているProportional Reporting Ratio (PRR)と言われる手法や、FDAで採用されているGamma Poisson Shrinker program (GPS)の手法も基本的にはBCPNNと同様のデータを用いて計算される。いずれも、大量のデータに埋もれている問題を拾い出す、新たな問題の提起に有用と考えられているが、検証的な評価には必ずしも向いていないとされる。

 

さいごに

ある患者に治療を行い、その後治ったとする。その患者さんにとっては良いことかもしれないが、個別の症例を見ている限り、その治療が本当に効いたのかどうかについて判断することは困難である。同様に個別症例に治療を行い、その後有害事象が起きた。臨床経過を見るとその個別症例にとって医薬品による副作用と考えられる場合でも、その医薬品と有害事象の因果関係を判断することは困難である。臨床試験で検出できる医薬品のリスクも限界がある。本稿では個別症例および集積検討を行う場合の有害事象の医薬品との因果関係評価の考え方や、市販後副作用データベースを利用し、限られた現在の状況で医薬品の副作用リスクのシグナルを検出する方法等について紹介した。本稿で紹介したBCPNN等ではシグナルが検出されない医薬品リスクもあるだろう。冒頭のARBの例では、副作用として報告した臨床家の先生方、専門協議にご参加の先生方それぞれが、当該症例の報告について詳細な情報を検討され、当該医薬品について真摯にリスクとベネフィットをお考えの上で行動された結果が使用上の注意の改訂指示につながっていると理解している。使用上の注意の改訂等のリスクコミュニケーションは一般に、検出されたシグナルがはっきりリスクであったと確認される頃に発出されても被害が甚大となり、手遅れと言われかねないことを考えると、コンサーバティブな方向に偏るのもやむを得ないことと思われる。リスクコミュニケーションの結果、社会全体で救われる患者さんがわずかでもおられれば良いのかもしれない。一方でリスクコミュニケーションが過剰であったならば、必要な治療を受ける機会が狭められる患者が出る懸念や、リスクコミュニケーション自体の信頼性が低下しかねない懸念についても思いをはせる必要がある。情報の受け手である医師は提供された情報が、どの程度のリスクなのか、どのような情報に基づいて判断されたのかについて、その根拠を吟味し、科学的な視座より把握した上で日常の診療へ結び付ける努力が求められる。

著者のCOI開示:

報酬(サノフィ・アベンティス株式会社)

Figure Legend

.PNG

図1 報告期間とBCPNN IC値

ARBの横紋筋融解症および、副作用としてよく知られているゲフィチニブの間質性肺炎、スタチンの横紋筋融解症、ACE阻害薬の咳について四半期ごとに区切った報告期間までの累積BCPNN IC をプロットした。エラーバーは2SDを示す。よく知られた3つの副作用の例ではエラーバーの下限が0を超えておりBCPNN法でシグナルが検出された。一方、ARBの横紋筋融解症についてはエラーバーの下限が0を超える期間はなく、シグナルはBCPNN法で検出されなかった。

文献

  1. Oshima Y: Characteristics of drug-associated rhabdomyolysis: analysis of 8,610 cases reported to the u.s. Food and drug administration. Intern Med 50: 845-53, 2011.
  2. USE ICOHOTRFROPFH: http://www.ich.org/. In: ICH HARMONISED TRIPARTITE GUIDELINECLINICAL SAFETY DATA MANAGEMENT. 1994.
  3. Senn S: Statistical Issues in Drug Development. In: John Wiley & Sons, Ltd, 2007.
  4. Spilker B: Guide to Clinical Trials. In: Lippincott Williams & Wilkins, 1991.
  5. Bate A, Lindquist M, Edwards IR, Olsson S, Orre R, Lansner A and De Freitas RM: A Bayesian neural network method for adverse drug reaction signal generation. Eur J Clin Pharmacol 54: 315-21, 1998.

RでPubMedの検索結果を機械学習

はじめに

本稿はRのパッケージでdeep learningができると聞いて、ネットで調べながら、パッケージを使う道筋をつけるまでの、忘備録です。サンプルにしたのは、「A薬」で検索した結果と「B薬」で検索した結果を、テキスト形式でA.txt, B.txtとしてPCに保存したうえで、一部を学習用サンプル、残りをテスト用サンプルにして、学習の効果(?)を測定しました。集計に入る前に、ダウンロードしたデータの中の、検索キーワードを削除しました。(←これをしないとさすがに検索キーワードそのものがそれぞれの集団にばっちり入ってしまうので分類の性能が評価できないのではないかと)

はっきり分類しやすいように、今回はAは抗癌薬、Bは免疫神経系疾患治療薬と治療対象の疾患の性質が違うものにしています。検索結果は、Medline形式でダウンロードします。このあたりの手順は、【Rで自然言語処理】を、ほぼそのまま利用しています。(「データ分析系男子」さんありがとうございます。)分類に使用したMXNetの周りのスクリプトは【RのMXNetでirisを分類】を、ほぼそのまま利用しています(「なんとなくなDeveloper」さんありがとうございます。)


{mxnet}パッケージのインストール

とりあえずこのパッケージのインストールです。インストール方法は、他の日本語のサイトの説明通りでは、なぜかうまくゆきません。一応以下の流れでインストールできました。他のパッケージは特に苦労することなくinstall.packages()でインストールできました。

# first add the repo
drat::addRepo(“dmlc”)
# either install just one or more given packages
install.packages(“xgboost”)

cran <- getOption(“repos”)
cran[“dmlc”] <- “https://s3-us-west-2.amazonaws.com/apache-mxnet/R/CRAN/”
options(repos = cran)
install.packages(“mxnet”)


MedLine検索と保管

検索キーワードは普通に入力して検索すればよいのですが、あまりたくさんの文献があっても取り回しが悪いので今回は検索対象を今年出版の文献としました。またアブストラクトで分類しますので、アブストラクトが入力されている英語の文献に絞って出力するようにしました。

保存に当たっては、send toからFile-Medline形式を選択しました。

Medline読み込み

setwd(“C:/Users/Oshima/Documents/2018/R deep learning/TXT/”)

## define function
medline <- function(file_name){
lines <- readLines(file_name)
medline_records <- list()
key <- 0
record <- 0
for(line in lines){
header <- sub(” {1,20}”, “”, substring(line, 1, 4))
value <- sub(“^.{6}”, “”, line)
if(header == “” & value == “”){
next
}
else if(header == “PMID”){
record = record + 1
medline_records[[record]] <- list()
medline_records[[record]][header] <- value
}
else if(header == “” & value != “”){
medline_records[[record]][key] <- paste(medline_records[[record]][key], value)
}
else{
key <- header
if(is.null(medline_records[[record]][key][[1]])){
medline_records[[record]][key] <- value
}
else {
medline_records[[record]][key] <- paste(medline_records[[record]][key], value, sep=”;”)
}
}
}
return(medline_records)
}

## read Medline
fileVec <- list.files(file.path(getwd()),
pattern=”.txt”,
full.names = T)
categoryVec <- list.files(file.path(getwd()),
pattern=”.txt”)
dataMed <- lapply(fileVec,medline)

## exstract Title, Abstract and CategoryVec
dataMedList <- lapply(seq(1,length(dataMed)),function(x){
res <- lapply(seq(1,length(dataMed[[x]])),function(y){
out <- data.frame(title=dataMed[[x]][[y]]$TI,
abst=dataMed[[x]][[y]]$AB,
category=categoryVec[x])
return(out)
# return(x)
})
return(do.call(rbind,res))
# return(y)
})

dataMedDF <- do.call(rbind,dataMedList)

データの前処理

dataMH <- sapply(dataMed,function(i){
sapply(i,function(x){
if(all(!(names(x) %in% “MH”))){
strMH <- c()
}else{
strMH <- strsplit(x$MH,”;”)
}
strMHgsub <- gsub(” “,”_”,strMH[[1]])
strMHpaste <- paste(strMHgsub,collapse = ” “)
return(strMHpaste)
})
})

トピック頻度のデータフレームを作成しました。ここでは、上述のサイトに倣ってk=20でやっています。

library(textmineR)
library(text2vec)
library(tm)
library(topicmodels)

# create vector of abstracts
allTexts <- sapply(dataMed,function(i){
sapply(i,function(x){
ti <- gsub(“\\[|\\]”,””,x$TI)
if(all(!(names(x) %in% “MH”))){
strMH <- c()
}else{
strMH <- strsplit(x$MH,”;”)
}
strMHgsub <- gsub(” “,”_”,strMH[[1]])
strMHpaste <- paste(strMHgsub,collapse = ” “)
paste(ti,x$AB,strMHpaste,collapse=” “)
})
})

allTexts <- unlist(allTexts)

# preprocess
sw <- c(“i”, “me”, “my”, “myself”, “we”, “our”, “ours”,
“ourselves”, “you”, “your”, “yours”, tm:::stopwords(“English”))
preText <- tolower(allTexts)
preText <- tm::removePunctuation(preText)
preText <- tm::removeWords(preText,sw)
preText <- tm::removeNumbers(preText)
preText <- tm::stemDocument(preText, language = “english”)

# tokenize(split into single words)
it <- itoken(preText,
preprocess_function = tolower,
tokenizer = word_tokenizer)
#, ids = abstID)

# delete stopwords and build vocablary
vocab <- create_vocabulary(it,
stopwords = sw)

# word vectorize
vectorizer <- vocab_vectorizer(vocab)

# create DTM
dtm <- create_dtm(it, vectorizer)
# Term frecency
TDF <- TermDocFreq(dtm)

# modeling by package “topicmodels”
model <- LDA(dtm, control=list(seed=37464847),k = 20, method = “Gibbs”)

termsDF <- get_terms(model,100)
topicProbability <- data.frame(model@gamma,dataMedDF$category)

今回は学習用サンプルを80%, 評価用サンプルを20%にして、分けました。

train_size <- 0.8
n <- nrow(topicProbability)
perm <- sample(n, size=round(n * train_size))

# data for training
train <- topicProbability[perm, ]

# data for test
test <- topicProbability[-perm, ]

# imput data for training
train.x <- data.matrix(train[1:20])

# label for training
train.y <- as.numeric(train$dataMedDF.category) -1

# imput data for test
test.x <- data.matrix(test[1:20])

# label for test
test.y <- as.numeric(test$dataMedDF.category) -1


以上データの前処理でした。

階層型ニューラルネットワーク

データの前処理が終わりましたので、ここからがいわゆる機械学習の処理になります。iris記事に倣って、本稿でも次のようにしています。

引数備考今回のパラメータ
hidden_node隠れ層のノード(ニューロン)数 デフォルトは15
out_node出力ノード数(分類数、今回はA薬とB薬の2)2
num.round繰り返し回数(デフォルトは10)100
array.batch.sizeバッチサイズ(デフォルトは128)10
learning.rate学習係数0.1
activation活性化係数(デフォルトは'tanh')'relu'

‘tanh’, ‘relu’とはなんぞや、というのは解らない。「フリーランスのプログラマ」さんによると、「結論から言うとReluを使おう」なのだそうです。

# deep learning

library(mxnet)
mx.set.seed(0)

# 学習
model <- mx.mlp(train.x, train.y,
hidden_node = 5,
out_node = 2,
num.round = 100,
learning.rate = 0.1,
array.batch.size = 10,
activation = ‘relu’,
array.layout = ‘rowmajor’,
eval.metric = mx.metric.accuracy)

# 評価
pred <- predict(model, test.x, array.layout = ‘rowmajor’)

# 評価用データの分類結果(0, 1)
pred.y <- max.col(t(pred)) -1

# 評価データの正解の割合を算出
acc <- sum(pred.y == test.y) / length(pred.y)

print(acc)

結果

次の通り97.1% (95%CI; 92.6 – 99.2) の割合で正解に分類できました。

ナイーブベイズ分類器

機械学習的な何か

はじめに

その昔、2001年~2007年にかけて、遺伝子発現解析をやっていた頃、SVM (support vector machine)やNeural Networkを使用していました。肝臓由来の細胞に対し肝臓関連の副作用が知られている医薬品と、そうでない医薬品を曝露して、曝露後の遺伝子発現のパターンを見て、医薬品の肝毒性をin vitroで予測する、実験モデルを組み立てようとしていました。あまり、基礎的な経験のない中であれこれ考えても打開策が見つからず、また今思えば、根本的なデザインに無理があったようでもあり、結局なかなかよい出力が得られなかった苦い経験でした。

今回は基礎体力をつける意味で、インターネット上ですでにうまくいっているようなデータやスクリプトを基に自分なりに試してみます。正解があるものをトレースするのは、良い練習になります。

ナイーブベイズ分類器

今回試したのは、「ナイーブベイズ分類器」というものです。なぜこれを試すかと言うと、良い資料を見つけたからです。その資料を基に、試してみたという記事もあるようです。ざっと見たところ、数式でクラクラするのを我慢すると、何をやっているのかおぼろげながら見えてきます。あるカテゴリで相対的に高い頻度で出現する単語を指標にモデルを構築することになるようです。

スクリプト

機能する仕組みは使いながら考えるとして、スクリプトは次のようになります。全くリンク先の資料通りでは本当に芸がなさすぎるので、ちょっとだけ変えてみました。サンプルとしては、森鴎外と夏目漱石の作品を見分けるという課題で、MeCabのサイトで配布されているもの、を学習用の文章として、あとは青空文庫から「草枕」「こころ」(以上漱石)「花子」「あそび」(以上鴎外)をテスト用文章として、用いました。なお、青空文庫の文章はルビがうるさいので、delruby.exeを用いて処理したものでテストしました。

ルビの処理の様子(MS-DOSのコマンドプロンプトから)

delruby asobi.txt > ogai_asobi.txt
delruby hanako.txt > ogai_hanako.txt
delruby kokoro.txt > soseki_kokoro.txt
delruby kusamakura.txt > soseki_kusamakura.txt

これらの出力ファイルとMeCabのサイトから入手したデータをまとめて、setwdで指定したディレクトリの下の/data/writers/の下に置いて、次を実行しました。

 

library(RMeCab)

# data is downloaded from
# shift JIS
# http://web.ias.tokushima-u.ac.jp/linguistik/RMeCab/data.zip
# UTF8
# http://web.ias.tokushima-u.ac.jp/linguistik/RMeCab/data.tar.gz

# indicate data folder
setwd(“C:/Users/Oshima/Documents/2018/R MeCab/”)

# convert text files to vector
d <- t(docMatrix2(“data/writers”))

myNaiveBayes <- function(x, y) {
lev <- levels(y) #1
# term frequency in each category
ctf <- sapply(lev, function(label) colSums(x[y == label,])) #2
# term probability in each category smoothed using Laplace smoothing
ctp <- t(t(ctf + 1) / (colSums(ctf) + nrow(ctf))) #3
# number of each class documents
nc <- table(y, dnn = NULL) #4
# class prior
cp <- nc / sum(nc) #5
structure(list(lev = lev, cp = cp, ctp = ctp), class = “myNaiveBayes”) #6
}

predict.myNaiveBayes <- function(model, x) {
prob <- apply(x, 1, function(x) colSums(log(model$ctp) * x)) #7
prob <- prob + log(as.numeric(model$cp)) #8
level <- apply(prob, 2, which.max) #9
model$lev[level] #10!!
}

train.index <- c(1:2, 5:9, 11)
y <- factor(sub(“^([a-z]*?)_.*”, “\\1”, rownames(d), perl = TRUE))
# y; c(“ogai”, “soseki”)

model <- myNaiveBayes(d[train.index,], y[train.index])
predict(model, d[-train.index,])

ファイルは名前順にソートされますので、テストサンプルは、ogai, ogai, soseki, sosekiの順に出力されれば正解です。

 

おわりに

とりあえず、正解が得られていますが、これは元のリンク先の方の功績でしょう。正確な方法で他の手法と比較して実行時間を測定した訳ではないので印象なのすが、この手法は学習がかなり速いです。いずれにしても、とりあえずこのスクリプトの使い方は理解できたぞ。

Sample size calculation for a classical case-control study

ケースコントロールスタディのサンプルサイズの見積もり

臨床試験だと、試験に参加する被験者をリクルートするのは骨が折れる仕事ですので、必要最低限の被験者で正確な結果を得たいという欲求は大きく、「サンプルサイズ」の正確な見積もりが求められます。ケースコントロールスタディをする場合も、最終的に元資料を確認したり、新たにデータを入手したりする手間は少ない方が良いので、精密な見積もりが出来た方がベターです。しかし、新たにデータを得ることを想定していないデータベース研究では、サンプルサイズを見積もる要求はどのあたりに発生するでしょうか?データベースをベンダーから購入したり、解析をCROに依頼する際に目的の結果にアプローチできるだけの情報を持っているかどうかを見積もる場合には有用かもしれません。まぁ、流行だということで偉い人からの号令で動いているような多くの人は、何らかの結論にアプローチしたいのではなく「アプローチしている姿勢を見せる」と言う、行動計画ありきで動いているみたいですので、当該ベンダーのデータには、リサーチで明らかにしたい結論に到達できるような、十分なデータが含まれないことが購入前あるいは解析の発注前に明らかになったとして、頭を切り替えるかそのまま突き進むかは目に見えていますが。

それはさておき、単純にケースおよびコントロールでそれぞれ、何人中何人が被疑薬に曝露されていて、そのオッズ比を求めるというようなデザインでのサンプルサイズの求め方がありますので、次の資料のデータをトレースしてみます。

Woodward M (2005). Epidemiology Study Design and Data Analysis. Chapman & Hall/CRC, New York, pp. 381 – 426.

(p. 412) A case-control study of the relationship between smoking and CHD is planned. A sample of men with newly diagnosed CHD will be compared for smoking status with a sample of controls. Assuming an equal number of cases and controls, how many study subject are required to detect an odds ratio of 2.0 with 0.90 power using a two-sided 0.05 test? Previous surveys have shown that around 0.30 of males without CHD are smoker.

事前の見積もりに必要なのは、odds ratio 2.0, power 0.90, two-sided 0.05 testという、研究者が設定するパラメータと、先行研究から得ておくべき背景の情報として「冠動脈疾患にかかっていない男性の30%がスモーカーだ」という、コントロール群の曝露頻度に相当する情報です。あと、コントロールを選ぶ際はマッチングは行わないで、ケースと1:1となる人数にするとしています。ここで設定しているオッズ比は、「オッズ比2.0以上だとリスクとして警告する価値がある」と研究者が思い込むような任意の数字で、基準があるわけではないです。これを、認識しているかどうかで、結果が出た際に(特に差がつかなかった時に)データの解釈の書き方が大きく変わります。

> epi.ccsize(OR = 2.0, p0 = 0.30, n = NA, power = 0.90, r = 1, rho = 0,
+ design = 1, sided.test = 2, conf.level = 0.95, method = “unmatched”,
+ fleiss = FALSE)
$n.total
[1] 376

$n.case
[1] 188

$n.control
[1] 188

答えは
A total of 376 men need to be sampled: 188 cases and 188 controlsだそうですので、一応、数値は正解です。

「冠動脈疾患にかかっていない男性の30%がスモーカーだ」という先行研究も、よくよく考えると書かれていることがあいまいです。冠動脈疾患にかかっていない男性が将来かからないとは言えないですし。禁煙に成功した人をどう扱っているのか情報もないです。ま、それもさておき、背景の喫煙男性が30%も世の中にいたおかげで、少ないサンプルで研究が成立しそうです。これが、世の中の男子の1%しか使用していない曝露(これが医薬品への曝露なら、世の中の1%の男性が使用しているような薬ならブロックバスターですが)曝露との関係を見ようとすると、次のようになります。

> epi.ccsize(OR = 2.0, p0 = 0.01, n = NA, power = 0.90, r = 1, rho = 0,
+ design = 1, sided.test = 2, conf.level = 0.95, method = “unmatched”,
+ fleiss = FALSE)
$n.total
[1] 6418

$n.case
[1] 3209

$n.control
[1] 3209

6418例の情報を収集する必要が出てきます。このくらいの数になると、どのようにデータを集めるにしても自前でデータを準備して集計するのは大変そうです。組織だって行動する必要がありそうです。さらに、背景の曝露を0.1%に下げると、次のように6万人超えのサンプルの収集が必要になります。

> epi.ccsize(OR = 2.0, p0 = 0.001, n = NA, power = 0.90, r = 1, rho = 0,
+ design = 1, sided.test = 2, conf.level = 0.95, method = “unmatched”,
+ fleiss = FALSE)
$n.total
[1] 63158

$n.case
[1] 31579

$n.control
[1] 31579

副作用を研究対象にしていると、このcaseの3万人超えの副作用が出ていないと、結論が出せないように見えます。つまり、副作用の例にあてはめますと、3万人以上の患者さんが副作用になるという、結構な大惨事になってからしかこの方法で結論が出せないという、悲惨な手法です。どこに間違いがあるのでしょうか。おそらくそれは、有名なレンツの研究では結果として上記の例よりかなり大きな数字になっているパラメータでしょう。「オッズ比が20~50になるくらいの本当の強いリスクかどうか」を検証したいという、リサーチクエスチョンを立てるのです。

もう一点できる事やるべき事は、背景での曝露頻度を上げるために、対照集団を絞り込むこともできそうです。結論部分で述べたい一般論との兼ね合いにもなりますが、多くの場合世の中一般の集団からサンプルを得る必要はなく、気になる医薬品が使用されるような特定の基礎疾患にかかっている人の中での曝露でp0を設定すれば、調査対象数を少なく見積もることもできそうです。

Don’t forget to load a library prior to the above-mentioned scrips.

library(epiR)

LearnBayes R パッケージによる臨床試験と市販後の副作用データの解析

RのLearnBayes パッケージで臨床試験と市販後の副作用データを解析してみました

ここに提示されるデータは、治験・市販後の実データを元にしていますが、実際のデータではありません。LearnBayesというRのパッケージはベイズ推計を行えるような関数を提供しています。説明書を読みながら、このパッケージの一部機能を使ってみてみました。


1.海外試験の結果が事前にあって、国内の副作用情報が得られた

海外の治験のデータがすでにあり、その後国内で試験を行って副作用データが新たに得られた。と言う場合を想定した解析をしてみた。

海外臨床試験では、被験者135例中50例に副作用が報告された。普通の頻度の解析によると副作用が報告される割合は、本剤使用者の37.0% (95%CI; 28.9 – 45.8)となる。

> binom.test(50, 135)

Exact binomial test

data: 50 and 135
number of successes = 50, number of trials = 135, p-value = 0.00328
alternative hypothesis: true probability of success is not equal to 0.5
95 percent confidence interval:
0.2888945 0.4576672
sample estimates:
probability of success
0.3703704

この計算結果をもとに、β分布を推定する。95%信頼区間の上限(p=0.975)を与えるxの値は0.4576672であり、最尤値(p=0.5)を与えるxの値は0.3703704。この2点を与えれば事前確率のβ分布のパラメータが推定できる。

quantile2 <- list(p=.975, x=.458)
quantile1 <- list(p=0.5, x=.370)
beta_parm <- beta.select(quantile1, quantile2)
a <- beta_parm[1]
b <- beta_parm[2]

国内臨床試験では海外より被験者が少なく、23例が安全性解析対象症例となった。23例中11例で副作用が報告された。この結果と事前推定されているβ分布のパラメータを元に前後の分布を図示する。

# 事後分布
curve(dbeta(x,a+s,b+f), from=0, to=1, xlab=”p”,ylab=”Density”,lty=1,lwd=4)
# 実験結果から出てくるイベント発生頻度の尤度
curve(dbeta(x,s+1,f+1),add=TRUE,lty=2,lwd=4)
# 事前分布
curve(dbeta(x,a,b),add=TRUE,lty=3,lwd=4)
legend(.7,9,c(“Prior”,”Likelihood”,”Posterior”), lty=c(3,2,1),lwd=c(3,3,3))

国内試験のデータの分布(荒い破線)のデータが得られた後も、事後の分布(実線)は事前分布(細かい破線)と大きく変わらないようだ。

# 事後の分布による推定

> # 90%信頼区間
> qbeta(c(0.05, 0.95), a+s, b+f)
[1] 0.3222927 0.4550214
> # 点推定
> qbeta(0.5, a+s, b+f)
[1] 0.3872558

事後の確率は0.39 (90%CI; 0.32 – 0.46)で、国内のデータ0.48 (90%CI; 0.30 – 0.66)とずいぶんずれているように見える。

# 国内データのみによる推定

> binom.test(11, 23, conf.level=.9)

Exact binomial test

data: 11 and 23
number of successes = 11, number of trials = 23, p-value = 1
alternative hypothesis: true probability of success is not equal to 0.5
90 percent confidence interval:
0.2960934 0.6648524
sample estimates:
probability of success
0.4782609

2. 治験の結果をもとに製造販売が承認され、市販後に医薬品が使われて安全性データが集積した

上記の臨床試験の結果を元に承認申請がなされ、製造販売の承認を得た。市販後はこの医薬品は治験に参加した被験者の数よりはるかに多い患者さんに使用されて多くの安全性データを得た。治験の結果を事前分布、市販後のデータを加えて事後の分布を集計してみる。

上記の分布を事前分布の確率密度関数のパラメータ推計に用いる

# 90%信頼区間の上限 0.95のx値は0.455
quantile4 <- list(p=.95, x=.455)
quantile4$x <- qbeta(0.95, a+s, b+f)
# 事前確率(点推定; p=0.5)は0.387であった
quantile3 <- list(p=0.5, x=.387)
quantile3$x <- qbeta(0.5, a+s, b+f)
beta_parm <- beta.select(quantile3, quantile4)
a <- beta_parm[1]
b <- beta_parm[2]

国内の市販後の調査に登録され安全性解析対象とされた患者は2072例であり、そのうち964例に副作用が報告された。この結果と事前推定されているβ分布のパラメータを元に前後の分布を図示する。

s <- 964
f <- 2072-s
# 分布を見てみよう
# 事後分布
curve(dbeta(x,a+s,b+f), from=0, to=1, xlab=”p”,ylab=”Density”,lty=1,lwd=4)
# 実験結果から出てくるイベント発生頻度の尤度
curve(dbeta(x,s+1,f+1),add=TRUE,lty=2,lwd=4)
# 事前分布
curve(dbeta(x,a,b),add=TRUE,lty=3,lwd=4)
legend(.7,35,c(“Prior”,”Likelihood”,”Posterior”), lty=c(3,2,1),lwd=c(3,3,3))

 

市販後の調査のデータの分布(荒い破線)のデータが得られた後、事後の分布(実線)は事前分布(細かい破線)から大きく右へシフトした。

# 90%信頼区間
> qbeta(c(0.05, 0.95), a+s, b+f)
[1] 0.4427958 0.4776115
> # 点推定
> qbeta(0.5, a+s, b+f)
[1] 0.4601712

図から受ける印象の通り、事後の確率は0.46 (90%CI; 0.44 – 0.48)は、事前のデータ0.39 (90%CI; 0.32 – 0.46)とずれているように見える。実は、事後の確率は、国内治験のデータ0.48 (90%CI; 0.30 – 0.66)を精密にしたように見える。

3. まとめ

ここまでやってみた感想

  1. 事前の試験・調査と事後とで大きく規模(被験者数)が違う場合、被験者数の大きな方の試験・調査の結果が事後の分布に反映しているだけではないか
  2. それなら単に規模の大きな試験・調査の結果の分布を集計しても同じではないか、あるいは、単純に足したような併合解析でも結果は似たようなものになるのではないか
  3. この様な例では、国内外で副作用の報告頻度が異なるという仮説を導きたい
  4. 結局事後分布って何を示しているものなんだろうか?
  5. なぜ、β分布を想定するのだろうか?

疑問がより具体化したので良しとしよう。

 

Case Crossover Design – (3)

Case Crossover Design – (3)

前回の記事のつづきです

Logistic regression model

このアプローチでは、観察期間を単位期間ごと(この場合は1hr)に分割して、イベントが発生した時以外は、コントロールとして、多くのcontrolと少数回のcaseを観察したcase-control studyのようにみなします。原文では[the case-crossover design can be viewed as matched case-control design with 1:M matched pairs]となっていまして、この、「みなす」というのが感覚的によくわからないのですがそういうことらしいです。例題では一人につき1年間観察して、1回AMIが発症たことにしていますので、1例の症例が、集計上8759例のcontrolと1例のcaseのように扱われます。例題では10例いますのでトータルの集計上の観察症例数は87600例と表示されます。matched pairを示す指標としてcase idを使用した、conditional logistic regression modelを用います。Formulaには[case~exposure+strata(id)]を入れます。

ちなみに、このスクリプトで使用されていますreshape2というライブラリのmeltは、こんなデータの変形をしたいと思うときに手作業でやってるようなデータの変形をやってくれる興味深い関数です。

matrix<-matrix(round(c(rr,lo,hi,or,lo.or,hi.or),2),nrow=2,byrow=TRUE)

rownames(matrix)<-c(“RR”,”OR”)

colnames(matrix)<-c(“Value”,”low 95% CI”,”high 95% CI”)

matrix

 

mat<-matrix(, nrow = T-1, ncol = 0)

for (i in 1:10) {

if (T%%frq[i]==0) {

exposure<-c(rep(c(1,rep(0,T/frq[i]-1)),frq[i]))[-T]

}   else {

exposure<-c(rep(c(1,rep(0,trunc(T/frq[i])-

1)),frq[i]),rep(0,T-frq[i]*trunc(T/frq[i])))[-T]

}

mat<-cbind(mat,exposure)

}

 

commat<-rbind(efftime,mat)

library(reshape2)

data.wide<-as.data.frame(commat)

colnames(data.wide)<-c(1:10)

data<-melt(data.wide,measure=c(1:10))

colnames(data)<-c(“id”,”exposure”)

data$case<-rep(c(1,rep(0,T-1)),5)

head(data)

 

library(survival)

mod<- clogit(case~exposure+strata(id),data)

summary(mod)

結果として得られたodds ratioは、前記事の未調整のORと大体同じになります。

 

Time trend adjustment with conditional logistic regression model

Case crossover designではcase自身をcontrolとして用いるため、年齢・性別・既往歴や基礎疾患といった症例の背景因子のような交絡因子は調整されているとして扱われています。しかしながら、トレンドの交絡を避けることができません。トレンドの交絡とは?ということですが、参考にしている文献(中国論文1とMaclure文献 2)では、MIの発現は日内変動のパターンを取ることが知られていることを例にしています。そしてコーヒーを飲むのもおそらく日内変動のパターンを取りそうです。そこで、朝、昼、午後、夜に対応して1, 2, 3, 4の値を取る変数clockを導入して調整します。(ただし、例題ではAMIの発症時刻が不明ですので、データがないということでwarningが出ます。私の感覚ではvariable にmissing dataがあるとその観察は計算から除外され、自由度が減るという方がしっくりきます。)

data$clock<-c(rep(1,T/(3654)),rep(2,T/(3654)),rep(3,T/(3654)),rep(4,T/(3654)))

mod.adj<- clogit(case~exposure+clock+strata(id),data)

summary(mod.adj)

1.
Zhang Z. Case-crossover design and its implementation in R. Ann Transl Med. 2016;4(18):341. [PubMed]
2.
Maclure M. The case-crossover design: a method for studying transient effects on the risk of acute events. Am J Epidemiol. 1991;133(2):144-153. [PubMed]

vigiRank beyond the BCPNN signal detection

先日の記事でBCPNNは、WHOが使用しているシグナル検出方法だ、というようなことを書きましたが実はWHOは少し軸足を別のものに移してきています。その名前はvigiRank。1,2

vigiRankとはどういうものでしょうか。まずは、説明です。3

vigiRank is a data-driven predictive model for emerging safety signals. In addition to disproportionate reporting patterns, it also accounts for the completeness, recency, and geographic spread of individual case reporting, as well as the availability of case narratives. Previous retrospective analysis suggested that vigiRank performed better than disproportionality analysis alone.

曰く、新興安全性シグナルを検出する、データ駆動予測モデル。不均衡な報告パターンに加えて、個別症例報告の以下の点を考慮する。

  • 完全性 4(具体的には性別・年齢・被疑薬の使用理由・投与開始日・イベント発現日・narrative・dechallenge rechallenge情報や転帰情報の有無を織り込んだ指標)
  • 最新性 (文献では直近3年の報告の件数(割合?)が示されていました)
  • 地理的な広がり (文献では複数国からの報告が例示されていました)
  • 病歴が入手されているか(定型文や断片的な情報は未入手扱い)

単純なdisproportionality分析より優れたパフォーマンスを示す可能性が示唆されている。

使うパラメータが増えた分利用できる症例数は減りそうです。次の動画の最後の方で紹介されています。この演者は全体にわかりやすいはっきりとした発音なのですが、WHOを「ダブリュエイチオー」ではなく、「フー」と発音しているので聞き落しなく。

スライドはこちら

<http://www.imi-protect.eu/documents/PROTECTSymposium-Tutorial-Statisticalsignaldetection-UMC.pdf>

References:

1.
Watson S, Chandler R, Taavola H, et al. Safety Concerns Reported by Patients Identified in a Collaborative Signal Detection Workshop using VigiBase: Results and Reflections from Lareb and Uppsala Monitoring Centre. Drug Saf. September 2017. [PubMed]
2.
Caster O, Juhlin K, Watson S, Norén G. Improved statistical signal detection in pharmacovigilance by combining multiple strength-of-evidence aspects in vigiRank. Drug Saf. 2014;37(8):617-628. [PubMed]
3.
Caster O, Sandberg L, Bergvall T, Watson S, Norén G. vigiRank for statistical signal detection in pharmacovigilance: First results from prospective real-world use. Pharmacoepidemiol Drug Saf. 2017;26(8):1006-1010. [PubMed]
4.
Bergvall T, Norén G, Lindquist M. vigiGrade: a tool to identify well-documented individual case reports and highlight systematic data quality issues. Drug Saf. 2014;37(1):65-77. [PubMed]

Case Crossover Design (2)

Case Crossover Design – (2)

Relative Riskの計算の流れ

前回のコードを少し詳しく見てゆきます。

コーヒーの一時的な効果は、飲んでから1時間継続すると仮定します。Vector c には、AMIで救急外来を受診した患者さんから聞き取った、コーヒーを飲んでからAMI発症までの時間(hr)を代入します。

  • t<-c(9,1/3,3,22,6,7,12,5,0.5,24)

1年間に何杯のコーヒーを飲むかという頻度(杯/year)をfrqに代入します。今回のこの値の使い方に基づき、一般化してこのスクリプトを使用する上では、1年あたりのTransient effect time(hr)がfrqという見方の方が良いだろうと思います。

  • frq<-c(730,365,36,1820,2920,24,730,730,3650,365)

Tには、1年間は何時間かという値を入れます。今回は全症例1年を観察期間にしたので定数になっていますが、一般化する上では、評価の対象にした観察期間と理解すると良いだろうと思います。症例ごとに観察期間が違う場合はTもベクターにできると思います。

  • T<-365*24

efftimeには、AMIの発症がコーヒーを飲んで1時間以上経過していたらfalse (0), 1時間未満であればtrue(1)というフラグを代入します。Transient effect timeを1hrにしていますので、判定の条件は t>=1を使用していますが、Transient effect timeが2hrなら判定条件をt>=2にしたらよいでしょう。その際もフラグ(返り値)は 0, 1のままで結構です。

  • efftime<-ifelse(t>=1,0,1)

RRの計算

Mantel-Haenszelの計算式からRR (relative risk) を計算します

としましたので、次の式になります。

  • rr<-sum(efftime*(T-frq))/sum((1-efftime)*frq)

 

分散を求める式では

この部分をコード化すると

  • var.log<-sum(frq*(T-frq))/(sum(efftime*(T-frq))*sum((1-efftime)*frq))

標準誤差は分散の平方根で以下のようになります

  • se.log<-sqrt(var.log)
  • lo.log<-log(rr)-1.96*se.log
  • hi.log<-log(rr)+1.96*se.log
  • lo<-exp(lo.log)
  • hi<-exp(hi.log)

 

ORの計算

オッズ比は次の式で表現されますので

これをコード化すると

  • or<-sum(efftime*(T-frq-(1-efftime)))/sum((1-efftime)*(frq-efftime))

分散は次のように表現されますので(元論文のこの式の「=」の左側、var[ln(RRchm)] は、おそらくvar[ln(ORchm)]の誤植だろうと思っています)

これをコード化すると次のようになります

  • var.log.or<-(sum(efftime*(T-frq-1+efftime)*(efftime+ T-frq-1+efftime))/(2*(sum(efftime*(T-frq-1+efftime)))^2))+(sum(efftime*(T-frq-1+efftime)*(1-efftime+frq-efftime)+(1-efftime)*(frq-efftime)*(efftime+(T-frq-1+efftime)))/(2*sum(efftime*(T-frq-1+efftime))*sum((1-efftime)*(frq-efftime))))+(sum((1-efftime)*(frq-efftime)*(1-efftime+frq-efftime))/(2*(sum((1-efftime)*(frq-efftime)))^2))

標準誤差は分散の平方根で以下のようになります

  • se.log.or<-sqrt(var.log.or)
  • lo.log.or<-log(or)-1.96*se.log.or
  • hi.log.or<-log(or)+1.96*se.log.or
  • lo.or<-exp(lo.log.or)
  • hi.or<-exp(hi.log.or)

で、集計にはこれとは別のアプローチが紹介されていましたので次の記事へつづきます

 

Sequence Symmetry Analysis (SSA)– (3)

問題の糸口が見えてきて

前記事で悩んでいた部分がクリアになってきました。そして、自宅SASのライセンスが切れていたという問題も解決しました。

このSASは無料で使用できてちょっとテストコードを走らせるのにはいいんですが、ビッグデータは扱えないなどの制限があります。OSIM2の巨大データも読み込めません。ただ、元データが大きくても実際の解析対象をデータを抽出して、絞ってデータのサイズを小さくすれば無料SASでも十分データ集計ができます。とりあえず、抽出した後の、_drug  _conditionのデータからスタートです。こんな感じのSASスクリプトを実行しました。

SASの実行結果

これは、基本的に他人様の書いたスクリプトなので、この結果が正解だろうという前提で提示しています。

自作のスクリプトで実行…おやっ?

で、同じデータを自作のスクリプトでも実行。自作スクリプトはSQLで集計して、統計的な集計はRで実行、と言う2段構えにしました。データ集計はSQLが快適で良いのですが、F分布の確率密度関数の扱いがSQLだけでは私が苦手なので、データを出力してRスクリプトを実行しました。初めからRでデータ集計をしたら良いのでは?と思うかもしれませんが、Rは大きなデータをデータフレームに入れようとすると、全部オンラインメモリに読み込もうとするのかメモリを食うわ、何かデータのコピーを繰り返すのかスピードが落ちるわ。しまいにはゲロはいて死んでしまいます。ですので、仕方なしにこんなことしています。で、次が実行結果です。

ASR_UCI, ASR_LCIの値が、SASの出力と微妙に一致しません。今回はすぐ気付いたけど、実は当初悩んでいたのも、この問題だったりして。

この状況は以前にもあった

上手のASRやNSRの出力を見て気づきました。以前と同じ失敗をやらかしてしまったようです。windowsのコントロールパネルの言語設定の追加の設定

の数値タブの小数点以下の桁数を増やします。

気を取り直して再チャレンジ

データを読み込みなおして、気を取り直して実行です。

これなら、SASの正解と一致します。めでたしめでたし。

SSAの理解も深まってきたし、これで集計する道筋がついたぞ。

 

Sequence Symmetry Analysis (SSA) – (1)

はじめに

以前Sequence Symmetry Analysis (SSA) がイマイチうまく算出できないという話を書いて、そのまま放置していましたけど、ここの所American College of Physiciansで新しいプロジェクトを開始するという件が、いよいよ動き出すことになってその準備が佳境に入ってきています。先週は、平日に会社を1日休んで準備にあてていました。勤労感謝の今日もかなりの時間をその準備に使っています。旗振り役の某大学の先生とも電話で打ち合わせしましたが、彼女は勤労感謝の今日も休日出勤で一日中病院にいらしたという事で、それでも、学会のプロジェクトの仕事もされていたようです。そうまでして、こういうプロジェクトをしようと言うバイタリティには脱帽です。わたしも、ACPのプロジェクトが忙しくなってきたので他の事はぼちぼち進めます。

本題の入り口

SSAについて、まずは日本語の資料から少しずつ読み解いてゆこうと思います。粗順序比は難しくないので、元資料でよいとおもいます。悩んでいるのは、無効果順序比の集計の説明パートから。

まず、ここで疑問が発生。ここに至る前段階で「調査期間中に新規にAとBが発生した患者」を選択しているので、この定義だと、必ずN=nになります。Nとnを分けて記述する意味があるのか? あるとして、いったいどういう事だろうか。

次に、aを求めるところで、分母にxについての∑があるので、観察期間人数の情報になると思うのだが、それを人数nの次元で割って確率になるのだろうか? 分母にも観察期間人数の次元のデータを以て来なくていいのだろうか?

この点を原著に戻って確認しないと、コード化できない感じです。つまり、入口の理解でつまずいていることが確認できました。

(つづく)

Changing high impact journal

2017年はproductivity の高い年を過ごしました。この文章の大部分を書いているのは2017年秋ですが、この記事を公開できるのはAnnals of Internal Medicine誌およびJAMA oncology誌でarticleが出版され公開された後にしましたので、もう2018年の冬です。2017年1年でCirculation のリサーチレター、Bone Marrow Transplant, Ann Int Med のレターそしてJAMA oncologyの短報が受理・出版されました。C誌、A誌、J誌でそれぞれ驚いた点があります。


Circulation: この雑誌に掲載された私の論文はVEGFシグナル系の阻害薬についての論文でした。投稿から受理まで、編集部・レビューワーとやり取りしてる間、一貫してVEGF阻害薬という表現でコミュニケーションしていました。解析したのはVEGFつまりリガンド側を阻害するものと、その受容体側を阻害するものがありました。これらをひっくるめて受容体の活性化を阻害するものという事で、広義ではVEGF阻害薬とまとめて表現しても間違っているわけではありません。その表現で一応専門家によるレビューも通っているのでアクセプトした状態から、その表現を変えるようにリクエストが来ることは通常はありません。ですが、今回はいざ出版という、ガリプルーフをもらうタイミングで「(狭義で)VEGF阻害といえば、リガンドの阻害薬であって、受容体の阻害薬を含める表現ではない」というような横やりが入り、出版直前で論文のタイトルの修正を依頼されました。一旦受理されていますので、出版部の方は低姿勢で依頼してきました。もちろん快く引き受けて、タイトルから本文、何か所も修正しました。ちゃんと全部修正ができているか念のため確認したりするのに神経と時間を使いました。

欧米の出版社とかは、業務をやっつけ仕事としてやっている人が多いだろうと思っていたので、出版物のクオリティを高めるけど出版スケジュールに悪影響が出かねない今回の様な対応をとったことは驚きでした。


Ann Int Med: この雑誌は、レターの投稿方法が一風変わっています。あたかもFacebookや一般のblogにコメントするような形で投稿します。ホームページ上で掲載された多くの研究論文には、下の方にコメント欄があって、そこに入力すれば投稿することになります。簡単な審査はあるようですが、スパムのようなものでなければ、投稿したコメントはしばらくしたら、ホームページ上で公開され、インターネットを介して誰でも見れるようになります。ただし、ホームページで公開されたコメントがすべて雑誌に掲載されるわけではありません。ホームページで公開されますと、一般の読者や元の研究論文の著者らの目に触れ、そうした人たちがコメントに対してさらにコメントしたりします。こういった、世の中の反応を見て編集者が雑誌に掲載するコメントを選びます。おそらく、盛り上がったやり取りがなされていたら、それはつまり、世の研究者らの関心が高い話題についての議論だということでしょう。ホームページにコメントを公開することで、世の中の注目度を観察して、それを参考に編集者は選んでいるのです。インターネットでの記事の公開と、紙面での雑誌の編集が双方向に作用しているのです。

一方で、この手軽さが問題を引き起こしました。通常の雑誌の記事の投稿であれば、投稿時に共著者の情報も正確に提出することが求められます。しかし、今回はとりあえずコメントと、筆頭著者の連絡先だけが求められていました。ですので、accept のレターには、共著者のメールアドレスを教えてほしい、という内容が書かれていました。ここで、大変な粗相をしてしまいました。じつは別のコメントについてacceptのレターが来たのと勘違いして、別の共著者にCOIのフォームやcopyright transferの確認をしてしまったのです。この時連絡を取ったみなさん、Ann Int Medにお名前が掲載されるとして喜ばれたはずです。「間違っていました、別の共著者と投稿した奴」でしたと説明するのが本当に気まずかったです。


JAMA oncology: こちらの編集の方にも驚かされました。投稿して2-3週間ほど経過したときにdecision letterが来ました。1週間ほどで来る連絡は通常忘門前払いです。編集者がざっと見てレビューワーにも回さずに返却します。2-3週間も速い方です。このタイミングで来る返信も経験的にはrejectが少なくありません。レビューワーがあまり深く読み込まずに、「この雑誌には向いていない」とか言って返します。でも今回は忘れもしません。健康診断を受けるために近くの医療センターで検査を待っているときにメールが届きました。健康診断の検査を受け、その待ち時間に何度もメールを読み返しました。それとほぼ同時にCOIのフォームやcopyright transferのレターが共著者の方にも送られていました。そして、内容はと言うとレビューワー二人がそろって興味を示してくださっていました。
・ This article should be prioritized for publication. (reviewer#1)
・ The conclusions are important to disseminate to practitioners quickly. (reviewer#2)
ところが、このprioritize, quicklyは若干曲者で、再解析が必要な内容を含め2-3週間で回答するようにという内容でした。通常であれば、2-3か月の間にリバイスするように要求されるのですが、異例の短さです。幸い、初回の投稿前に検討したようなデータでしたので、実際には再解析することなく、以前検討したデータを探してテーブルにまとめる程度で対応できました。

さらに、奇妙な指摘は続きます。「FDAのデータを使用したということだが、FDA内部でこの件は検討されているのか?」そう言われても、FDAを辞めたのは20年前だし、知り合いがいないわけではないが内部の事を聴けるような間柄ではないし。「公式の公開文書を見る限り、FDAが検討した形跡はない」としか答えられません。

異例なことは次のリバイスでも起きます。reviewer#2がなぜかご自身の名前を明かしたうえで、リバイスをリクエストしてきました。そんなに難しいことではなかったのですが10日ほどで対応しろと、その、スケジュール感が若干つらかったです。幸い、その週は会社の仕事がそこまで厳しくなかったので、平日も帰って夜にも集計をする気力が残っていました。

無事アクセプトされ、ガリプルーフが来ると驚いたことに、タイトルを修正され、アブストラクトの項目を結合して文章をまとめ、テーブルのタイトルを修正し、とかなりジャーナルのスタイルを優先した形での変更がなされていました。数値が多いのでQC箇所が多数です。テーブルも体裁が修正されたので一通り数値をチェックです。数か所コメントと修正依頼を書いて、それでアップルーブしました。アップルーブ後に共著者から、修正した個所に文法的な間違いが発生していることを指摘されましたが、データやデータの解釈等論文の主旨にかかるものではないエラーであるため、アップルーブ後の修正を求めないことにしました。

最後に、もう一点、JAMA oncologyは初回のレビューが終わった時点でtwitterでつぶやく言葉を一緒に述べるようにとリクエストしてきました。そう。出版社がつぶやく記事の宣伝のためにtwitter用の言葉も一緒に提出させるのです。このJAMAのtwitterやAnn Int Medのレターを見ますと、新しい技術・仕組みを取り入れて出版社も生き残りにチャレンジしているのです。また、Circulationの件のようにリスクを冒しても質を高めるようなこだわりの側面を見ました。これまで抱いていた欧米人のイメージを書き換えるような経験です。彼らチャレンジャーは旧態依然としたままでは、それぞれの世界で生き残れないのを知っているのでしょう。


2017年の年末に、東京大学医科学研究所の病院同窓会が開催されました。そこでの、研究所の所長の挨拶が印象に残っています。まず、第一声がマスメディアのカメラの前で頭を下げなければならないような事態が発生せず無事年を越せそうだ、として、職員に対して感謝の意を述べました。このくだり、言葉は違いますが同じ内容を病院長も延べられました。東京大学の研究所やその附属病院という、世間からの注目度も高い、そして、かなり大きな組織ですので、その組織の長をすることで神経をすり減らしていることが伝わってくるご挨拶です。

次に述べられたのが、研究所の歴史に絡んで、今後の生き残りについてのお話でした。東京大学医科学研究所は昨年開所125周年を迎えた記念行事を開催しましたが、開所当時は国民の健康に大きな影響を持っていたのは感染症でした。開所当時の伝染病研究所(現医科学研究所)が戦った標的は、感染症であり、感染性病原体でした。そしていまから50年前には、医科学研究所に改組され、遺伝子やゲノム研究に研究対象や手法がシフトしてゆきました。そして、現在医科研は研究対象を実社会で膨大に拡張してきている大規模データに舵を切ろうとしています。これもまた、生き残りをかけて新しい可能性にチャレンジしようとしているものだと思われます。

self-controlled case series (SCCS) – (2)

前回のおはなし

1. SCCSを再び

SCCSを自分なりにもう一度噛み砕いて計算の流れを納得した上で、それが間違っていないことを確認したいというのが目的再び挑戦です。前回使用した他人さまの書いたプログラムを参考に、計算の細かい考え方がわかったところで、もう一度どういう計算が必要かを考えています。始めは写真のような、手書きのスケッチで考え方を整理。

2.R→SQL

他人様の書いたRスクリプトを、SQLで表現しなおして、中間テーブルのデータを比較。結果を出力すると、正しいスクリプトだと38行になるところが、今回作成したスクリプトでは39行に?観察期間外にワクチンが接種された患者さんがいることを考慮した例外処理を含め忘れていました。

そんなこんなで、例外処理をするスクリプトを加えた結果が次の写真です。logの有効桁数が違うけどそれ以外内容は同じになりました。

 

3.  中間テーブルは一致したが…

上の通り、中間テーブルは一致しましたが、オッズ比が一致しません…そんな馬鹿な?しかも、だいたい同じくらいになるんだけど、微妙に不一致。

自分の集計結果:

論文の集計結果:

 

4.桁数が減っている???

いろいろ調べていると、SQL出力をcsvファイルにして、それをRに取り込んだところでデータの桁数(小数点以下)が減っています。元々小数点以下6桁あったはずなのに、2ケタに丸められています。何でこういうことになるのでしょうか? 読み込むRのread.csv関数の設定か? はたまた、読み込んだ後にdata.frameにするところで、宣言しなくてはいけないのか?

5. SQLの集計の出力がおかしい

結局読み取り側の問題ではなく、書き出しに問題ありでした。書き出しの際には、Windowsのコントロールパネルの言語設定のところから桁数を2 -> 6 と大きくすることが必要だということです。

 

6. めでたしめでたし

ちゃんとSQLのデータを吐き出すことに成功し、読み取って計算すると、論文のデータと一致しました。だいぶ理解が深まってきたぞ。

スクリプトはこちら

Letterを書くことについて

Letterを書くメリット

この記事は、以前私がqiitaで公開していた記事とそのコメントをまとめて、このHPに移動したものです。

Letter to the editor, correspondence, short communication等は考えたことを出版するにはよい選択肢である

  • 第一に、通常の論文より出版される機会が高い
  • 第二に、通常、タイトルが付いた学術雑誌の記事として索引されるので、文献検索システムで検索できる

Letters to the editor merit your consideration as a publication option:
– first, because letters and short pieces stand a better chance of being published than longer articles,
– and second, because published letters to the editor generally are titled and indexed, thus making them retrievable as articles in the journal.

Reference: LaVigne P. Letters to the editor. In: Taylor RB, Munning KA, eds. Written communication in family medicine. New York: Springer-Verlag; 1984:50.

Types of Letter

Letter to the Editorにはさまざまな型のものがある。

1. Attaboy (よくやった、でかした)

“I would like to congratulate Dr. Dellinger for anexcellent overview of cardiovascular management of septicshock.” で始まり, “This is a very useful clinicalreview in the management of a condition with a high mortalityrate, and I would certainly use this decision tree in my clinicalpractice”と結ぶようなレターの例がないわけではないが、その領域で名の知れた専門家でない限り、一般の研究者・医師がこの型のレターを投稿しても、紙面を割いてもらえる機会はあまり期待できないだろう。
Reference
Pravinkumar E. Letter: cardiovascular management of septic shock. Crit Care Med 2004;32(1):315

2. New Idea to Add

記事で述べられた知識をもとに、さらに議論を深めたいと思うことがあるだろう。糖尿病性足潰瘍の治療について述べられた記事に対して、2人の読者が“An effective adjunctive therapy for wound debridement that was not mentioned is maggot therapy”としてレターを投稿した。
糖尿病性足潰瘍に対するうじ虫治療の効果について、私は詳しくないが、6報の文献を参照しその科学的根拠を示していることに加え、その治療法を2名の読者が指摘するという点がその意義を支持している。
Rererence
Summers JB, Kaminski J. Letter: maggot debridement therapy for diabetic necrotic foot. AFP 2003;68(12):2327

3. Disagreement

記事に反対意見を表明する読者もいる。不妊患者のボディマスインデックス(BMI)と妊娠第一期の転帰について議論した記事に対して、2人の読者が“The authors finally concluded that outcome of singleton pregnancies in patients with infertility was not influenced by BMI. We disagree with these results”とレターを投稿した。
この場合も、複数の読者が反対意見を表明しているという点が一般性を支持している。もし、本当におかしな結論を導いている記事があれば、反対意見を表明するのは重要なことである。
Reference
Bellver J, Pellicer A. Letter: impact of obesity on spontaneous abortion. Am J Obstet Gynecol 2004;190:293

4. Statement of Concern

家庭の銃器と殺人・自殺のリスクを調査した疫学調査(ケースコントロールスタディ)の記事に対して、1人の読者が著者の主張(と編集者)に対して疑問を投げかけた。“I doubt the Annals’ editorial board would have published without commentary an article by a pro-gun organization purporting to defend gun ownership. The author’s affiliations with anti-gun ‘research’ groups are no less compelling an argument for bias”このレターと同じページに「銃所持反対」の著者によって書かれたという申し立てとともに掲載された。

今であればconflict of interestで明記すべき内容かもしれない。銃所持支持団体が銃のリスクを論じる文献を投稿したのであれば、バイアスが懸念されるのは当然のこと。ただ、COIに明記されているのであれば、あえて懸念があると指摘することはほとんど意味がないだろう。
Reference
Fritz DA. Letter: lies, damned lies, and statistics. Ann Emerg Med 2004;43(1):141

5. Sounding Off (主張)

特に記事を引用することなく、主張を述べる、一種の論説。”Medicine is not exact, and bad outcomes happen. The notion that physicians can follow a formula and avoid successful litigation is false”
確かに、医療は完全ではないので、悪い結果が出ることはあるもので、マニュアルに従っていれば訴訟を避けられるというのは嘘だろう。依頼されていない”Sounding Off” レターはタイムリー的を得た内容で、うまく叙述されていなければ掲載されないだろう。特に著者が無名の場合には。
References
Grant DC. Letter: I don’t want to hear about the “standard of care.” Ann Emerg Med 2004;43(1):139

6. Gotcha(捕まえた)

元記事に重要な事実の誤認~特に患者の治療方針にかかわるような誤認~があった場合に、指摘されれば掲載される見込みが高いだろう。痛風に対する低用量コルヒチンについての記事に対して、薬剤師が次のような指摘をした。

“discussed the use of low dose colchicine in gout. The treatment dose of colchicine, which has remained at 1 mg initially, followed by 500 mcg every 2-3 hours for many years, should be reviewed. However, they are incorrect to say that the current BNF (British National Formulary) recommends a regimen for colchicine that is unchanged since the 1966 edition. In September 1999 the BNF reduced the total dose of a course of colchicine from 10 to 6 mg. Before 1981 the BNF did not even state the higher limit of 10mg”

ガイドラインの記述を元記事の著者がちゃんと押さえていなかったのは、元記事の著者らの確認不足です。きちんと指摘してあげましょう。ごっちゃんです!

ちなみに、この”Gotcha”、英語版でpokemon goをプレイしている人にはポケモンを捕まえた時に出る言葉としておなじみだろう? 論文で重要な事実の誤認に気づくことは「ポケモンゲットだぜ!」みたいな、感覚で指摘して見ると良いだろう。

References
Cox AR. Letter: colchicine in acute gout. BMJ 2004;328:288

7. Transformed Research or Case Report

Letterの項に症例報告や原著に値する内容が掲載されることがある。おそらく原著として作成された原稿がいくつかのピアレビュージャーナルでrejectされ、そのうち編集者が短いレターにまとめるなら掲載できるかもしれないと持ちかけたのではないか。迷いとともに原著の情報の多くは無慈悲にもカットされ、Letterになるのであった。

最近では”research letter”というページを提供しているジャーナルもあり、”research letter”のページでは、語数が少ないだけで、原著と同様のピアレビューをする事が謳われているジャーナルが少なくない。

Letterを書くということ

Letter to the Editorを成功に導くのは、努力というよりはインスピレーションです。雑誌の記事を読んでいて手紙を書きたいという衝動にかられる事でしょう。たとえば、「私はこの話題について何かを知っている」とか「私が共有したい意見を持っています。」とか。もちろん、上で述べたとおり、一部のLetterは出版された記事に対してコメントするものではありません。

  • Letter to the Editorは、論説と雑誌のレビューを短く組み合わせた物。
  • 論点は一つに絞るように。2つ以上のアイデアを一つの短い手紙に詰め込もうとしない。
  • 書く際には、ほとんどの雑誌が求める厳しい語数の制限内に収まるように、一つ一つの単語を慎重に選択する必要がある。
  • 直観的な衝動に従って書き始めたとしても、出版される記事としてacceptされるには、職人のように細心の注意を払って、Letter をしたためなければならない。

編集者への手紙のほとんどは、出版された記事に対するコメントです。それらの例では、次のような一般的な構造があります。

  • Letterを書く論文に狙いを定めます。最初の文章では、あなたのコメントの対象となる論文を引用する。これは「参考文献1」になる。
  • あなたがLetter to the Editorを書いている理由を述べる。あなたの同意、意見の不一致、懸念、またはその他の理由を書く。
  • あなたの記載した内容に対する、根拠を述べる。根拠は、文献である場合や個人的な経験である場合がある。もちろん、学術論文に基づく証拠がベターです。
  • 要約を述べる。上記をすべて結びつけることで結論してください。
  • 文献を引用してください。多くの場合、Letter to the Editorには参考文献の引用がいくつかありますが、それほど多くはありません。

執筆を開始する前に、まず各紙のinstructions to authorsを読みます。通常instructionにはLetter to the Editorを投稿する際に満たすべき要件が記載されています。例えば、米国医師会雑誌(JAMA)では、「最近のJAMAの記事を議論するLetter to the Editorは、記事の発表から4週間以内に投稿すること、文章は400語以内で、参考文献は5報を超えてはならないとあります。New Engl J Medでは3週間以内。

同誌ではケース・シリーズや症例報告を含むオリジナルの研究を報告する研究論文もまた歓迎されています。その際には、文章は600語以内で、参考文献は6報を超えてはならず、表または図を1点まで含めることができます。

最近では多くのジャーナルで電子的に投稿することを求めています。

Letter to the Editorは、レビュー論文と同じように提出する必要があります。つまり、タイトルで始める必要があり、レターヘッドのない、普通の白紙に、二重の間隔で原稿を作成する必要があります。Letter to the Editorの原稿は、あなたが単に編集者宛に連絡しているのではないことを示すために、カバーレターと共に送付する事を求めるジャーナルもあります。

あなたはその話題について、何かを述べるだけの背景があることを示すような属性について述べる必要があります。また、潜在的な利益相反についても明らかにする必要があります。

最後に:手紙で議論する記事の著者と個人的に知り合っている場合は、書くべきではないかもしれません。あなたが研究を賞賛するなら、友情があることであなたのLetterは信用を損なうかもしれません。もっと悪いことは、研究を批判すると、あなたのコメントは個人的な攻撃として解釈される可能性があります。

Reference
Journal of the American Medical Association. Instructions for Authors. Available at: http://jama.ama-assn.org/inora_current/dtl.

/谷本先生から戴いたコメント/

臨床試験に関する書簡では、実際に臨床応用する場合の限界に着目し議論を進めると、採択の可能性を高めることができるでしょう。例えば、臨床試験の多くは合併症のない若年者が選択される場合がほとんどですが、実臨床では高齢者や臓器障害を有する患者に多く遭遇します。そのため、臨床試験から得られた知見をそのままの形で用いると問題が生じ得ます。編集者、さらには読者の内在的論理を的確に捉えた上で、彼らにとって、ひいては患者にとって有益な議論を構築して行くことが推奨されます。

/*参考資料1*/ 片岡裕貴先生によるLetterの書き方のLinkedInスライド

/*参考資料2*/井上和男先生によるLetterの書き方のブログ

/*参考資料3*/片岡裕貴先生によるLetterの書き方のワークショップ資料

/*参考資料4*/岩田健太郎先生のブログ. なぜレター執筆が優れた学習、教育手法なのかについて

self-controlled case series (SCCS)

はじめに

ここの所注力してきた仕事が一段落して、この週末は良い具合に一息つけます。

さかのぼること数か月、今後使うかもしれない、自分にとって新しい手法を試しておこうと、 Sequence Symmetry Analysis (SSA)をやってみたんだけど、これがイマイチ。何がイマイチって、製薬工業協会のホームページにSASのプログラムが公開されていて、それを見ながらやっているんだけど細かい数字が合わない。結果はだいたい近いところまでは行くんだけど、何か織り込むべきアイディアが足りないのか。ちなみに、作成にかかわったタスクフォースの方々の名誉のためにもう少し書いておきますと、この公開されているプログラムがおかしいというのではなく、まず、他人の書いたプログラムから、何がなされているのかというのを読み解くのはとても難しい作業で、このプログラムを参考にして、何がされているのかを読み取って、そのうえで自分にとってわかりやすいように書き換えるので、おかしなことが起きているのです。おそらくNull effect sequence ratio, NSRの計算のところがキモなのではないかと思いつつ、しばらくこちらは放置して頭を冷やすことにしていました。。

Self-controlled case series (SCCS)

SCCSとは?

同じself-controlledデザインのSCCSを試してみます。原理はこのスライド2ページ目。当時PMDAで東大epistatの竹内 由則さんが学会発表したスライドからです。

 

データ

データが公開されているので、手法を試すのにちょうどよいということで、試してみるのは、この文献Whitaker HJ, Farrington CP and Musonda P. Tutorial in Biostatistics: The self-controlled case series method. Statistics in Medicine 2006, 25(10): 1768-1797.に出てくるMMRワクチン後の髄膜炎。Table 2にOxford dataとして提示されています。

indiv eventday start end exday
1 398 365 730 458
2 413 365 730 392
3 449 365 730 429
4 455 365 730 433
5 472 365 730 432
6 474 365 730 395
7 485 365 730 470
8 524 365 730 496
9 700 365 730 428
10 399 365 730 716

データは10例ですべて。観察したのは、全員生後366日から730日。データのカラムstart, endは観察期間の開始を生後の日数で示しています。 exdayがワクチン接種の日、eventdayが髄膜炎と診断された日、で、これも生後の日数で示しています。
元論文では、at risk 期間をmumps virusのreplicationにかかる期間に基づいて、shotから15 – 35日後と設定しました。(元文献のTable 2では、ワクチン接種日は「pre-riskから14を引いた日」になります。ワクチン接種から14日目までがpre-risk, 15日目からがat-riskという考え方だと思います)ダウンロードしたデータにはワクチン接種日がexdayとして入力されていますので次のようにpre-risk(ex1), risk end (ex2)を計算します。設定したat riskの期間によってはスクリプトを触るべき個所がココということになります。

ex1 <- dat$exday + 14
ex2 <- dat$exday + 35

観察期間中のすべての日を、at riskの期間かどうか正確に分類したいので、ワクチン接種が331 – 715日のワクチン接種歴を要求した(原文)ということです。case #10は、716日にワクチンを接種していますが、潜伏期間が観察期間終了後まで継続しますので、結果として観察期間中にat riskの期間がありません。

データをグラフィカルに提示している図があったので、引用。灰色の期間がat riskの期間。そして、547で線が引いてあるのは、ここで年齢層を分けて調整因子として使用しているので、それを示すつもりで線を入れたのでしょう。(例示として示した図の中には、年齢層をまたぐリスク期間を有している症例が出てこなかったので、何を説明したくて547日で線を入れたのかわかりにくくなっていますが。)366 – 547 を1層、548 – 730を2層にしています。観察期間中にイベントが発生したら、それ以降は観察期間にしないというような操作を通常行いますが、この集計では、そうではありません。全体の観察期間を集計して、イベントがどの期間に発生したかというような思想で集計するようです。

年齢層をプログラムしているのはここです。

age <- c(547)

#age groups
agegr <- cut(cutp, breaks = c(min(dat$start), age, max(dat$end)), labels = FALSE)
agegr <- as.factor(agegr)

 

 

論文の結果

論文の結果が次の通りで、

自分でも計算

自分で実行した結果が次。めでたく、結果が一致していました。めでたしめでたし。

おわりに

実行したRのスクリプトがこちら。実行に当たっては私の環境に合うようにOpen Universityのホームページのスクリプトを一部改編しました。実行結果が論文で提示されていたものと一致するので、悪くはないだろうと思います。これでまた、新たな手法を用いたいろいろな評価ができる道筋が付きました。(つづく

AI 生成画像


こんにちは、皆さん!今日はちょっとした実験のお話をシェアしたいと思います。最近、このブログの記事を書くのに、AI技術を活用しているんですよ。具体的には、文章作成には「ChatGPT」を、アイキャッチ画像には「DALL-E」を使って、ネコの画像を生成しています。

「ChatGPT」とは、テキストベースの対話を生成するAIで、私がアイデアを投げかけると、それに基づいて記事を書いてくれるんです。一方、「DALL-E」は画像生成AIで、指定したテーマや内容に基づいて画像を作成してくれます。このブログでは特にネコの画像をよく使っているので、DALL-Eには大活躍してもらっています。

しかし、今日はちょっと違う方法を試してみました。新しいAIツール「Adobe Firefly」を使って、ネコの画像を生成してみたんです。Adobe Fireflyは、最近話題のクリエイティブな作業を支援するツールで、画像生成にも使えるんですよ。

結果はどうだったかというと、正直なところ、ちょっと印象が違っていました。DALL-Eで生成したネコの画像には慣れていたせいか、Fireflyで作った画像は新鮮ではあったものの、このブログの雰囲気には少し合わないなと感じたんです。そのため、今回は不採用という判断をしました。(下図)

AI技術は日々進化していて、色々なツールが登場しています。それぞれに特色があるので、使い分けながら最適なものを選んでいくのが楽しいですね。今後も新しいツールが出たら試して、その結果を皆さんにシェアしていきたいと思います。

それでは、今日はこの辺で。次回のブログでまたお会いしましょう!

Academic blogger’s toolkit 文献入力の画面が消えた

こんにちは、皆さん!今日は、私が長年愛用しているブログ用ツール「Academic Blogger’s Toolkit」についてお話しします。このツールは、特に学術的な内容を扱うブロガーにとって非常に便利なプラグインです。

Academic Blogger’s Toolkitとは?

このプラグインは、主に文献管理を目的として使用されています。以前は「Endnote」というツールを使っていたのですが、Academic Blogger’s Toolkitはそれの簡易版として機能します。論文を書く際には引用文献が必要不可欠ですが、文献の番号を振り直す作業は非常に手間がかかります。しかし、このツールは文献の番号を自動で振り直してくれるため、大変重宝しています。

使い心地と機能

Academic Blogger’s Toolkitはシンプルで使いやすいのが特徴です。しかし、ある時期から文献を入力する画面が表示されなくなってしまいました。原因は、使用しているサーバーのPHPバージョンが古く、プラグインのアップデートができなかったからです。今年に入ってからPHPがアップデートされたのを機に、プラグインもアップデートしましたが、残念ながら問題は解決しませんでした。ほかのcitation/bibliography管理ツールに切り替えるか迷ったのですが、このacademic blogger’s toolkitでcirculation​1​, JAMA oncology​2​, New Engl J Med​3​といった雑誌への投稿も準備してきたこともあって愛着があります。

解決策

他のツールへの切り替えも考えましたが、このツールには特別な愛着があります。そこで、いくつかのプラグインを外して試行錯誤した結果、ついに解決策を見つけました。なんと、「Classic Editor」プラグインを外すことで、文献入力画面が再び表示されるようになったのです!

まとめ

Academic Blogger’s Toolkitは、学術ブログを運営する上で非常に役立つツールです。もし同じような問題に直面している方がいれば、プラグインの設定を見直してみることをお勧めします。時にはシンプルな解決策が最も効果的かもしれませんね。

このツールによって、多くの学術雑誌への投稿準備もスムーズに行えています。今後もこの便利なツールを活用して、質の高いコンテンツを提供していきたいと思います。それでは、また次回のブログでお会いしましょう!

References

  1. Oshima Y, Tanimoto T, Yuji K, Tojo A. Association Between Aortic Dissection and Systemic Exposure of Vascular Endothelial Growth Factor Pathway Inhibitors in the Japanese Adverse Drug Event Report Database. Circulation. 2017;135(8):815-817. doi:10.1161/CIRCULATIONAHA.116.025144
  2. Oshima Y, Tanimoto T, Yuji K, Tojo A. EGFR-TKI-Associated Interstitial Pneumonitis in Nivolumab-Treated Patients With Non-Small Cell Lung Cancer. JAMA Oncol. 2018;4(8):1112-1115. doi:10.1001/jamaoncol.2017.4526
  3. Oshima Y, Yuji K, Tojo A. Eltrombopag in refractory aplastic anemia. N Engl J Med. 2012;367(12):1162; author reply 1163. doi:10.1056/NEJMc1209254

R summary tools

R summary tools

はじめに

R summary toolsを使ってみました。データフレームのデータを簡単にサマライズしてくれます。

Rスクリプトです

library(survival) #このパッケージに付属する lung というデータのサマリーを作成します
library(summarytools)


dfs <- summarytools::dfSummary(lung, max.distinct.values = 10) 
summarytools::view(dfs)

#### 結果のdfsと言うデータフレームを保存する必要なければパイプで表示に送って
summarytools::dfSummary(lung, max.distinct.values = 10) %>%
   summarytools::view()

 

解説です

このRスクリプトは、’survival’と’summarytools’という2つのライブラリを使って、’lung’というデータセットの概要を表示し、その概要を’dfs’というデータフレームに保存しています。 まず、’library(survival)’と’library(summarytools)’は、それぞれ’survival’と’summarytools’というライブラリを読み込むコマンドです。これらのライブラリは事前にインストールされている必要があります。 次に、’summarytools::dfSummary(lung, max.distinct.values = 10)’は、’lung’というデータセットの要約統計量を計算し、その結果をデータフレーム形式で返します。’max.distinct.values = 10’というオプションは、各列の異なる値が10以下の場合にはすべて表示し、それ以上の場合には最も頻繁に現れる10個の値のみ表示するという意味です。 このデータフレームは’dfs’という名前で保存され、’summarytools::view(dfs)’によって表示されます。 また、’summarytools::dfSummary(lung, max.distinct.values = 10) %>% summarytools::view()’という部分は、上記の2つの操作を1行で行うための別の書き方です。’%>%’はパイプ演算子と呼ばれ、左側の結果を右側の関数に渡します。この場合、’summarytools::dfSummary(lung, max.distinct.values = 10)’の結果が直接’summarytools::view()’に渡されて表示されます。

結果です

R CMPRSK パッケージ

CMPRSKパッケージとは

{cmprsk} は、競合リスクイベントのある生存時間分析を実施するためのRパッケージです1。具体的には、次の3つの機能を持っています:

  1. 群間の累積発生関数 (Cumulative Incidence Function; CIF) の同等性の比較検定 (Gray’s test): 異なる群の間でCIFの同等性を比較します。
  2. 推定されたCIFを表として出力する機能: 群ごとに推定されたCIFを表形式で表示します。
  3. 推定されたCIFをグラフとして出力する機能: 群ごとに推定されたCIFをグラフで視覚化します。

このパッケージは、Luca Scrucca氏による{cmprsk}パッケージに基づくラッパー関数であり、詳細な解説は本人のサイトで提供されています1

使用法と主な引数は以下の通りです:

  • ftime: 生存期間 (failure time variable)
  • fstatus: 発生したイベントを示すコード (variable with distinct codes for different causes of failure and also a distinct code for censored observations)
  • group: 比較する群を指定するコード (estimates will be calculated within groups given by distinct values of this variable)
  • t: CIFを評価する時点を指定するベクトル (a vector of time points where the cumulative incidence function should be evaluated)
  • strata: 層別化して検定を実施したい場合に指定する、層を示す変数 (stratification variable)
  • その他のオプション引数: rho, cencode, subset, na.action, level, xlab, ylab, col, lty, lwd, digits など

このパッケージを使って、競合リスクイベントのある生存時間データを効果的に分析できます

スクリプト

 

library(cmprsk)

# Fits the ’proportional subdistribution hazards’ regression model described in Fine and Gray (1999).
# This model directly assesses the effect of covariates on the subdistribution of a particular type of
# failure in a competing risks setting. The method implemented here is described in the paper as the
# weighted estimating equation.
# While the use of model formulas is not supported, the model.matrix function can be used to gener-
#   ate suitable matrices of covariates from factors, eg model.matrix(~factor1+factor2)[,-1] will
# generate the variables for the factor coding of the factors factor1 and factor2. The final [,-1]
# removes the constant term from the output of model.matrix.
# The basic model assumes the subdistribution with covariates z is a constant shift on the complemen-
#   tary log log scale from a baseline subdistribution function. This can be generalized by including
# interactions of z with functions of time to allow the magnitude of the shift to change with follow-up
# time, through the cov2 and tfs arguments. For example, if z is a vector of covariate values, and uft is
# a vector containing the unique failure times for failures of the type of interest (sorted in ascending
#                                                                                    order), then the coefficients a, b and c in the quadratic (in time) model az + bzt + zt2 can be fit by
# specifying cov1=z, cov2=cbind(z,z), tf=function(uft) cbind(uft,uft*uft).
# This function uses an estimate of the survivor function of the censoring distribution to reweight
# contributions to the risk sets for failures from competing causes. In a generalization of the method-
#   ology in the paper, the censoring distribution can be estimated separately within strata defined by
# the cengroup argument. If the censoring distribution is different within groups defined by covari-
#   ates in the model, then validity of the method requires using separate estimates of the censoring
# distribution within those groups.
# The residuals returned are analogous to the Schoenfeld residuals in ordinary survival models. Plot-
#   ting the jth column of res against the vector of unique failure times checks for lack of fit over time
# in the corresponding covariate (column of cov1).
# If variance=FALSE, then some of the functionality in summary.crr and print.crr will be lost.
# This option can be useful in situations where crr is called repeatedly for point estimates, but standard
# errors are not required, such as in some approaches to stepwise model selection.

# simulated data to test
set.seed(10)
ftime <- rexp(200)
fstatus <- sample(0:2,200,replace=TRUE)
cov <- matrix(runif(600),nrow=200)
dimnames(cov)[[2]] <- c('x1','x2','x3')
print(z <- crr(ftime,fstatus,cov))
summary(z)
z.p <- predict(z,rbind(c(.1,.5,.8),c(.1,.5,.2)))
plot(z.p,lty=1,color=2:3)
crr(ftime,fstatus,cov,failcode=2)
# quadratic in time for first cov
crr(ftime,fstatus,cov,cbind(cov[,1],cov[,1]),function(Uft) cbind(Uft,Uft^2))
#additional examples in test.R

 

以下にスクリプトの機能とそれぞれの部分の説明を提供します。

  1. ライブラリの読み込み:
    • library(cmprsk): {cmprsk}パッケージを読み込みます。
  2. シミュレートされたデータの作成:
    • set.seed(10): 乱数生成のシードを設定します。
    • ftime <- rexp(200): 200個の指数分布からなる生存時間データを生成します。
    • fstatus <- sample(0:2,200,replace=TRUE): 200個のランダムなイベントコード(0, 1, 2)を生成します。
    • cov <- matrix(runif(600),nrow=200): 200行3列の乱数行列を生成します。
    • dimnames(cov)[[2]] <- c('x1','x2','x3'): 列名を ‘x1’, ‘x2’, ‘x3’ に設定します。
  3. crr関数を使用して競合リスクイベントのある生存時間データを分析:
    • z <- crr(ftime,fstatus,cov): 群間の累積発生関数(CIF)の同等性を比較し、推定されたCIFを表として出力します。
    • summary(z): 分析結果のサマリーを表示します。
    • z.p <- predict(z,rbind(c(.1,.5,.8),c(.1,.5,.2))): 推定されたCIFを指定した時点で計算し、結果を表示します。
    • plot(z.p,lty=1,color=2:3): 推定されたCIFをグラフで表示します。
    • crr(ftime,fstatus,cov,failcode=2): 特定の失敗コードを持つデータを用いて再度分析を実行します。
    • crr(ftime,fstatus,cov,cbind(cov[,1],cov[,1]),function(Uft) cbind(Uft,Uft^2)): 最初の共変量に対して時間の2次項を考慮した分析を実行します。
  4. 追加の例:
    • test.Rファイルにさらなる例が含まれています。

このスクリプトは、競合リスクイベントのある生存時間データの解析に役立ちます。詳細な使い方やパラメータの調整については、{cmprsk}パッケージのドキュメントや解説を参照してください 123

 

# 実行結果
> print(z <- crr(ftime,fstatus,cov))
convergence:  TRUE 
coefficients:
      x1       x2       x3 
 0.26680 -0.05568  0.28050 
standard errors:
[1] 0.4211 0.3812 0.3810
two-sided p-values:
  x1   x2   x3 
0.53 0.88 0.46 
> summary(z)
Competing Risks Regression

Call:
crr(ftime = ftime, fstatus = fstatus, cov1 = cov)

      coef exp(coef) se(coef)      z p-value
x1  0.2668     1.306    0.421  0.633    0.53
x2 -0.0557     0.946    0.381 -0.146    0.88
x3  0.2805     1.324    0.381  0.736    0.46

   exp(coef) exp(-coef)  2.5% 97.5%
x1     1.306      0.766 0.572  2.98
x2     0.946      1.057 0.448  2.00
x3     1.324      0.755 0.627  2.79

Num. cases = 200
Pseudo Log-likelihood = -320 
Pseudo likelihood ratio test = 1.02  on 3 df,
> z.p <- predict(z,rbind(c(.1,.5,.8),c(.1,.5,.2)))
> plot(z.p,lty=1,color=2:3)
> crr(ftime,fstatus,cov,failcode=2)
convergence:  TRUE 
coefficients:
      x1       x2       x3 
-0.31390 -0.03488 -0.52500 
standard errors:
[1] 0.4517 0.4475 0.4675
two-sided p-values:
  x1   x2   x3 
0.49 0.94 0.26 
> # quadratic in time for first cov
> crr(ftime,fstatus,cov,cbind(cov[,1],cov[,1]),function(Uft) cbind(Uft,Uft^2))
convergence:  TRUE 
coefficients:
                            x1                             x2                             x3 
                       2.16500                       -0.06664                        0.27490 
cbind(cov[, 1], cov[, 1])1*Uft cbind(cov[, 1], cov[, 1])2*tf2 
                      -3.25200                        0.81900 
standard errors:
[1] 0.9464 0.3797 0.3854 1.2590 0.2925
two-sided p-values:
                            x1                             x2                             x3 
                        0.0220                         0.8600                         0.4800 
cbind(cov[, 1], cov[, 1])1*Uft cbind(cov[, 1], cov[, 1])2*tf2 
                        0.0098                         0.0051

次に、Rの cmprsk パッケージを使用して、競合リスク(competing risks)の累積発生率を比較するための解析を行っています。

############################
set.seed(2)
ss <- rexp(100)
gg <- factor(sample(1:3,100,replace=TRUE),1:3,c('a','b','c'))
cc <- sample(0:2,100,replace=TRUE)
strt <- sample(1:2,100,replace=TRUE)
print(xx <- cuminc(ss,cc,gg,strt))
plot(xx,lty=1,color=1:6)
# see also test.R, test.out

具体的には、次の手順を実行しています:

  1. データの生成:
    • set.seed(2) で乱数のシードを設定しています。
    • rexp(100) で指数分布に従うランダムなイベント時間を生成しています。
    • sample(1:3, 100, replace=TRUE) でランダムなイベントの状態(3つのグループ ‘a’, ‘b’, ‘c’)を生成しています。
    • sample(0:2, 100, replace=TRUE) でランダムな検閲状態(0, 1, 2)を生成しています。
    • sample(1:2, 100, replace=TRUE) でランダムな開始時点を生成しています。
  2. cuminc 関数の実行:
    • cuminc(ss, cc, gg, strt) で競合リスクの累積発生率を計算しています。ss はイベント時間、cc はイベントの状態、gg はグループ、strt は開始時点です。
  3. 結果の表示:
    • print(xx) で計算された累積発生率を表示しています。
  4. グラフの描画:
    • plot(xx, lty=1, color=1:6) で累積発生率のグラフを描画しています。

############################
set.seed(2)
ss <- rexp(100)
gg <- factor(sample(1:3,100,replace=TRUE),1:3,c(‘a’,’b’,’c’))
cc <- sample(0:2,100,replace=TRUE)
strt <- sample(1:2,100,replace=TRUE)
print(xx <- cuminc(ss,cc,gg,strt))
plot(xx,lty=1,color=1:6)
# see also test.R, test.out

############################
set.seed(2)
ss <- rexp(100)
gg <- factor(sample(1:3,100,replace=TRUE),1:3,c('a','b','c'))
cc <- sample(0:2,100,replace=TRUE)
strt <- sample(1:2,100,replace=TRUE)
print(xx <- cuminc(ss,cc,gg,strt))
plot(xx,lty=1,color=1:6)
# see also test.R, test.out

このコードは、競合リスクの解析において、各グループの累積発生率を比較するための有用な手法を示しています。12

詳細については、公式ドキュメントをご参照ください:cmprsk パッケージ1

> print(xx <- cuminc(ss,cc,gg,strt))
Tests:
      stat        pv df
1 1.598854 0.4495865  2
2 3.390543 0.1835493  2
Estimates and Variances:
$est
             1         2         3         4
a 1 0.27262599 0.3216446 0.3216446 0.3216446
b 1 0.08877315 0.3423257 0.3423257 0.3423257
c 1 0.23368736 0.4312495 0.4879272 0.4879272
a 2 0.38424403 0.5607109 0.5607109 0.5607109
b 2 0.31463271 0.4786961 0.5234407 0.5234407
c 2 0.20127996 0.3420399 0.3420399 0.3420399

$var
              1           2           3           4
a 1 0.008596053 0.009950848 0.009950848 0.009950848
b 1 0.002491270 0.009675072 0.009675072 0.009675072
c 1 0.006341967 0.011566190 0.012617195 0.012617195
a 2 0.010293273 0.022358101 0.022358101 0.022358101
b 2 0.007220502 0.010014466 0.010588994 0.010588994
c 2 0.005699657 0.010260038 0.010260038 0.010260038

 

 

R excess mortality

超過死亡率の集計

コロナ禍で超過死亡が話題になる事がありましたがどうやって計算しているのかよく知らなかったので少しひも解いてみました。参照した文献はこちら。使用したのはexcessmortパッケージです。

このパッケージにはCDCが公開する、州別で、週ごとの死亡者数の見積もり、に加えて人口の見積もり(Censusという人口統計からの変化を計算した見積もり)の情報がcdc_state_countsというデータフレームで含まれます。これを利用して、新型コロナが流行し始めた2020年以降データと、死亡の多かった2017-18のインフルエンザシーズンを除外したデータを基に、それらの死亡の影響がない場合の期待される死亡のトレンド・季節変化を計算します。そのうえで、そのモデルからの逸脱状況をプロットします。(その逸脱分が新型コロナ(と2017-18はインフルエンザ)の影響と解釈したいという仮説で集計します)

メリーランド州を選択したのは、以前住んでいたからです。

library(excessmort)
library(dplyr)
library(lubridate)
library(ggplot2)



# A list with six ggplot objects: ‘population‘ is a time series plot of the population. ‘seasonal‘ is a
# plot showing the estimated seasonal effect. ‘trend‘ is a time series plot showing the estimated trend.
# ‘weekday‘ is a plot of the estimated weekday effects if they were estimated. ‘expected‘is a time
# series plot of the expected values. ‘residual‘ is a time series plot of the residuals.

flu_season <- seq(make_date(2017, 12, 16), make_date(2018, 1, 16), by = "day")
exclude_dates <- c(flu_season, seq(make_date(2020, 1, 1), today(), by = "day"))
res <- cdc_state_counts %>%
  filter(state == "Maryland") %>%
  compute_expected(exclude = exclude_dates,
                   keep.components = TRUE)

p <- expected_diagnostic(expected = res, alpha = 0.50)
p$population
p$seasonal
p$trend
p$expected
p$residual

 

このRのコードは、統計解析のために使用されるパッケージや関数を活用しています。以下に、コードの動作をプログラム初心者向けに説明します。

  1. ライブラリの読み込み:
    • excessmort, dplyr, lubridate, および ggplot2というライブラリを読み込んでいます。これらはデータの操作、時系列解析、グラフ作成に役立ちます。
  2. データの前処理:
    • flu_seasonは2017年12月16日から2018年1月16日までの日付を生成しています。
    • exclude_datesは特定の日付範囲を除外するために使用されています。
  3. データのフィルタリングと計算:
    • cdc_state_countsから州が「Maryland」のデータを抽出しています。
    • compute_expected関数を使用して期待値を計算しています。keep.components = TRUEは成分を保持するオプションです。
  4. グラフの作成:
    • expected_diagnostic関数を使用して、期待値の診断プロットを作成しています。
    • このプロットには以下の要素が含まれています:
      • population: 人口の時系列プロット
      • seasonal: 推定された季節効果のプロット
      • trend: 推定されたトレンドの時系列プロット
      • expected: 期待値の時系列プロット
      • residual: 残差の時系列プロット

このコードは、データの前処理からグラフの作成までの一連のステップを示しています。プログラム初心者にとっては、ライブラリの読み込みやデータの操作、グラフの作成などが理解しやすいポイントです。12

  • population: 人口の時系列プロット;y軸を操作して変化がわかりやすくした図も掲載します

  • seasonal: 推定された季節効果のプロット;同上

 

  • trend: 推定されたトレンドの時系列プロット;同上

 

 

  • expected: 期待値の時系列プロット;同上

この周期性の変化のモデル(赤い線と帯)が期待値で、実際の週ごとの死亡数をプロットしたものが下図になります。

 

  • residual: 残差の時系列プロット

R epibasixを触ってみた

epibasixパッケージの関数を試して見ました

sensSpec関数

このRコードは、疫学研究において新しい検査法や自己報告を現行のゴールドスタンダードと比較する際に、感度、特異度、Youden指数、および一致率を計算するためのものです。

library(epibasix)

# This function is designed to calculate Sensitivity, Specificity, Youden’s J and Percent Agreement.
# These tools are used to assess the validity of a new instrument or self-report against the current
# gold standard. In general, self-report is less expensive, but may be subject to information bias.
# Computational formulae can be found in the reference.

dat <- cbind(c(18,1), c(19,11))
summary(sensSpec(dat))

# Szklo M and Nieto FJ. Epidemiology: Beyond the Basics, Jones and Bartlett: Boston, 2007 P.315
  • 感度 (Sensitivity): 検査法が疾患を正しく検出する能力を評価します。感度は、疾患の存在する人々のうち、検査で陽性と判定された割合を示します。
  • 特異度 (Specificity): 検査法が健康な人々を正しく陰性と判定する能力を評価します。特異度は、健康な人々のうち、検査で陰性と判定された割合を示します。
  • Youden指数 (J): Youden指数は、感度と特異度のバランスを示す指標です。Youden指数は、感度と特異度の和から1を引いた値で計算されます。Youden指数が高いほど、検査法の性能が良いことを意味します。
  • 一致率 (Percent Agreement): 現行のゴールドスタンダードと新しい検査法の結果が一致する割合を示します。一致率は、両者の結果が同じと判定された割合です。

このコードでは、epibasixパッケージを使用して、与えられたデータセットから感度、特異度、Youden指数、および一致率を計算しています。具体的な計算式は、参考文献で確認できます1

このような指標を使用することで、新しい検査法の有効性を評価し、疫学研究において適切な判断を行うことができます。

sensSpec関数の実行結果

> summary(sensSpec(dat))

 Detailed Sensitivity and Specitivity Output 
 
Input Matrix: 
           Gold Standard A Gold Standard B
Reported A              18              19
Reported B               1              11

The sample sensitivity is: 94.7% 
95% Confidence Limits for true sensitivity are: [84.7, 104.8]

The sample of specificity is: 36.7% 
95% Confidence Limits for true specificity are: [19.4, 53.9]

The sample value of Youden's J is: 31.4
95% Confidence Limits for Youden's J are: [11.4, 51.4]

Sample value for Percent Agreement (PA) is: 59.2% 
95% Confidence Limits for PA are: [45.4, 72.9]

ま、そういう事みたいです。

univar関数

このRコードは、単一の変数に対する詳細な単変量解析を提供します。具体的には、以下の統計量を計算します:

  • 平均 (mean): 観測値の平均値。
  • 中央値 (median): 観測値の中央値。
  • 標準偏差 (standard deviation): 観測値のばらつきの尺度。
  • 範囲 (range): 観測値の最小値から最大値までの幅。
  • 仮説検定と信頼区間のツール

具体的な使用方法は次の通りです:

#This function provides detailed univariate analysis for a single variable. Values include the sample
# mean, median, standard deviation and range, as well as tools for hypothesis tests and confidence
# intervals.

x <- rexp(100)
univar(x)

# Casella G and Berger RL. Statistical Inference (2nd Ed.) Duxbury: New York, 2002.

univar関数の実行結果

> x <- rexp(100)
> univar(x)

Univariate Summary
 
Sample Size: 100
Sample Mean: 0.972 
Sample Median: 0.632 
Sample Standard Deviation: 0.986 

ま、このパッケージは他のものでカバーできそうかな

 

Rで二項分布をまとめて計算

二項分布をまとめて計算

はじめに

複数の頻度と95%信頼区間を計算したい。普段、頻度とその95%信頼区間はbinom.test(a, b)を用いて計算しています。これに、データフレームのデータを流し込んで一気に、頻度 estimateと信頼区間の上限upperと下限lowerの値をベクトルとして得たい。

サンプルコード

bunsi <- c(1, 2, 3, 4)
bunbo <- c(10, 15, 16, 20)
df <- data.frame(bunsi, bunbo)

result <- mapply( binom.test, df$bunsi, df$bunbo ) 
estimates <- unlist(result[5,]) # estimate, 頻度
conf_int <- matrix ( unlist(result[4,]) , byrow=F, nrow=2 ) # conf.int
lower <- conf_int[1,]
upper <- conf_int[2,]

解説

このRスクリプトは、4つの異なる二項分布に関する二項検定を行っています。 まず、ベクトル`bunsi`と`bunbo`が定義されており、それぞれ成功回数と試行回数を表しています。

次に、これらのベクトルを使用してデータフレーム`df`が作成されます。

`mapply`関数は、`binom.test`を用いて、`df`の各行について二項検定を行います。`binom.test`は、二項分布における成功の確率を推定し、その確率が指定した値(デフォルトでは0.5)から有意に異なるかどうかを検定します。

結果のリストから、`estimates`(推定値)と`conf_int`(信頼区間)が抽出されます。`estimates`は成功の確率の推定値を、`conf_int`はその95%信頼区間を表しています。

最後に、信頼区間の下限`lower`と上限`upper`が抽出されています。 したがって、このスクリプトは4つの二項分布の成功確率を推定し、その信頼区間を計算しています。

二重ルーターになっていないか

二重ルーター

自宅のネットが遅いとき、ハブのつもりで設定している機器が複数ルーターになっていたら、それを解消するだけで良くなるかもしれません。

方法

windows 標準プログラムにある、コマンドプロンプトで次を入力します

Tracert -d 8.8.8.8

出力に以下で始まるアドレスが2つ以上あったら、家のネットにつながっている機器の設定を片端から確認しましょう。

  • 192.
  • 172.
  • 10.

「ブリッジモード」「アクセスポイントモード(APモード)」なら〇
「ルーター」なら×

 

コマンドの意味

`tracert -d 8.8.8.8`はWindowsのコマンドプロンプトで使われるコマンドです。 ここで、`tracert`は”trace route”の略で、インターネット上のルートを追跡するためのツールです。指定された宛先ホストまでのIPネットワークルートを表示します。これはパケットが送信元から宛先までどのルートをたどるかを確認するために使用されます。 `-d`オプションは、途中のルートでの名前解決を行わないことを指示します。つまり、各ホップのIPアドレスを表示しますが、それらのIPアドレスに関連するホスト名は表示しません。 `8.8.8.8`はGoogleの公開DNSサーバの一つのIPアドレスです。 したがって、`tracert -d 8.8.8.8`コマンドは、現在のマシンからGoogleのDNSサーバまでのルートを追跡し、その各ホップのIPアドレスを表示します。 ただし、今回のプロジェクトではインターネットへのアクセスを前提としたコードを生成できないため、このコマンドをプログラム内で使用することはできません。

R データフレームのカラム名の変更

R データフレームのカラム名の変更

dplyr パッケージのrenameを使います。

rename ([新しいカラム名1] = [現在のカラム名1], …., [新しいカラム名n] = [現在のカラム名n])

library(dplyr)

LineList %>%  
  rename(Srsnss    = ILD重篤性,
         WrstGrade = ILD最悪Grade) -> LineList

この例では、Rコードはdplyrパッケージを利用しています。dplyrはデータ操作と変換を行うためのツールを提供するRパッケージです。

このコードは、LineListというデータフレームのカラム名を変更しています。具体的には、”ILD重篤性”というカラム名を”Srsnss”に変更し、”ILD最悪Grade”というカラム名を”WrstGrade”に変更しています。変更後のデータフレームはLineListRに格納されます。

%>%はパイプオペレータと呼ばれ、左側のオブジェクトを右側の関数に引数として渡す役割を果たします。これにより、コードを読みやすく、理解しやすくすることができます。

Rでデータ整理

上のようなデータがあったとして、dplyrで少し成形します

  1. filter() … 行の選択
  2. arrange() … 行の並び替え
  3. select() … 指定した列のみ選択
  4. mutate() … 新しい列の追加
  5. group_by() … グルーピング
  6. summarize() … 集計

 

tidyverse のフィルターを使って

library(tidyverse)
library(readxl)
library(dplyr)

df <- read_xlsx("0050 irAE.xlsx")

df %>%  
  filter(ir_AE == -1) %>% # ir_AE が-1(TRUEを-1で入力してある)の行のみ選択
  arrange(Time2Onset) %>% # Time2Onsetの順に並べ替え(この後平均を取るので意味なし😛)
  group_by(`医薬品(一般名)`, irAE ) %>% # 医薬品およびirAEごとにグループ化
  summarise(avTO = mean(Time2Onset))  -> newDF # 医薬品・irAE毎のTime2Onset平均値を計算して、newDFというデータフレームへ書き出す

以下のような出力になりました

 

解説

このRスクリプトは、指定されたExcelファイルからデータを読み込み、特定の条件に基づいてデータをフィルタリング、並べ替え、グループ化し、平均値を計算します。

まず、”tidyverse”と”readxl”、”dplyr”という3つのRパッケージを読み込みます。

次に、read_xlsx関数を使用して、指定されたExcelファイル(“0050 irAE.xlsx”)からデータを読み込み、dfという名前のデータフレームに格納します。

その後、dfデータフレームを使用して、ir_AE列が-1(TRUEを-1で入力してある)の行のみを選択します。さらに、Time2Onset列の値を基準に昇順に並べ替えます(ただし、この後の平均値の計算には影響しません)。

次に、医薬品(一般名)とirAEの値を基準にグループ化し、それぞれのグループごとにTime2Onsetの平均値を計算します。計算結果は、”医薬品(一般名)”と”irAE”、”avTO”という列名を持つ新しいデータフレームnewDFに格納されます。

以上が、このRスクリプトの動作です。

Translate »