傾向スコアマッチング
傾向スコアマッチング (propensity score matching; PSM) は、観察データから因果関係を推定する統計手法です。
医学研究などで、ランダム化されていないデータにおいて、治療群と非治療群間のバイアスを調整します。 各参加者の治療受領の確率 (傾向スコア) を推定し、スコアが似ている被験者同士をマッチングします。
計画段階から共変量のバイアスを小さくする方法として、ランダム化 (無作為化) 比較試験があります。 しかし、ランダム化ができない観察研究や、遡及的研究 (retrospective study) では、得られたデータをそのまま利用すると、共変量のバイアスが問題となります。
例えば、癌のステージII の患者さんの平均年齢が90歳で、ステージIIIの平均年齢が70歳では、単純に予後を比較してもその解釈は困難で、誤った結論につながります。 そのため、多変量解析や、ここで提供する傾向スコアマッチングを利用します。
利点
- 観察データにおいて治療群とコントロール群間の共変量のバランスを改善し、選択バイアスを減らせます。
- 多変量解析では、モデルが共変量の影響を適切に調整しているかが不明確な場合があります。誤った統計的モデルは誤った結果につながります。しかし、傾向スコアマッチングでは、治療群とコントロール群間で共変量がより均等になるように個体をマッチングします。これにより、治療効果の推定が、共変量の影響がバランスされた状態で行われるため、より正確になる可能性があります。
- マッチング後の解析が容易です。
欠点
- 適切なマッチングを見つけるのが困難な場合があります。
- マッチングプロセスにおいて「利用できないデータ」、すなわち、適切なマッチが見つからないために分析から除外されるデータが発生します。これは特に、マッチング対象の個体が少ない場合や、特定の特性を持つ個体が少ない場合に顕著です。その結果、分析対象のサンプルサイズが減少し、結果の一般化や統計的な力に影響を与える可能性があります。
使用方法
応答変数の選択
応答変数には、研究で比較する対象 (例: 治療の有無) を指定します。 この変数は2値 (バイナリ) である必要がありますが、3値以上の場合には、そのうちの一つを処理群に指定し、それ以外は自動的にコントロールに割り当てます。
マッチさせたい変数の選択
連続的な特性や測定値 (例: 年齢、血圧) と、カテゴリー (離散) 変数 (例: 性別、喫煙歴) は、扱いが異なりますので、別々に指定します。
このとき、数値で表されたカテゴリー変数については、順序がある場合には連続変数として選択することができますが、数値の間隔は一定であることを前提として解析します。 カテゴリー変数として選択した場合には、数値の大小関係は無視され、単なるラベルとして扱われます。
処理群と対照群のマッチング比率の設定
処理群の各メンバーに対してマッチングされる対照群メンバーの数を設定します。デフォルトは1:2です。
Caliperの設定
傾向スコアの差の最大許容値を設定します。 デフォルトは0.2です。 Caliper を設定することで、マッチングされるメンバー間の類似性を制御します。
Caliper を小さくすると、マッチングされる個体間の類似性は高まりますが、一方でマッチングできる個体の数が減少します。 その結果、特にサンプルサイズが小さい場合や傾向スコアの分布に大きな違いがある場合、マッチング対象となる個体が不足することがあります。 これは、分析の一般化可能性や統計的な力に影響を与える可能性があるため、Caliperの設定は慎重に行う必要があります。
マッチング処理後
マッチングできたら、その情報を以下の2つの特殊カラムに追加できます。
- __matched_pairs__: マッチング対象となった行には、対応する通し番号が入ります。マッチング対象とならなかった行には、空白が入ります。
- __propensity_scores__: 傾向スコア の値です。
これらのカラムは、通常の統計処理の対象にはなりません。 引き続いて マッチさせたサンプルの 比率の比較(Mantel-Haenzel検定)、 比率の多変量解析(条件付ロジスティック回帰)、 生存率の多変量解析(層別化比例ハザード回帰) を行う際に、内部的に使用されます。
設定内容と結果の保存
マッチング結果を保存するには、ファイル の データと設定を保存 により、設定内容も含めて保存する必要があります。
データファイルだけを csv やエクセルで保存した場合は、マッチング情報と傾向スコアは保存されますが、設定は失われます。 そのため、引き続き行うべき検定を後で行おうとしても実行不可能な場合がありますのでご注意ください。
注意点
マッチドペアに対して、対応のある検定を行うとより有意差が出やすいとされますが、傾向スコアは両群における共変量の分布が等しいことを保証するものであり、個体レベルまで近いとまでは保証していないため、対応のある検定を適用することは推奨されません。
その他
Reactive stat では、マッチングには R の Matching ライブラリの Match() 関数を利用しており、最近傍マッチングを実行します。 最適マッチング (optimal matching)、 遺伝的マッチング (genetic matching)、 フルマッチング (full matching) には対応していません。
参考資料
医学統計セミナー資料 (和歌山県立医科大学 下川 敏雄 先生)
分類内容 | 値 | |
{{ item.tag }} |
データの取り扱い
- データインポート
- データの読み込みは、ブラウザ内で完結し、外部へのデータ送信は発生しません。
- データ保持
- 読み込んだデータはブラウザ内に保持されます。
- ブラウザのセッションが終了または全てのタブが閉じられると、保持していたデータは自動的に破棄されます。
- データの安全性
- ブラウザがクラッシュした場合でも、10分経過すれば次回の起動時にデータは安全に消去されます。
- 共用のPCでの使用も考慮し、データの外部漏洩のリスクを最小化しています。
クラウド R を利用する時のデータ送信
- 最小限のデータ送信
- 外部のRサーバーへ送信されるデータは、数値計算に必要な最小限のセットに制限されています。
- 送信データは解析に必要なサブセットのみに限られます。
- ユーザーコントロール下のデータ送信
- 送信前に、どのデータが外部サーバーへ送信されるのか内容を確認することが可能です。
- データの送信はユーザーの操作により行われ、自動的な送信は行いません。
- クラウド R 出力結果の保持
- クラウド R からの出力結果は、将来の自動翻訳や自動解説の機能実現のため、サーバーがデータベースに保持します。
- その際に、送信者の情報や、計算元となるデータなど、プライバシーに関わる情報は保持しません。
- 通信経路も全て暗号化していますので、たとえプライバシーに関わる情報が含まれていたとしても、通常は漏洩する恐れはありません。
AI による解説を利用する時のデータ送信
- 最小限のデータ送信
- 外部のAIサーバーへ送信されるデータは、クラウド R の出力結果と、用いた統計手法の徐放です。
- ただし、クラウド R の出力結果に連続した数値データが含まれる場合は、AI にデータ形式を認識させる目的で、連続データの最初の行のみを送信します。
- クラウド R 出力結果の保持
- AI による解説内容は、将来の品質向上などのため、サーバーがデータベースに保持します。
- その際に、送信者の情報や、計算元となるデータなど、プライバシーに関わる情報は保持しません。
Reactive stat において、統計データの変数は、通常の数値や文字列として扱われます。 したがって、日付や時間の概念は直接的にはサポートされていません。
統計計算を行う際には、日付や時間の差分を数値として事前に用意しておく必要があります。
チェックされた行が削除対象となります
欠損値を含むカラムを選択
カラムを選択
削除対象の行
データ入力
{{ replaceNewlinesInStrings(replacedScript) }}
R の出力結果
{{ rResult }}
R出力図形
AI による R 出力結果の解説
データ
設定
...(候補が多すぎます)
結果
クラウド R 分析
マッチング結果
{{plot.name}}
マッチング前 | マッチング後 | |||
---|---|---|---|---|
処理群 | 対照群 | 処理群 | 対照群 | |
{{ stat }} | {{ plot.preMatchTreatedStats[stat].cp3 }} | {{ plot.preMatchControlStats[stat].cp3 }} | {{ plot.postMatchTreatedStats[stat].cp3 }} | {{ plot.postMatchControlStats[stat].cp3 }} |
検定結果 処理群 vs. 対照群 | ||||
t検定 |
t値 = {{ plot.preMatchTests.tTest.tScore.cp2 }} Cohen's D = {{ plot.preMatchTests.tTest.cohensD.cp2 }} p = {{ plot.preMatchTests.tTest.pValue.cp2 }} |
t値 = {{ plot.postMatchTests.tTest.tScore.cp2 }} Cohen's D = {{ plot.postMatchTests.tTest.cohensD.cp2 }} p = {{ plot.postMatchTests.tTest.pValue.cp2 }} |
||
{{ category['カテゴリー'] }} | {{ category['個数'] }} ({{ category['割合'] }}%) | {{ plot.preMatchControlStats[index]['個数'] }} ({{ plot.preMatchControlStats[index]['割合'] }}%) | {{ plot.postMatchTreatedStats[index]['個数'] }} ({{ plot.postMatchTreatedStats[index]['割合'] }}%) | {{ plot.postMatchControlStats[index]['個数'] }} ({{ plot.postMatchControlStats[index]['割合'] }}%) |
検定結果 処理群 vs. 対照群 | ||||
χ2検定 |
χ2値 = {{ plot.preMatchTests.chiSquare.chiSqStat.cp3 }} Cramér's V = {{ plot.preMatchTests.chiSquare.cramerV.cp2 }} p = {{ plot.preMatchTests.chiSquare.pValue.cp2 }} |
χ2値 = {{ plot.postMatchTests.chiSquare.chiSqStat.cp3 }} Cramér's V = {{ plot.postMatchTests.chiSquare.cramerV.cp2 }} p = {{ plot.postMatchTests.chiSquare.pValue.cp2 }} |
変数 | マッチング前 (N={{ summaryTableData[0]?.preTreatedN + summaryTableData[0]?.preControlN }}) | マッチング後 (N={{ summaryTableData[0]?.postTreatedN + summaryTableData[0]?.postControlN }}) | ||||
---|---|---|---|---|---|---|
処理群 (N={{ summaryTableData[0]?.preTreatedN }}) | 対照群 (N={{ summaryTableData[0]?.preControlN }}) | p値 | 処理群 (N={{ summaryTableData[0]?.postTreatedN }}) | 対照群 (N={{ summaryTableData[0]?.postControlN }}) | p値 | |
{{ row.name }} | {{ row.preTreatedValue }} | {{ row.preControlValue }} | {{ row.preP }} | {{ row.postTreatedValue }} | {{ row.postControlValue }} | {{ row.postP }} |
{{ row.name }} | {{ row.preP }} | {{ row.postP }} | ||||
{{ val.category }} | {{row.preTreatedValue[idx].value}} | {{row.preControlValue[idx].value}} | {{row.postTreatedValue[idx].value}} | {{row.postControlValue[idx].value}} | ||
注: 数値変数は 平均±標準偏差 と t検定のp値、カテゴリ変数は 度数 (割合) と χ2検定のp値 を表示しています。 |
マッチング結果と傾向スコアをデータテーブルの新しい列に追加しました。
- {{ new Set(matchResult.matchedRowsTreated).size }}個の処理群のメンバーに対してに、{{ this.matchResult.matchedRowsControl.length }}個の対照群のメンバーがマッチングしました。
- 上のボタンを押すと、"{{ matchedPairsColumnName }}" カラムに傾向スコアマッチングのペア情報を、"{{ propensityScoresColumnName }}" カラムに傾向スコアを格納します。
- その際、現在の "{{ matchedPairsColumnName }}" および "{{ propensityScoresColumnName }}" カラムの内容は上書きされます。
- 同じ数字の入った行がマッチングしたデータとなります。マッチングしなかった行には空白が入ります。
- 実行後は、必要に応じてファイルにダウンロードして保存してください。
- 事後の統計処理を行う場合には、適宜欠損値処理などを行ってデータを整形してください。
不要な行を削除することで、以降の処理がわかりやすくなる場合がありますので、必要に応じて適宜実行してください。
傾向スコアマッチングのペアに選ばれなかった行をすべて削除しました。
指定の条件ではマッチングできませんでした
マッチング後の解析
マッチさせたサンプルに対して
を行うことができます。