【パッケージ開発】fixesでイベントスタディを効率化

イベントスタディを簡単に実装するパッケージを作りました。

R
公開

2024年12月30日

最終更新

2025年3月29日

更新

fixesパッケージがCRANに公開されました!

開発版では共変量の追加をサポートしました。

はじめに

突然ですが、最近Rパッケージを作成しました。その名もfixesです。

初めて作ったので穴も多いと思うのですが、このパッケージではDIDにおける平行トレンドの確認をする方法であるイベントスタディをより簡易的に行う関数を提供しています。

この記事では宣伝も兼ねて、使い方を簡単にご紹介します。

改善点やお気づきの点があれば、最下部のコメントか、GitHubのIssueに投げていただけると助かります。

優位性

イベントスタディのプロットをする方法として、fixestが提供するi()iplot()を使うものがあります。

個人的にiplot()ではggplot2を用いたプロットができない点があり、i()から結果をデータフレーム化するのも少々手間かなと思います。

そこでダイレクトに結果のデータフレームが返ってくる、そしてベースのプロットがggplot2であり、特にいじらなくてもそれなりのプロットが作成できる点が売りのfixesを作りました1

また、リードとラグの範囲を個別で指定できる点や、ベースラインも自由に指定できる点など、僕の技術で及ぶ範囲は柔軟性を求めたつもりです。

使い方

インストール

2024年12月30日時点では、パッケージをCRANに公開していないので、install.packages()でインストールすることができません。冒頭にも書いた通りCRANに公開されましたので、install.packages()でもインストール可能です。

GitHubより以下の方法でインストール可能です。

# install.packages("pak")
pak::pak("fixes")

もしくは、

install.packages("fixes")

です。開発版に関しては以下の方法でGitHubよりインストールできます。

pak::pak("yo5uke/fixes")

です。

使用するデータ

DIDに用いるデータフレームをそのまま用いることができます。

要件は、

  1. 個体を識別する変数(例えばid
  2. 時間を識別する変数(例えばyear
  3. 処置個体を示すダミー変数
    • 時間によらず、処置される個体であれば常に1をとる必要があります。
  4. アウトカム変数

を含んでいることです。

関数(イベントスタディの実行)

メインの関数は、run_es()関数です。ここにデータフレームを渡すことで、自動的にリード変数とラグ変数を作成し、回帰分析を実行、結果のデータフレームを返します。

引数は次の通りです。

引数 説明
data 使用するデータフレーム
outcome アウトカム変数
treatment 処置個体を示すダミー変数
time 時間を表す変数
timing 処置タイミングを表す数値
lead_range 処置前の期間の長さ(処置年は除く)
lag_range 処置後の期間の長さ(処置年は除く)
fe 固定効果
cluster クラスタリングの単位(任意)
baseline ベースラインとする時点(相対時間で指定、デフォルトでは-1)
interval 時間変数の間隔(例:毎年のデータなら1、国勢調査なら5。デフォルトでは1)

cluster_var以下は任意です。

この関数の限界として、時間の変数として年を想定している点があります。そのため、月次データ等は時間に通し番号を追加しておくことを推奨します。

例えば、5つの個体に24カ月分の観測がある場合、

df <- df |> 
  mutate(time_var = rep(1:24, 5))

としておくことで通し番号を追加できます。

肝心の関数の使い方は以下の通りです。

event_study <- run_es(
  data        = df, 
  outcome_var = y, 
  treated_var = is_treated, 
  time_var    = year, 
  timing      = 1998, 
  lead_range  = 5, 
  lag_range   = 5, 
  fe_var      = firm_id + year, 
  cluster_var = "state_id", 
  baseline    = -1, 
  interval    = 1
)

固定効果については、feols()と同様に和の形で記述することが可能です2。クラスタリングについては、ダブルクォーテーションで囲む必要があることに留意してください。また、リードとラグに処置年は含まれません。それぞれ5であれば、前5年+処置年+後5年で11年分の結果になります。

これを実行することにより、結果のデータフレームが返ってきます。

この結果を使えば、ggplot2を用いて好きにプロットしていただけるのですが、fixesパッケージでは、1からコードを書かずともggplot2を用いたプロットのベースを作る関数を提供しています。

関数(結果をプロット)

plot_es()関数を用いて、プロットのベースを簡単に作成できます。

まず、引数は次の通りです。

引数 説明
data run_es()で作成したデータ
type プロットのタイプ(ribbon(既定)かerrorbarを選択)
vline_val 処置を表す垂直線位を引く置(相対時間で指定、デフォルトでは0)
vline_color 垂直線の色(デフォルトでは黒)
hline_val 水平線を引く値(デフォルトでは0)
hline_color 水平線の色(デフォルトでは黒)
linewidth 折れ線の太さ(デフォルトでは1)
pointsize 点のサイズ(デフォルトでは2)
alpha リボンの透明度(デフォルトでは0.2)
barwidth エラーバーの幅(デフォルトでは0.2)
color 折れ線と点の色(デフォルトでは#B25D91FF)
fill リボンの色(デフォルトでは#B25D91FF)

プロットすると以下のように出力されます。

plot_es(event_study)

エラーバーを用いれば、

plot_es(event_study, type = "errorbar")

引数を指定すると、

plot_es(
  event_study, 
  type = "errorbar", 
  vline_val = -1, 
  vline_color = "darkred", 
  color = "navy"
)

ggplot2ベースで作られていますので、+で繋いで自在に編集できます。

plot_es(
  event_study, 
  type = "errorbar", 
  vline_val = -1, 
  vline_color = "darkred", 
  color = "navy"
) + 
  ggplot2::scale_x_continuous(breaks = seq(-5, 5, by = 1)) + 
  ggplot2::theme_bw()

ベースを作る手間が省けるのが売りです。

おわりに

簡単ではありましたが、以上fixesの紹介と解説でした。

はじめの方に書いた通り、利便性と柔軟性を求め、プロットも好みを反映できる点がこのパッケージの売りになっています。

使ってみていただけると大変うれしいです。

フィードバックもお待ちしています。

  1. 一つ弁明したいのが、fixestが裏で動いていることもあり、fixesリスペクトでfix event studyからfixesと名付けたのですが、GitHubにアップしてからtを抜いただけであることに気づきました。もっと早く気づけという指摘はごもっともです。すみません。↩︎

  2. 以前のバージョンではc("firm_id", "year")のような形で書く必要がありましたが、変更しました。↩︎