Rで何かをしたり、読書をするブログ

政府統計の総合窓口のデータや、OECDやUCIやのデータを使って、Rの練習をしています。ときどき、読書記録も載せています。

都道府県別の15歳~64歳人口割合, 1人当たり県民総所得、1人当たり最終エネルギー消費のデータの分析7 - 2つの年度の差分のデータで回帰分析

(Bing Image Creator で生成: プロンプト: Close up of white Trifolium repens flowers, background is blue lake, blue sky, photo)

 

www.crosshyou.info

の続きです。

前回は、2011年度と2020年度の2つの年度のデータを使って、year のダミー変数を加えて回帰分析してみました。

その結果は、

income = -839.1 + 60.81 * popratio + 2122 * tokyo + 1.44 * energy + u

というモデルを推定しました。popratio: 15歳~64歳人口割合、energy: 1人当たり最終エネルギー消費、ともに income: 1人当たり県民総所得にはプラスの効果を持っていいる、という結果でした。

今回は、

www.econometrics-with-r.org

https://www.econometrics-with-r.org/10.2-PDWTTP.html

こちらのサイトを参照して、"Before and After" 比較をしてみます。

このモデルは、

income = beta0 + beta1 * popratio + beta2 * energy + beta3 * 都道府県固有の効果 + u

というモデルです。都道府県固有の効果は、2011年度と2020年度で変わらずに同じだと仮定しています。beta0 は切片ですね。

すると、それぞれの年度で、

income(2011) = beta0 +  beta1 * popratio(2011) + beta2 * energy(2011) + beta3 * 都道府県固有の効果 + u(2011)

という式と、

income(2020) = beta0 +  beta1 * popratio(2020) + beta2 * energy(2020) + beta3 * 都道府県固有の効果 + u(2020)

という式が考えられます。

この2つの式を引き算すると、beta1の切片と『beta3 * 都道府県固有の効果』が消えてなくなります。

income(2020) - income(2011) = beta1 * (popratio(2020) - popratio(2011)) + beta2 * (energy(2020) - energy(2011) + (u(2020) - u(2011))

ですので、このモデル式を回帰分析して、beta1, beta2 の係数を求めることが可能です。

まずは、2011年だけのデータフレームを作成します。

2020年度だけのデータフレームは既に、df_2020 として作成済みですが、念のため、pcodeで並び替えて、df_2011と同じ都道府県の並びにしておきます。

そうしたら、income, popratio, energy の差分を生成します。

3つの差分の相関係数マトリックスを確認しましょう。

diff_income は diff_popratio とはマイナスの相関、diff_energy とはプラスの相関です。

では、lm() 関数でモデルの係数を推計します。

なんと!前回の推定結果とは逆に、popratio の係数がマイナスになりました。

summary() 関数でモデルのサマリーをみてみます。

diff_popratio の p値はかなり0に近いです。diff_energy の p値は 0.0532 なので、5%の有意水準ではわずかに有意ではありませんが、10%の有意水準では有意になります。

plot() 関数で model5 をプロットしてみます。

Breush-Pagan検定でHeteroskedasticity を確認します。

p-value は 0.6362 と 0.05 よりもうんと大きいですので、Heteroskedasticity ではないようです。

残差の2乗を回帰分析してみます。

こちらも p-value が 0.05 よりもかなり大きいです。

diff_income と diff_popratio の散布図を描いてみます。

diff_popratio が大きいほど、diff_income は小さいようです。

diff_income と diff_energy の散布図も描いてみます。

diff_energy が大きいほど、diff_income も大きいようです。

前回の結果とは popratio の効果の方向が逆になりました。どう判断したらいいでしょうか?

前回のデータで散布図を作成してみます。

まずは、popratio と income です。

どの件も2011年度が popratio が大きな値で、income は2020年度のほうが大きいようです。個々の都道府県だけに着目すると、popratio は2011年から2020年で減少、income は2011年から2020年で上昇、となっていますので、今回のモデルの結果のほうが正しいように見えます。

income と energy の散布図も描いてみます。

これはちょっとごちゃごちゃしていてわかりにくいですね。

沖縄県、愛知県、山口県、岡山県などは、energy は減少、income は増加のようですが、愛媛県、奈良県などは energyは減少、income も減少となっています。

この2つの散布図から判断すると、前回の結果よりも、今回のモデルのほうが、都道府県固有の効果を考慮しているので、あっているのかな~?と思いますが、よくわかりません。popratio: 15歳~64歳人口割合が増えると、income が減る、というちょっと直感とは違う結果なので、判断がつきません。

今回は以上です。

次回は

www.crosshyou.info

です。

 

初めから読むには、

www.crosshyou.info

です。

今回のコードは以下になります。

#
# https://www.econometrics-with-r.org/10.2-PDWTTP.html を参考にする
#
# 2011だけのデータフレームを作る
df_2011 <- df |> 
  filter(year == "2011年度") |> 
  arrange(pcode)
df_2011  
#
# 2020だけのデータフレーム
df_2020 <- df_2020 |> 
  arrange(pcode)
df_2020
#
# income の差分
diff_income <- df_2020$income - df_2011$income
#
# popratio の差分
diff_popratio <- df_2020$popratio - df_2011$popratio
#
# energy の差分
diff_energy <- df_2020$energy - df_2011$energy
#
# diff_income, diff_popratio, diff_energy の相関係数マトリックス
tibble(diff_income, diff_popratio, diff_energy) |> 
  cor() |> 
  ggcorrplot(lab = TRUE)
#
# 差分のモデル
model5 <- lm(diff_income ~ diff_popratio + diff_energy - 1)
model5
#
# model5 のサマリー
summary(model5)
#
# model5 のプロット
par(mfrow = c(2, 2))
plot(model5)
par(mfrow = c(1, 1))
#
# Preush-Pagan Test
lmtest::bptest(model5)
#
# 残差の2乗を回帰分析
lm(I(model5$residuals^2) ~ diff_popratio + diff_energy) |> 
  summary()
#
# diff_income と diff_popratio
tibble(diff_income = diff_income,
       diff_popratio = diff_popratio,
       pref = df_2020$pref) |> 
  ggplot(aes(x = diff_popratio, y = diff_income)) +
  geom_point(color = "red") +
  geom_text(aes(label = pref), vjust = 1.2, alpha = 0.5) +
  geom_smooth(method = "lm") +
  theme_bw()
#
# diff_income と diff_energy
tibble(diff_income = diff_income,
       diff_energy = diff_energy,
       pref = df_2020$pref) |> 
  ggplot(aes(x = diff_energy, y = diff_income)) +
  geom_point(color = "red") +
  geom_text(aes(label = pref), vjust = 1.2, alpha = 0.5) +
  geom_smooth(method = "lm") +
  theme_bw()
#
# income と popratio
df_1120 |> 
  ggplot(aes(x = popratio, y = income)) +
  geom_point(aes(color = year)) +
  geom_text(aes(label = pref), vjust = 1.2, alpha = 0.5) +
  geom_smooth(method = "lm") +
  theme_bw()
#
# income と energy
df_1120 |> 
  ggplot(aes(x = energy, y = income)) +
  geom_point(aes(color = year)) +
  geom_text(aes(label = pref), vjust = 1.2, alpha = 0.5) +
  geom_smooth(method = "lm") +
  theme_bw()
#