差の差分析
(Difference-in-Differences; DID)
解説
差の差分析とは
差の差分析 (DID) は、介入(政策・治療など)の効果を推定するための因果推論手法です。介入群と対照群について、介入前後の変化の差を取ることで、時間トレンドや交絡要因の影響を除去し、介入の純粋な効果を推定します。
DID推定値 = (介入後介入群 − 介入前介入群) − (介入後対照群 − 介入前対照群)
並行トレンド仮定
DID の根本的な仮定は「並行トレンド仮定 (Parallel Trends Assumption)」です。これは「介入がなければ、介入群と対照群は同様のトレンドをたどるはずである」という仮定です。
- 本アプリのトレンドプロットで、介入前の2群が平行かどうか目視で確認してください
- Event Study の介入前係数(period < 0)が統計的に有意でなければ、仮定が支持されます
- 介入前のトレンドが異なる場合、DIDの結果は偏ったものになります
本アプリでサポートする機能
- Two-way Fixed Effects (TWFE) モデルによる DID 推定(post × group の交互作用項)
- 多期間対応:時間変数に整数インデックス(例: −2, −1, 0, 1, 2)を使用可能
- トレンドプロット:群 × 時期の平均値の折れ線グラフで並行トレンドを視覚確認
- バランステスト:介入前の群間ベースライン比較(アウトカム・共変量の t 検定)
- Event Study:介入前期間が2期間以上ある場合、期間別介入効果と95%CI を出力
- 共変量の調整(任意)
- クラスター標準誤差(パネルデータ・個体ID等)
データの準備
| 変数 | 内容 | 設定例 |
|---|---|---|
| アウトカム | 連続変数 | 売上・健康指標など |
| 時間変数 | 介入時点を 0 とした整数インデックス | −2, −1, 0, 1, 2 |
| 群変数 | 0 = 対照群、1 = 介入群 の二値変数 | 0 / 1 |
| クラスター変数 | パネルデータの個体ID(任意) | 患者ID・企業コードなど |
- 時間変数は「介入前 = 負の値、介入後 = 0以上」の規則で設定してください
- 従来の「0 = 介入前、1 = 介入後」形式を使う場合は、「−1 = 介入前、0 = 介入後」に変換してください
- 群変数は 0(対照群)と 1(介入群)の二値でなければなりません
結果の解釈
DID推定値
- post × group の係数 = DID推定値(介入効果)
- 正の値であれば介入がアウトカムを増加させたことを示します
- p値が0.05未満であれば統計的に有意な介入効果があります
バランステスト
- 介入前における群間の差を検定します
- p < 0.05(⚠️)の変数があると、ベースライン時点で群の特性が異なることを示します
- ベースラインに差がある場合は共変量として調整することを推奨します
Event Study
- 各期間の介入効果(対照群との差)とその95%CIを表示します
- 介入前係数(period < 0)が 0 付近に集まっていれば並行トレンド仮定が支持されます
- 介入前係数に ⚠️ マークがある場合(p < 0.05)は並行トレンド仮定が成立していない可能性があります
注意事項
- 複数時点のパネルデータの場合は、クラスター変数(個体ID)を指定することを強く推奨します
- staggered DID(介入時点が個体ごとに異なる)には、本アプリのシンプルな TWFE 推定は不向きです
- Event Study は介入前期間が2期間以上ある場合のみ実行されます
アプリ
Reactive stat ロゴ について
ログインしていただければロゴは表示されなくなります
{{title}}
{{title}}
{{ item.full }}
{{title}}
{{group}}
{{title || 'カラム選択'}}
{{title || 'カラム選択'}}
{{ title }} カテゴリー変数を選択してください。複数選択すると組み合わされます
...(選択肢が多すぎます)
それぞれに設定する値を入力してください。異なる分類に同じ値を設定することもできます。順位の数値を入れれば、順序カテゴリカル変数として扱えるようになります。
| 分類内容 | 値 | |
| {{ item.tag }} |
データの取り扱い
- データインポート
- データの読み込みは、ブラウザ内で完結し、外部へのデータ送信は発生しません。
- データ保持
- 読み込んだデータはブラウザ内に保持されます。
- ブラウザのセッションが終了または全てのタブが閉じられると、保持していたデータは自動的に破棄されます。
- データの安全性
- ブラウザがクラッシュした場合でも、10分経過すれば次回の起動時にデータは安全に消去されます。
- 共用のPCでの使用も考慮し、データの外部漏洩のリスクを最小化しています。
クラウド R を利用する時のデータ送信
- 最小限のデータ送信
- 外部のRサーバーへ送信されるデータは、数値計算に必要な最小限のセットに制限されています。
- 送信データは解析に必要なサブセットのみに限られます。
- ユーザーコントロール下のデータ送信
- 送信前に、どのデータが外部サーバーへ送信されるのか内容を確認することが可能です。
- データの送信はユーザーの操作により行われ、自動的な送信は行いません。
- クラウド R 出力結果の保持
- クラウド R からの出力結果は、将来の自動翻訳や自動解説の機能実現のため、サーバーがデータベースに保持します。
- その際に、送信者の情報や、計算元となるデータなど、プライバシーに関わる情報は保持しません。
- 通信経路も全て暗号化していますので、たとえプライバシーに関わる情報が含まれていたとしても、通常は漏洩する恐れはありません。
AI による解説を利用する時のデータ送信
- 最小限のデータ送信
- 外部のAIサーバーへ送信されるデータは、クラウド R の出力結果と、用いた統計手法の徐放です。
- ただし、クラウド R の出力結果に連続した数値データが含まれる場合は、AI にデータ形式を認識させる目的で、連続データの最初の行のみを送信します。
- クラウド R 出力結果の保持
- AI による解説内容は、将来の品質向上などのため、サーバーがデータベースに保持します。
- その際に、送信者の情報や、計算元となるデータなど、プライバシーに関わる情報は保持しません。
新しい列 (カラム) 名:
ここで設定した値に完全一致するデータを欠損値として扱います。
新しい列 (カラム) 名:
Reactive stat において、統計データの変数は、通常の数値や文字列として扱われます。 したがって、日付や時間の概念は直接的にはサポートされていません。
統計計算を行う際には、日付や時間の差分を数値として事前に用意しておく必要があります。
計算結果プレビュー:
新しい列 (カラム) 名:
チェックされた行が削除対象となります
削除対象の行
データ入力
{{ errorMessage || dataStatus + 'です'}}
設定とオプション
AI による R コードの解説
R の出力結果
R出力図形
AI による R 出力結果の解説
変換設定:
(
変換元の単位:
変換先の単位:
)
変換結果プレビュー:
新しい列 (カラム) 名:
計算式の入力:
数式:
- データ: カラム名 (列名) をそのまま記述するか、"列名" のようにダブルクォートで挟んで指定
- 算術演算子: +, -, *, /, ()
- 基本関数: abs(), sqrt(), pow(), exp(), log(), log10()
- 三角関数: sin(), cos(), tan(), asin(), acos(), atan()
- 丸め関数: round(), floor(), ceil()
体重 / pow(身長, 2), "体重" / ("身長" * "身長")
利用可能なカラム:
{{ column }}
変換結果プレビュー:
{{ errorMessage }}
新しい列 (カラム) 名:
区切り文字の選択:
欠損値の処理:
プレビュー:
{{ preview }}
新しい列 (カラム) 名:
確認
変換結果プレビュー:
新しい列 (カラム) 名:
{{title}}
データがありません
{{title}}
...(選択肢が多すぎます)
{{filteringText}}
{{ title || '対象データ' }}
({{ matchedRowCount }}件 / 元データ{{ originalRowCount }}件)
除外レコードあり
ダウンロード(CSV)
{{group}}
データ
設定
オプション
クラスター標準誤差
分析
記述統計 (群 × 介入前後)
| 介入前 (time < 0) | 介入後 (time ≥ 0) | 差分 | |
|---|---|---|---|
| 対照群 | {{ fmt(summaryTable.control.pre) }} | {{ fmt(summaryTable.control.post) }} | {{ fmtDiff(summaryTable.control.post, summaryTable.control.pre) }} |
| 介入群 | {{ fmt(summaryTable.treatment.pre) }} | {{ fmt(summaryTable.treatment.post) }} | {{ fmtDiff(summaryTable.treatment.post, summaryTable.treatment.pre) }} |
| DID推定値 | 介入効果 = | {{ fmt(didEstimate) }} | |
トレンドプロット (群 × 時期の平均値)
介入前に2群が平行なトレンドを示せば、並行トレンド仮定が支持されます。点線 = 介入前後の境界。