クロスオーバーデザインにおける同等性の検定

クロスオーバーデザインは、試験の途中で介入をスワップする方法です。
例えば、対照薬と治療薬(被験薬)があったとして、A群とB群で比較したいとします。
一般的な比較であれば、例えば、A群は対照薬群、B群は治療薬群として2群に無作為にわけて、評価項目を検定します。これは平行群間のデザインです。 
クロスオーバーデザインでは、A群の治療の前半で対照薬、後半で治療薬、B群の治療の前半で治療薬、後半で対照薬という具合に、介入を入れ替えます。


この図では2群を例にしていますが、多群でも用いられます。
多群にする場合は、種類の異なる複数の対照薬を用いる場合や、相互作用を考えたい介入の種類が増えた場合などに利用されます。

クロスオーバーデザインのメリット


・同一対象者に対して、対照薬と治療薬の比較ができる。
・対象となる薬剤の効果を個人ごとに比較できるため、統計モデル作成時に、治療効果の個体差をランダムな要因として捉えることができる。
・全対象者が治療薬での治療を受けられるので倫理面の問題が起こりにくい。

クロスオーバー法のデメリット


・先に投与した薬が被験者の体内に残っている場合、休薬期間を置いたとしても、正確な結果を得られないことがある(被験者の脱落が起こり得る)。
・ウォッシュアウト期間(体内から薬の成分を抜くための休薬期間)が必要となるため、試験期間は多少長くなる。
・先に投与した薬の作用により、次の薬が投与できなくなってしまう)ことがある

クロスオーバー試験で知りたいことは、治療薬の治療効果が対照薬に比べて同等であったかどうかです。
同等であった場合は、有効性は示せなかったということになります。
同等でなかった場合、評価項目が対照薬に比べて良くなっていれば、有効性が示せたということになり、逆に、評価項目が対照薬に比べて悪くなっていれば、有効性は示せなかったということになります。

クロスオーバー試験の介入の要因と効果


クロスオーバー試験では、平行群間試験のように、「単純な群間比較として」、A群とB群とを比べることが出来ません
ここで知りたいことは、任意の被験者ごとに、評価項目と治療の種類の関係がどうなるかです。
群ごとの違いはもちろんですが、薬の種類、期間の違いによっても、評価項目への影響を分けて考えられるはずです。
このように、あらかじめどのような影響を結果に与えそうか分かっている要因は固定効果と呼ばれます。
固定効果は、説明変数と相関を持ちそうかどうかで決まります。
例えば、群の比較では、変わらなそうであるとか、薬の種類ごとの治療効果の違いはありそうとか、期間を前半と後半で分けて比較したら変わらなそうであるという具合です。

ここで、もう一つ考慮しなければならないものに被験者の違いがあります。
しかし、被験者の効果は全く予測できません。あの被験者だから治療結果は良くなるということはこの時点では予想できません。まったくランダムな効果です。
このような効果は、変量効果と呼ばれます。
変量効果は、固定効果と違って、説明変数との相関がないと解釈されます。

これらの、群、治療種類(薬の種類)、期間(前半・後半)、被験者という要因から、評価項目を予測するような統計モデルを作成すれば、固定効果ごとの予測結果を比較することで検定が行えます。

混合効果モデル(Mixed effect model)


混合効果モデルは、固定効果(fixed effect)と変量効果(random effect)を勘案しながら、目的変数を求めるための線形予測モデルです。
線形と名に付いていますが、非線形にフィットした関数として利用されることもあります。
単純な線形回帰モデルとは異なり、固定効果と、変量効果の要因を考えて、当てはまりの良い予測モデルを探索します。
標準形式を示します。

\[  y = X\beta + Zb +  \epsilon \]

y は目的変数、n は観測数です。
X は n 行 p 列の固定効果行列(固定効果とした説明変数)です。
β は p 行 1 列の固定効果による傾きです。
Z は n 行 q 列の変量効果行列(変量効果とした説明変数)です。
b は q 行 1 列の変量効果による切片です。
ε は n 行 1 列の観測誤差です。

