餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

Rでバランスド・データの作り方

複数年に渡るミクロデータでは、個体が入ったり抜けたりします。例えば地域住人のデータでは、転居や死亡などで個体が減りますし、逆に転入や誕生で個体が増えたりします。サンプル数が膨大な場合は誤差になりますが、限定されたサンプルでは推定結果に影響を与える可能性もあります。こういう場合は、アンバランスなデータを削除して、バランスド・データで分析するのも一つの方法です。Rでバランスド・データの作り方を確認しておきましょう。
データセットは以下のようなものを想定します。

Year ID Y X
2009 A 9 6
2010 A 11 4
2009 B 8 6
2010 B 12 4
2009 C 8 6

上のデータがデータフレームdfに既にセットされてあるとしましょう。以下のように、dfの部分集合を年ごとに作ります。次に、df2に含まれるIDのdf1の部分集合、df1に含まれるIDのdf2の部分集合をつくります。最後に、df1とdf2を合成すればバランスド・データの出来上がりです。

df2010 <- subset(df, Year==2010)
df2009 <- subset(df, Year==2009)
df2010 <- subset(df2010, ID %in% df2009)
df2009 <- subset(df2009, ID %in% df2010);
df <- rbind(df2010, df2009)

年度が複数にまたがる場合は、まずは基準年度のサンプルを絞り、他の年度は基準年度に存在するIDで限定すればバランスド・データになります。

df2010 <- subset(df, Year==2010)
df2009 <- subset(df, Year==2009)
df2008 <- subset(df, Year==2007)
df2007 <- subset(df, Year==2006)
df2010 <- subset(df2010, ID %in% df2009)
df2010 <- subset(df2010, ID %in% df2008)
df2010 <- subset(df2010, ID %in% df2007)
df2009 <- subset(df2009, ID %in% df2010)
df2008 <- subset(df2008, ID %in% df2010)
df2007 <- subset(df2007, ID %in% df2010)
df <- rbind(df2010, df2009, df2008, df2007)

10年や20年もデータがあると大変だって? ─ それもそうですね。
そういう場合は以下のようにループすれば解決します。

balanced <- df
for(i in min(df$Year):max(df$Year)){
  balanced <- subset(balanced, ID %in% subset(df, Year==i)$ID)
}
df <- balanced

これが一番、簡単ですね。