前回求めたRORにおいては1薬剤に対して1症状という1:1対応であったり、また年代・性別などは考慮できなかったが、一般化線形回帰モデルを使ってこの辺りについて求めてみる。


前回とは異なり、「NSAIDsとニューキノロン系抗菌薬の併用で痙攣が増える」という既知の話について、JADERデータで「NSAIDsとニューキノロン系の交互作用の時に痙攣の報告が(他の薬よりも)多くなる」ということを示してみたい。
 



1。有害事象・薬剤の検索

#
まず有害事象ADRについては、痙攣orてんかんに当てはまる有害事象で検索すると、
> reac_t <- reac[ grep("痙攣|てんかん", reac[["有害事象"]]) , ] ; table(reac_t[,4])

                        てんかん てんかんにおける原因不明の突然死                   てんかんの前兆                 てんかん重積状態 
                            1047                               11                                3                              297 
                  てんかん性脳症                   てんかん精神病             ミオクロニーてんかん                   外傷後てんかん 
                               2                                9                               57                                1 
                      間代性痙攣                         眼瞼痙攣                         顔面痙攣                       気管支痙攣 
                             111                               32                               29                              125 
                      強直性痙攣                       局在性痙攣                         血管痙攣                     口腔咽頭痙攣 
                             187                                7                                6                                2 
                        喉頭痙攣                 抗痙攣剤濃度減少           抗痙攣剤濃度治療量以下           抗痙攣剤濃度治療量以上 
                              39                                5                                1                                3 
                抗痙攣剤濃度増加                         子宮痙攣       若年性ミオクロニーてんかん                         小児痙攣 
                              36                                1                                4                                6 
                  小発作てんかん                         食道痙攣                       新生児痙攣                   先天性てんかん 
                              42                                2                               21                                1 
                  前頭葉てんかん                   側頭葉てんかん               胎児抗痙攣剤症候群           低カルシウム血症性痙攣 
                               3                               12                               21                                3 
            低ナトリウム血性痙攣                     低血糖性痙攣                     点頭てんかん               特発性全般てんかん 
                               3                               68                               13                                1 
    乳児重症ミオクロニーてんかん                         熱性痙攣                           熱痙攣                 脳卒中後てんかん 
                               1                              221                                1                                1 
                脳卒中後痙攣発作                   薬物離脱性痙攣           良性ローランドてんかん                   痙攣性発声障害 
                               1                               12                                1                                1 
                        痙攣発作 
                            3189 

という分布なので、簡便のために「痙攣発作」だけ拾ってみることにする。
(*十分に網羅的ではないので本来はダメだが、ここでは簡易に示すdemonstrationとして)

R codeでは、
> demo[ intersect(demo$ID,  reac[ reac[["有害事象"]] %in% c("痙攣発作") , "ID"]) ,  "seizure"] <- 1    # 
> demo$seizure <- ifelse( is.na(demo$seizure)==T, 0, 1)
> table(demo$seizure)

     0      1 
370831   3189 
となる。



#
またニューキノロン系抗菌薬の種類としては、「フロキサシン」「キサシン」に当てはまる薬剤を拾ってみると:
> drug_t <- drug[ grep("フロキサシン|キサシン", drug[["医薬品.一般名."]]) , ] ; table(drug_t[,5])

              エノキサシン水和物                   オフロキサシン           ガチフロキサシン水和物                   ガレノキサシン 
                               1                               83                              212                                1 
                シタフロキサシン           シタフロキサシン水和物                     シノキサシン               シプロフロキサシン 
                               1                              119                                2                              361 
  シプロフロキサシン塩酸塩水和物               スパルフロキサシン トスフロキサシントシル酸塩水和物                 ナジフロキサシン 
                             190                               25                              458                               13 
                ノルフロキサシン       パズフロキサシンメシル酸塩               プルリフロキサシン                   フレロキサシン 
                              33                              375                               89                                4 
    メシル酸ガレノキサシン水和物         モキシフロキサシン塩酸塩         ラスクフロキサシン塩酸塩                 レボフロキサシン 
                            1370                              504                                3                                4 
          レボフロキサシン水和物           塩酸シプロフロキサシン             塩酸ロメフロキサシン 
                            2373                                1                               30 
とあるので、点眼・軟膏などもあるのはここでは承知の上で、
ある程度多い薬だけ(「レボフロキサシン」「シプロフロキサシン」「ガレノキサシン」「モキシフロキサシン」「トスフロキサシン」「パズフロキサシン」「ガチフロキサシン」)を拾ってみることにする。codeでは、
> demo[ intersect(demo$ID,  drug[ grep( "レボフロキサシン|シプロフロキサシン|ガレノキサシン|モキシフロキサシン|トスフロキサシン|パズフロキサシン|ガチフロキサシン" , drug[["医薬品.一般名."]] ) , "ID"]),  "quinolone"] <- 1    # 
> demo$quinolone <- ifelse( is.na(demo$quinolone )==T, 0, 1)
> table(demo[,c("quinolone")])

     0      1 
368250   5770 
となる。