\(X\beta\)は、固定効果項、\(Zb\)は、変量効果項です。

実際には、グループや、固定効果、変量効果によってもう少し複雑な式になります。

プログラムから利用する際は、固定効果と変量効果の数式を定義します。
固定効果や変量効果の組み合わせや、変量効果の傾きと切片の取扱いによって、パターンが変わります。
次の例では、「群、治療の種類(薬の種類)、期間のデータから、目的変数を予測するための回帰関数の切片や傾きを求めるが、ここで決められた切片や傾きは被験者ごとにランダムに変動する(被験者を変量効果とし、傾きをそれぞれで求める:(1|subject))」という意味になります。

\[ y \ , \tilde \ , group + treat + period + (1|subject)\]

実践


  import numpy as np
  import pandas as pd
  import statsmodels.api as sm
  import statsmodels.formula.api as smf
  # AUC(血中濃度-時間曲線下面積、area under the blood concentration-time curve)
  # https://drive.google.com/file/d/1HKFlozBu9EVHftU_wCuk_37foI5TWL9Y/view?usp=sharing
  # データをダウンロードします
  !curl -L -o "crossover-lmer.csv" "https://drive.google.com/uc?export=download&id=1HKFlozBu9EVHftU_wCuk_37foI5TWL9Y"
  # データを読み込みます
  import pandas as pd
  data = pd.read_csv(filepath_or_buffer="crossover-lmer.csv", names=["subj","group","period","treat","auc"], encoding="utf-8")
  data["log_auc"] = np.log(data["auc"])# 対数変換します
  print(data.head())
  data.describe()
  
  '''
  2021/2/15
  https://www.statsmodels.org/stable/examples/notebooks/generated/mixed_lm_example.html
  https://www.statsmodels.org/stable/generated/statsmodels.regression.mixed_linear_model.MixedLM.from_formula.html
  '''
  # formula = 従属変数 ~ 固定効果として設定する独立変数 ... + (変量効果として設定する独立変数)...
  # formula = "log_auc ~ group + period + treat + (1|subj)" # (1|subj)としてsubjを傾きのrandom effとして指定する例
  # 相関がありそうなものを+で繋ぐ。
  formula = "log_auc ~ group + period + treat" # 固定効果(+は、交互効果を加味しないという意味。加味する場合は*を使う。)

  # vc_formulaは傾きを変量効果とする項目を指定する。
  # 1+val_name, or 1+C(category_val_name)
  # 1+ ~は、ランダム切片を使う。0+ ~は、切片を固定。
  vc = {"subj": "1 + C(subj)"} 

  # re_formulaはランダムな切片を利用する項目(共変量)を指定する。デフォルトは1:すべてランダムな切片を設定する
  re = "1" # eg, "1 + period"

  md = smf.mixedlm(formula=formula,data=data, vc_formula=vc, re_formula=re, groups=data["group"])
  mdf = md.fit(method=["lbfgs"]) # lbfgs - A more memory-efficient (limited memory) implementation of bfgs. Scipy’s fmin_l_bfgs_b.
  print(mdf.summary()) # treat pv = 0.244

  
treat(薬剤の違い)の項目を見ると、p値は0.244で、差はないと解釈できます。

References
  • http://www.lowtem.hokudai.ac.jp/plantecol/akihiro/obenkyou/GLMMexample.pdf
  • https://jp.mathworks.com/help/stats/linear-mixed-effects-models.html
  • https://www.statsmodels.org/stable/examples/notebooks/generated/mixed_lm_example.html

生存時間データを用いた群間比較

2群の比較


ある疾患を対象に、対照薬群と治療薬群とを比較するランダム化試験を行ったとする。
両群の生存時間分布に違いがあるかを検定したい。



References
Visionary Imaging Services, Inc.
Imaging CROサービスをご提供させていただきます。
お問い合わせお待ちしております。
https://www.vis-ionary.com/

一致度の検定(ICCとカッパ)

