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

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

国民経済計算四半期GDP速報データの分析6 - R言語で株価の騰落率とGDPデータの重回帰分析をしてみる。

 

www.crosshyou.info

 の続きです。

前回は、株価の騰落率とNetExpo(純輸出)で線形単回帰分析をしてみましたが、NetExpoだけでは株価の騰落率を説明することは難しいことがわかりました。そこで今回は、他の変数も加えて、重回帰分析をしてみようと思います。

まずは、株価の騰落率とGDPの各データの相関を調べてみようと思います。cor関数を使います。

f:id:cross_hyou:20190427104908j:plain

NetExpoが-0.3055で相関の絶対値が高かったです。次はMinJuu(民間住宅)が-0.2983ですね。なので、MinJuu(民間住宅)を加えましょう。lm関数を使います。

f:id:cross_hyou:20190427105512j:plain

一番下の行のp-value: 0.001899 がこのモデルの有意かどうかを表しますので、0.05以下なのでモデルは有効だと判断できます。

Interceptのp値は、2.65e-14で文句なく有意、NetExpoは0.0401で0.05以下ですからこれも有意、MinJuuは0.0516ですから5%水準では有意ではないですが、10%水準では有意です。

NetExpo, MinJuuを対数をとったモデルを作ってみましょう。

f:id:cross_hyou:20190427110235j:plain

NetExpoはマイナスの値のデータもありましたので、警告メッセージが出てしまいました。一番下の p-value: 0.05752 を見ると、0.05以上なのでこのモデルは有意ではないですね。

NetExpoとMinJuuの交差項を入れたモデルも調べてみましょう。

f:id:cross_hyou:20190427110723j:plain

一番下の行の p-value: 1.21e-05 なのでモデルは有意です。NetExpo, MinJuu, NetExpo:MinJuuの3つの係数のp値も0.05以下で有意です。

始めのモデル、mlmodel1のAdjusted R-squaredは、0.1118で、交差項も加えたモデル、mlmodel3のAdjusted R-squaredは、0.2249ですから説明力が増しています。

anova関数を使ってmlmodel1とmlmodel3が有意に違うかみてみましょう。

f:id:cross_hyou:20190427111526j:plain

Pr(>F)のところがp値なので、0.0003282と0.05よりも小さい値ですから、2つのモデルに違いはあり、mlmodel3のほうがあてはまりが良いモデルであることがわかりました。

モデルによって予測した株価騰落率と実際の株価騰落率を比較してみましょう。それぞれのモデルの中にfitted.valuesとして格納されていますのでplot関数とlines関数でグラフにしてみます。

f:id:cross_hyou:20190427113443j:plain

f:id:cross_hyou:20190427113454j:plain

グラフにすると、青いライン(交差項のあるモデル)のほうが実際の株価の騰落率の近いことがわかります。

今回は以上です。

 

今回のR言語のコートは以下にあります。


# Kabuka.1YとGDPデータの相関
cor(data2, data2$Kabuka.1Y)

# Kabuka.1YをNetExpoとMinJuuで重回帰分析
mlmodel1 <- lm(Kabuka.1Y ~ NetExpo + MinJuu, data = data2)
summary(mlmodel1)

# 対数をとったモデル
mlmodel2 <- lm(Kabuka.1Y ~ log(NetExpo) + log(MinJuu), data = data2)
summary(mlmodel2)

# 交差項を入れたモデル
mlmodel3 <- lm(Kabuka.1Y ~ NetExpo * MinJuu, data = data2)
summary(mlmodel3)

# mlmodel1とmlmodel3に有意な違いはあるか
anova(mlmodel1, mlmodel3)

# 株価騰落率とモデルで予測した騰落率
plot(data2$Time, data2$Kabuka.1Y, type = "l",
main = "赤:交差項無し, 青:交差項あり")
lines(data2$Time, mlmodel1$fitted.values, col = "red")
lines(data2$Time, mlmodel3$fitted.values, col = "blue")