パクチーとみたの備忘録

パクチーとみたの備忘録

備忘録and日記。誰かの役に立てばいいな。

R言語を用いて回帰分析(S字曲線回帰)を行ってみた ~エストニアにおける電子投票拡散プロセスの成長モデリング例〜

 

f:id:tommy-acoustic-7:20190313031829p:plain

 

Tere

雪降る北欧でブルブル震えながら、数量経済学などを勉強しているとみたです!

 

今回は、エストニアにおける電子投票拡散プロセスの成長モデリングを行うために、R言語を用いてS字曲線回帰を行ってみました!

 

そしてその過程を備忘録として書いておきます。

R言語を用いたS字曲線回帰について記述している日本語のブログを見つけられなかったので

 

文系の方でも、研究・論文を書く際などに回帰分析を行うことが多いと思うのですが、R言語を利用するとスピーディーに描画できるので、よかったら参考にしてみてください!

 

 

 

 

 最終目標

エストニアにおける電子投票を採用している8つ選挙に関するデータを使用し、

エストニアにおける電子投票率の成長をモデル化(S字)する。

 

(恒久的に成長することがない天井のある対象の場合(~率など)は、S字曲線回帰を行うのが良いケースが多いのではないのでしょうか。ちなみに、今回求められた線形成長モデルだと24回目には電子投票率が100パーセントを超えてしまいます。笑)

 

 

手順

今回はR言語を用いた回帰分析の備忘録なので、遠回りになりますが、

線形モデルを作成した後に、S字モデルを出力します。

 

したがって、以下のように基本的な回帰分析の流れをアレンジしてコードを書いていきます。

 

 

 

①データをインプットし、2変数のデータをプロットした散布図を作成

 

 

まず、電子投票者のシェアと選挙に関するデータをリンクから直接収集します。

 

# Import the data

evote=read.table(url("http://www.ut.ee/kristjan.vassil/wp-content/evote_aggregated_workshop.csv"),

                 header = T,sep=";",dec=",")

 

 

そして、データをプロットさせ、散布図を作成。

 

plot(evote$election,evote$evoter_share,xlab="election",ylab="Share",col="skyblue",pch=16,ylim=c(0,0.4),cex=2)

 

f:id:tommy-acoustic-7:20190313031349p:plain

 

 

 

②一次関数を仮定した後、係数を求め、回帰式を決定

 

 

今回の対象は電子投票の拡散プロセスなので、

 

evoters=b0+b1election  と方程式を仮定して、

 

この一次関数を、下のコードを入力することで、データにフィットさせます。

 

# Run the regression

linear_model=lm(evoter_share~election, data=evote) 

# Get parameters of the function

coef(linear_model)

 

すると、

 

##  (Intercept)     election

## -0.009857143  0.042523810

 

という結果が出てきました。

 

 

これによって、

y切片(b0)は、-0.009857143

傾き(b1)は、0.042523810と分ります。

 

 

ということで、

 

# compute the fitted values

predicted_linear=-0.009857143 + 0.042523810*evote$election

 

# alternatively we can use built-in function

# predict(linear_model,newdata=data.frame(election=evote$election)

 

# how the vector predicted_linear looks like

predicted_linear

 

を入力して、予測できるそれぞれの選挙の値を求めます。

 

## [1] 0.03266667 0.07519048 0.11771429 0.16023810 0.20276191 0.24528572

## [7] 0.28780953 0.33033334

 

このような結果が求められました。

 

 

③線形関数グラフを出力(平均絶対誤差(MAE)も求める)

 

 

必要なデータが揃ったら、以下のコードでグラフを出力させます!

 

plot(evote$election,evote$evoter_share,xlab="election",ylab="Share",col="skyblue",pch=16,ylim=c(0,0.4),cex=2)

lines(evote$election,predicted_linear,lwd=2,lty="dashed")

 

f:id:tommy-acoustic-7:20190313031424p:plain

 

 

 

いい感じに描けました。

 

ラインがデータクラウドの上下をどのように通過するかを見てみると、遠く離れた点はありませんね。

 

これは、電子投票の増加が8つの選挙にわたってかなり直線的であることを意味しています。

つまり、電子有権者の選挙ごとの増加は、ほぼ一定です。

 

 

ついでに、後で比較するため、

適合度(この関数がデータにどの程度適合しているか)も計算してみましょう。

 

具体的には実際のシェアと予測されたシェアの間の平均絶対差を求めます。

このような適合度は平均絶対誤差(MAE)と呼ばれ、値が小さいほどモデルのデータへの適合度が高くなります。

 

MAE=mean(abs(evote$evoter_share-predicted_linear))

MAE

 

と入力すると、

 

## [1] 0.02367857

 

と出力されました。MAE0.024ですね。

平均2.4%の絶対誤差があると解釈できます。

 

 

④対数ロジスティック関数(S曲線)を出力

 

最終目標のパートでも書いたように、今回の対象のグラフは右肩上がりにずっと伸び続けることはないので、線形成長モデルは将来的にはうまく機能しなくなります。

(ちなみに、上記の線形成長モデルだと24回目には電子投票率が100パーセントを超えてしまいます笑)

 

よって、対数ロジスティック関数(S曲線)を出力します。

 

y=a/(1+ce^(-blog(x)), a0.6投票率60パーセントまで伸びる)と仮定し、

 

loglogistic06=nls(y~0.6/(1+c*exp(-b*log(x))),start=list(b=0.2,c=20))

coef(loglogistic06)

 

から

 

##         b         c

##  1.502672 20.364245

 

 

という結果が出てきたので、これをグラフ化します。

 

predicted_loglogistics06=0.6/(1+20.36*(exp(-1.50*log(t))))

 

plot(t,predicted_loglogistics06,type="l",lwd=2,ylim=c(0,1),xlab="election",ylab="Share",lty="dashed")

points(evote$election,evote$evoter_share,col="skyblue",pch=16,cex=2)

 

f:id:tommy-acoustic-7:20190313031451p:plain

 

ちなみに、MAEは、

 

MAE=mean(abs(evote$evoter_share-predicted_loglogistics06[1:8]))

MAE

 

より、## [1] "0.03154756" と出てきます。