コーエンのカッパ係数(Cohen's coefficient kappa)


コーエンのカッパ係数は、2名の評価者それぞれから得られた評価結果(名義尺度や順序尺度)の一致度を測定するために使用される統計量です。
評価者間で一致度が高ければ、評価結果の信頼性が高まります。
κは偶然に同じ評価結果が発生する可能性を考慮しているため、単純な一致頻度の計算よりも堅牢な指標であると考えられています。
カッパ係数の値(k)の値は−1 ≦ k ≦ 1 となり、数値が1に近いほど評定者の分類は一致していることを表し、k=1になった場合は完全な一致となります。

例えば、

ある症例群を対象に、2名の評価者が疾患の悪性グレードについてカテゴリ評価を行った。
評価結果の一致度を確かめたい。
このようなときに、カッパ係数を用います。
 

k係数の目安


Landis and Koch (1977)
  • 0.81〜1.0 ほぼ完全、完全一致(almost perfect or perfect agreement)
  • 0.61〜0.80 かなりの一致(substantial agreement)
  • 0.41〜0.60 中等度の一致(moderate agreement)
  • 0.21〜0.40 まずまずの一致(fair agreement)
  • 0.0〜0.2: わずかに一致(slight agreement)

Krippendorff (1980)
  • 0.80以上 明確な結果(definite conclusions)
  • 0.67〜0.80 不確かな結果(conclusions tentatively)
  • 0.67未満 評価しない(discounted)

実践



重み付きカッパ係数


実践の下方に示したように、重みを考慮することも出来ます。
重みというのは、例えば、1,2,3のカテゴリを評価した場合に、
評価者A → 1
評価者B → 3
としていたら、評価結果が大きく乖離していることになります。
しかし、通常のカッパ係数は単純に一致しているかどうかしか見ていません。
このような乖離の大きさを重みとして調整したカッパ係数が重み付きカッパ係数です。
線形の重み付け(1次重み付け)は、評価の差を一定の割合で増減させて重み付けします。評価の差が大きくなるほど重みは一定の割合ごとに小さくなります。
クアドラティックな重み付け(2次重み付け)は、評価の差が小さいほど大きく、評価の差が大きいほど小さい重みを付けるよう重み付けします。

級内相関係数(ICC:Intraclass Correlation Coefficient)


ICCは、1名の評価者で対応のあるデータを反復して評価した場合や、2名以上の評価者それぞれから得られた評価結果の一致度を測定するために使用される統計量です。
評価には順序尺度や間隔尺度が用いられます。
同じ被験者を対象とした評価の変動を、すべての評価およびすべての被験者の総合的な変動と比較することにより、評価の信頼性を評価します。

評価者間で一致度が高ければ、評価結果の信頼性が高まります。
級内相関係数は相関係数と同様に icc ≦ 1 の値になります。
完全一致の時は1、偶然の一致程度の時は0、反対の一致が多い場合はマイナスの値になります。
ICCの評価基準はカッパ係数の基準に倣うか、一般に、0.7以上で信頼性が良好であると主張することが多いようです。
ICCには大きく3つのCaseがあります。
Shrout and Fleiss(1979)は、n個のターゲット(このブログで言う被検者)に対してk人の評価者が行った評価の信頼性について、6つのケースで説明しています。 

Case1: 評価者内信頼性を算出するケース


一般に、1人の評価者がk回評価した結果を用います。
評価する項目は単一の項目(例えば重症度など)です。
これは一元配置分散分析の固定効果(fixed effect)モデルによる分析と同じ意味合いがあります。

Case2: 評価者間の信頼性を算出するケース(評価者はランダムに選出された人)


無作為に選ばれたk人の評価者による評価結果を対象とします。 
評価は単一の項目です。
評価者は変量効果とみなされます。

Case3: 評価者間の信頼性を算出するケース(評価者は固定)


特定のk人の評価者による評価結果を対象とします。
評価は単一の項目です。
評価者は固定効果とみなされます。
この場合、被検者のデータはどのケースでも変量要因となるので、固定要因と変量要因とが合わさった混合モデルとも言われます。

Case2と3の違いは、評価者が変量効果(評価者はたまたま充てがわれた要因)と見なされるか、固定効果(評価者が従属変数への影響すると最初から分かっている)と見なされるか、です。

残り、3のケースは、Case1〜3で、単一の評価者による反復評価の平均、または、k人の評価者によるk個の評価の平均のいずれかについて信頼性を推定する方法です。
1人の評価者の場合は平均相互相関に相当し、k人による評価の場合はスピアマンブラウンの調整済み信頼性に相当します。

例えば、

  • ある症例群を対象に、1名の評価者が被験者ごとの疾患悪性グレードについてカテゴリ評価を複数回行った(反復して測定した)。→Case1
  • ある症例群を対象に、4名の評価者が被験者ごとの疾患悪性グレードについてカテゴリ評価を行った。→Case2 or Case3(評価者を固定効果とみなすかで分ける。一般にCase2の方がICCが低くなることが多いので、利用されているのではないかと思う)
評価結果の一致度を確かめたい。
このようなときに、ICCを用います。

実践




References
  • https://qiita.com/tand826/items/4d1fb2045f2b48d21b7d
  • https://ides.hatenablog.com/entry/20170417/1492409363
  • http://www.snap-tck.com/room04/c01/stat/stat05/stat0504.html
  • https://pingouin-stats.org/generated/pingouin.intraclass_corr.html (see, Examples and check data frames)
  • http://www.med.osaka-u.ac.jp/pub/kid/clinicaljournalclub12.html
  • https://stackoverflow.com/questions/11528150/inter-rater-agreement-in-python-cohens-kappa
  • 信頼性指標としての級内相関係数(https://personal.hs.hirosaki-u.ac.jp/pteiki/research/stat/icc.pdf)
Visionary Imaging Services, Inc.
Imaging CROサービスをご提供させていただきます。
お問い合わせお待ちしております。
https://www.vis-ionary.com/

医薬品製造販売後調査に必要な例数を求める

有害事象の発現割合 p%で、95%の確率で少なくとも1例検出するに必要な例数を求めたいとします。

例数を算出する例を示します。

例数が決まっている場合の、検出力を算出する例を示します。


Visionary Imaging Services, Inc.
Imaging CROサービスをご提供させていただきます。
お問い合わせお待ちしております。
https://www.vis-ionary.com/

一般化線形モデル(GLM)でLD50を推定する

LD50


半数致死量(はんすうちしりょう、median lethal dose)とは、急性毒性の指標です。投与した動物の半数が死亡する用量を意味します。
"Lethal Dose, 50%"を略してLD50と書きます。
また、投与した動物の半数が最小限の効果を示す用量である半数効果用量(ED50)も同様の考え方で求めることができます。

一般化線形モデル(Generalized Linear Model, GML)


データが正規分布に従うとき、従属変数 Y と独立変数 X を、パラメーター β でモデル化できます。
\[g(y) = \beta_0x_0 + \beta_1x_1 + \cdots + \beta_nx_n \]

ただし、データが正規分布に従わないときは、各独立変数 X に対応する従属変数 Y の分散が一定でなくなり、データを正規分布と仮定した一般線形モデルが利用できなくなります。
このようなとき、分散が大きくなりすぎないようにする(いい具合に小さく見えるようにする)リンク関数(対数変換など)を導入して、予測性能を安定させたモデルがGMLです。
線形と名前が付いていますが、勾配の最適化も行う点で、最小二乗法と比べて、多少、融通の利くモデルになっています。

実践


サンプルデータとして、投与量と死亡数を記録したデータを利用します。


Visionary Imaging Services, Inc.
Imaging CROサービスをご提供させていただきます。
お問い合わせお待ちしております。
https://www.vis-ionary.com/

欠測の取り扱い

例えば、臨床研究などでデータを収集していると、何らかの理由で検査ができなかったりなどで、どうしても取得できなかったデータなどが出てくる。
このような一部の項目が欠けてしまったデータは欠測のあるデータという。

欠測のあるデータはそのままでは統計に流せない(NaNやNullは数値ではない)。
この対処例として、欠測を含むデータは解析セットに含めない、あるいは、欠測を何らかの値で補完する方法がある。

ほとんどの場合、解析セットから欠測を含むデータを除外してしまう方法がとられるかもしれない。

しかし、除外されるデータが決定境界に影響を与えるかもしれないという可能性は否定できない。できればこれは避けたい。どうするか。 

このような疑問に真摯に対応しようとするのが補完という対応である。
補完は、切り捨てるメリット、切り捨てないメリット、両方のいいところを残していい塩梅を探そうとする。

ただし、前提として、欠測を推定した値が正確であったかどうかはわからないため、適用しても問題ないだろうと思われる落としどころを探すことが必要になる(PMM感度分布解析)。 

多少面倒だが、欠測が起こる契機についても考慮しておく必要がある。
欠測が本当に偶然に起こっている場合(missing at random)と、何かの要因でシステマチックに欠測としている場合などがある。 

基本的に、統計的にも、バイアスを除外したいというモチベーションから、たまたま欠損した場合には補完で対処しようというアプローチが許容されやすい。 

欠測の補完方法は大きく分けて2つある。 欠測値がある場合、その欠測値を含む観測データを除外できれば良いが、そうできないとき、穴埋めを行う。これをインピューテーションという。 単一値の補完や予測補完が可能である。 

対照試験では、対照群のデータを使って補完する「pMI」という手法が用いられることがある。しかし、欠損した値の補完であることに変わりはないので、インピュートしたデータでの解析結果は、試験の有効性というより、有用ということを主張するための手段となるようである(主張が弱まる)。 SASではインピューテーションの影響をpMIで感度分析するアルゴリズムがある。

単一補完法


1つの欠測に対して1つの値を補完する。(例えば、Last Observation Carried Forward(時系列に取得していたなら、最後に取得できた値で代用する方法)、同じ系列の値の中央値、平均値、最頻値などによる単純な補完)。

多重補完法


欠測値を他の特徴量から回帰計算して予測する。

現在は後者の多重補完が主流のようである。どちらが正しいということではなく、双方をいかに使うかが大切といえるだろう。
研究者間でも意見が分かれるところである。個人的には、単一補完単体はテストケースで利用し、精度を検証するような厳密な解析では多重補完という感じではないだろうか。もっと言えば、両方試して傾向が同じかどうかを確かめておくことも必要と思う。

欠損値の補完:MICE



  # data load
  # https://drive.google.com/file/d/1f1MoJj0-SJwPXzvGQTB2ycg-MeJFWtLO/view?usp=sharing
  #MissingAtRandom
  !curl -L -o "MAR.csv" "https://drive.google.com/uc?export=download&id=1f1MoJj0-SJwPXzvGQTB2ycg-MeJFWtLO"
  
  # データをテーブルにします
  import pandas as pd
  # "group":群,"timepoint":時点,"Y":事象(死亡、打ち切り)
  data = pd.read_csv(filepath_or_buffer="MAR.csv" ,encoding="utf-8")[["ID","Group","W0","W1","W3","W6"]]
  print(data.head())
  
  # impute NaN
  from sklearn.impute import SimpleImputer
  imp = SimpleImputer(missing_values=np.nan, strategy='mean')
  imp.fit(data[["W0","W1","W3","W6"]].values.tolist())
  imputedValues = imp.transform(data[["W0","W1","W3","W6"]].values.tolist())
  imputedValues = pd.DataFrame(imputedValues,columns=["W0","W1","W3","W6"])
  imputed = pd.DataFrame(pd.concat([data[["ID","Group"]],imputedValues],axis=1),columns=["ID","Group","W0","W1","W3","W6"])
  print("imputed! \n",imputed.head())
  # save as csv NaN does not included by imputes
  # data3.to_csv('RepeatedMeasureANOVA_mod_postImpute.csv')
  

2群の比較検定のためのサンプルサイズ

サンプル


Visionary Imaging Services, Inc.
Imaging CROサービスをご提供させていただきます。
お問い合わせお待ちしております。
https://www.vis-ionary.com/