拙文を書くのに使ったRコードは以下の通り。自分の学習用のメモが記入されているが適宜に無視して読まれたい。使用したRは version 4.2.1 でwindows10で作動させた。パッケージのpsychは記述統計量を一括表示するのに便利なので使った。パッケージextraDistr は三角分布のような特殊な確率分布の乱数生成に使った。三角分布なら自作の関数を作る人もいるだろうが、このパッケージはRで標準装備されていない様々な確率分布が用意されているので何かの時に便利と思われる。
library(psych) # 記述統計量の一括出力に使う
library(extraDistr) # 特殊な確率分布の乱数生成に使う
#########################################################
## 販売数量 三角分布の乱数使用
## 販売単価、単位変動原価 誤差項に正規分布の乱数使用
# 販売単価と単位変動費に誤差項を加える
# 反復計算回数が多いのでapply()系の関数で処理する
# 関数の返り値が複数の時はlistを使う。
## 第1モデルの前提
# 販売数量 最小値1000 最大値10000 mode(最頻値)5000
# の三角分布を仮定 最低販売数量1000
# 限界利益=売上高-変動原価
# 売上高=販売単価×販売数量
# 変動原価=単位変動原価×販売数量
# 販売単価=100+2000/販売数量 + 誤差項(正規乱数)
# 単位変動原価=70 + 1000/販売数量 + 誤差項(正規乱数)
# これらの前提にしたがって限界利益を計算する関数を作る
# 限界利益関数(a,b,c は三角分布の引数)
xmtr<-function(a,b,c){
x<-0
sq<- rtriang(1,a,b,c)
sp<- 100+2000/sq + rnorm(1)
cv<- 70+1000/sq + rnorm(1)
x<-sq*sp-cv*sq
return(list(sq,sp,cv,x))}
# 2万回の試行データを得る
set.seed(123)
data1<-replicate(20000,xmtr(1000,10000,5000))
## sapply を 使って replicate と同一の結果を出せる。
set.seed(123)
testdata<-sapply(1:20000,function(i) xmtr(1000,10000,5000))
# data1はリストになっているので、要素毎に数値ベクトルに変換
# 販売数量データ
squant1<-as.numeric(data1[1, ])
sqtest<-as.numeric(testdata[1,])
head((squant1-sqtest),10)
# 販売価格データ
sprice1<-as.numeric(data1[2,])
# 単位変動原価データ
costv1<-as.numeric(data1[3,])
# 限界利益データ
margin1<-as.numeric(data1[4,])
# 販売数量の分布
hist(squant1,prob=T,main="販売数量の分布",
breaks = seq(min(squant1), max(squant1), length.out = 31),
xlab="販売数量",ylab="相対頻度",cex.lab=1.2)
describe(squant1,quant=c(0.2,0.4,0.5,0.6,0.8))
# 販売価格の分布
hist(sprice1,prob=F,main="販売価格の分布",
breaks = seq(min(sprice1), max(sprice1), length.out = 31),
xlab="販売価格",ylab="相対頻度",cex.lab=1.2)
describe(sprice1,quant=c(0.25,0.5,0.75))
# 単位変動原価の分布
hist(costv1,prob=T,main="単位変動原価の分布",
breaks = seq(min(costv1), max(costv1), length.out = 31),
xlab="単位変動原価",ylab="相対頻度",cex.lab=1.2)
describe(costv1,quant=c(0.25,0.5,0.75))
# 限界利益の分布
hist(margin1,freq=F,main="限界利益の確率密度",
breaks = seq(min(margin1), max(margin1), length.out = 31),
xlab="限界利益",ylab="確率密度",cex.lab=1.2)
lines(density(margin1),lwd=5,col="cyan")
describe(margin1,quant=c(0.2,0.4,0.5,0.6,0.8))
plot(ecdf(margin1),col="navy",lwd=5,
xlab="限界利益",ylab="分布関数",cex.axis=0.8,
main="限界利益の累積分布",cex.lab=1.2)
grid(40,40,lwd=1,lty=1,col="cyan")
segments(173216,0,173216,0.6,col="red",lwd=3)
segments(-100000,0.6,173216,0.6,col="red",lwd=3)
text(173216,0,"173216")
text(10000,0.55,"0.6")
qq1<-quantile(margin1,probs=c(0.1,0.2,0.3,0.4,
0.5,0.6,0.7,0.8,0.9))
print(round(qq1,digits=0))
#############################
#############################
#############################
## 第2モデルの前提
# 販売数量 最小値1000 最大値10000 mode(最頻値)3000
# の三角分布を仮定 最低販売数量1000
# 限界利益=売上高-変動原価
# 売上高=販売単価×販売数量
# 変動原価=単位変動原価×販売数量
# 販売単価=100+2000/販売数量 + 誤差項(正規乱数)
# 単位変動原価=70 + 1000/販売数量 + 誤差項(正規乱数)
# これらの前提にしたがって限界利益を計算する関数を作る
# 限界利益関数(a,b,c は三角分布の引数)
xmtr<-function(a,b,c){
x<-0
sq<- rtriang(1,a,b,c)
sp<- 100+2000/sq + rnorm(1)
cv<- 70+1000/sq + rnorm(1)
x<-sq*sp-cv*sq
return(list(sq,sp,cv,x))}
# 2万回の試行データを得る
set.seed(123)
data2<-replicate(20000,xmtr(1000,10000,3000))
# 販売数量データ
squant2<-as.numeric(data2[1,])
# 販売価格データ
sprice2<-as.numeric(data2[2,])
# 単位変動原価データ
costv2<-as.numeric(data2[3,])
# 限界利益データ
margin2<-as.numeric(data2[4,])
# 販売数量の分布
hist(squant2,prob=T,main="販売数量の分布",
breaks = seq(min(squant2), max(squant2), length.out = 31),
xlab="販売数量",ylab="相対頻度",cex.lab=1.2)
describe(squant2,quant=c(0.2,0.4,0.5,0.6,0.8))
# 販売価格の分布
hist(sprice2,prob=F,main="販売価格の分布",
breaks = seq(min(sprice2), max(sprice2), length.out = 31),
xlab="販売価格",ylab="相対頻度",cex.lab=1.2)
describe(sprice2,quant=c(0.25,0.5,0.75))
# 単位変動原価の分布
hist(costv2,prob=T,main="単位変動原価の分布",
breaks = seq(min(costv2), max(costv2), length.out = 31),
xlab="単位変動原価",ylab="相対頻度",cex.lab=1.2)
describe(costv2,quant=c(0.25,0.5,0.75))
# 限界利益の分布
hist(margin2,freq=F,main="限界利益の確率密度",
breaks = seq(min(margin2), max(margin2), length.out = 31),
xlab="限界利益",ylab="確率密度",cex.lab=1.2)
lines(density(margin2),lwd=5,col="cyan")
describe(margin2,quant=c(0.2,0.4,0.5,0.6,0.8))
plot(ecdf(margin2),col="navy",lwd=5,
xlab="限界利益",ylab="分布関数",cex.axis=0.8,
main="限界利益の累積分布",cex.lab=1.2)
grid(40,40,lwd=1,lty=1,col="cyan")
segments(150052,0,150052,0.6,col="red",lwd=3)
segments(-100000,0.6,150052,0.6,col="red",lwd=3)
text(150052,0,"150052",cex=0.6)
text(1000,0.55,"0.6",cex=0.6)
segments(116171,0,116171,0.4,col="red",lwd=3,lty=3)
segments(-100000,0.4,116171,0.4,col="red",lwd=3,lty=3)
text(116171,0,"116171",cex=0.6)
text(1000,0.35,"0.4",cex=0.6)
qq0<-quantile(margin2,probs=c(0.47))
qq0
qq1<-quantile(margin2,probs=c(0.1,0.2,0.3,0.4,
0.5,0.6,0.7,0.8,0.9))
print(round(qq1,digits=0))
(註1)
1970年に当時の錚々(そうそう)たる統計学者や計量経済学者が集まってパネル・ディスカッションが開催された。マクロ計量経済モデルと時系列分析の長所、短所、有効性などについて議論が行われている。表題はパネル・ディスカッション:実証分析の方法--計量経済分析と時系列分析--となってりpdfファイルで4分冊にまとめられている。(下記サイト参照)
現在読んでみても大変に読み応えがあるレポートで要約者も大変な学者と思われる。当時と現在の大きな違いは、いまでは一般人であってもパソコンや統計ソフト、必要なデータがそろえばここで議論されているような話題について自分の茶の間でかなりの程度に体験できる時代になったことだろう。PCの性能向上だけでなく統計処理のソフトウエアも進化し使いやすくなったことを実感する。 https://www.imes.boj.or.jp/research/papers/japanese/kks6-1.pdf
計量経済分析におけるモンテカルロ法やノンパラメトリック密度の推定については下記参考文献のJohnston Econometric Methods のChapter11でコンパクトに解説されている。
参考文献
James R.Evans,Daid L. Olson(1998) Introduction to Simulation and Risk Analysis, Prentice Hall
(リスク分析・シミュレーション入門 服部正太 監訳(1999)
共立出版株式会社)
Jack Johnston,John DiNardo(1997)
Econometric Methods 4th ed. The McGraw-Hill Companies,Inc.