#
さらにNSAIDsは色々あるが、よく使われるやつとして
> drug_t <- drug[ grep("アスピリン|ロキソプロフェン|イブプロフェン|ジクロフェナク", drug[["医薬品.一般名."]]) , ] ; table(drug_t[,5])

                                                          アスピリン                                           アスピリン・アスコルビン酸 
                                                                3494                                                                    5 
                                        アスピリン・ダイアルミネート                                   アスピリン・ダイアルミネート小児用 
                                                                 308                                                                   10 
                            アスピリン・ボノプラザンフマル酸塩配合剤                                   アスピリン・ランソプラゾール配合剤 
                                                                   1                                                                   89 
                                                      イブプロフェン                                           イブプロフェン L−リシン 
                                                                 259                                                                   61 
イブプロフェン, リン酸ジヒドロコデイン, dl−塩酸メチルエフェドリン                                             イブプロフェンピコノール 
                                                                   1                                                                    3 
                                    クロピドグレル硫酸塩・アスピリン                                             ジクロフェナクナトリウム 
                                                                  33                                                                 1915 
                                                    ロキソプロフェン                                           ロキソプロフェンナトリウム 
                                                                   1                                                                    2 
                                    ロキソプロフェンナトリウム水和物                                                     低用量アスピリン 
                                                                3411                                                                    1 
あたりから見繕ってみることにする。(*これも本当はダメだが(以下略))
codeでは、
 
> demo[ intersect(demo$ID,  drug[ grep( "アスピリン|ロキソプロフェン|イブプロフェンジクロフェナク" , drug[["医薬品.一般名."]] ) , "ID"]),  "NSAIDs"] <- 1    # 
> demo$NSAIDs <- ifelse( is.na(demo$NSAIDs )==T, 0, 1)
> table(demo[,c("NSAIDs")])

     0      1 
366763   7257 

となる。

・seizure=「痙攣発作」の有無(時期・程度は問わない)
・quinolone=選択したキノロン系のいずれかの内服の有無(重複・時期は問わない)
・NSAIDs=選択したNSAIDsのいずれかの内服の有無(重複・時期は問わない)
という2値変数が3つ得られたことになる。



2。年代・性別の前処理

多変量でやるので年代・性別の情報も含められるように前処理しておく。
年代は、10歳代→数値の10、30歳代→数値の30、というように変換してみるとして(階級中央値にする手もある)、また10歳未満や超高齢、また「成人」など曖昧な例は除外することにすると、一例としては
demo$age_decades <- NA
demo[ grep( "10歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 10L
demo[ grep( "20歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 20L
demo[ grep( "30歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 30L
demo[ grep( "40歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 40L
demo[ grep( "50歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 50L
demo[ grep( "60歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 60L
demo[ grep( "70歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 70L
demo[ grep( "80歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 80L
demo[ grep( "90歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 90L
demo[ grep( "100歳代" , ( demo[,"年齢"] ) ) , "age_decades"] <- 100L
で変換できる。

性別は、女性=1, 男性=0として、不明例はNAとするならば、
demo$genderF <- NA
demo[ grep( "男性", demo[,"性別"] ) ,"genderF"] <- 0L
demo[ grep( "女性", demo[,"性別"] ) ,"genderF"] <- 1L
で変換できる。 



3。一般化線形回帰モデル


ここで、seizureの有無に対して、NSAIDs内服、キノロン内服、またこれらを同時に服用しているかどうか、で回帰させてみる。
よくある一般化線形回帰モデルを使う。2値なのでfamily="binomial" を忘れないようにする。
> glm1 <- glm( seizure ~ quinolone + NSAIDs + quinolone:NSAIDs  + genderF + age_decades , data = demo ,family="binomial" )
> cbind( exp(coef(glm1)),  as.data.frame(summary(glm1)$coefficients) )
                 exp(coef(glm1))     Estimate   Std. Error     z value     Pr(>|z|)
(Intercept)           0.01910913 -3.957589264 0.0593437475 -66.6892374 0.000000e+00
quinolone             3.48584338  1.248710019 0.0903187102  13.8255962 1.786263e-43
NSAIDs                0.32123680 -1.135576725 0.2683226327  -4.2321317 2.314868e-05
genderF               0.99450365 -0.005511512 0.0405749404  -0.1358354 8.919514e-01
age_decades           0.98197728 -0.018187105 0.0009944565 -18.2884877 1.022117e-74
quinolone:NSAIDs      7.66209507  2.036285454 0.3534272323   5.7615409 8.334946e-09

左端の列が、各要素についてのseizureに対する調整後Odds比に相当するものであり、一番下のquinolone:NSAIDs(つまりこれらの交互作用項)は有意でROR>1、しかも一番高いORである。
つまり併用でseizureが増えるかもしれないという仮説をこの結果からは唱えることができており、現在の既知の相互作用で痙攣が増えるという知見と矛盾しない結果である。
(またこれは付け足しの解釈になるが、上記結果では年代も有意な因子となっており、係数<1であるから、年代が高いほどseizure報告数はわずかに少なくなる、という結果となっている。)


今回の検討自体はすでに先行研究で知られていることをあえて検証してみただけであるが、実際に研究として役立てる場合には、まだ相互作用や副作用の実態があまり知られていない新薬について、臨床的な経験(1-2例程度とか)から得られたヒントが、統計的に同じようなことが言えそうなのかこのデータベースで少し検証してみる、という使い方になる。それで実際統計的にそうかもしれないということであれば、これを検証すべき仮説として、さらに服用した全員についての観察研究などで調べてみる、という流れになる。


AAA
# <pre  class="prettyprint">    </pre>