Box-cox変換

  • Box-cox変換が話題になった
  • こんなソースもあるし
  • こんな記事もある
  • 基本的には、このブログの記事に賛成するのだけれど、そうは言っても『常識として、平方根を取る』というその「常識」にも意味があると思う
  • 「こんな分布になるのがふつう」であることを繰り返していると、「そうなるのがふつうでしかもそれを正規分布に移せて、それがデータハンドリング上のメリットがあってデメリットがないのだったら、そうしてやるのをデフォルトにしてもよいではないか。「ふつう」なことには意味があるのだから」と考えてもよさそうだ
  • 問題は「どうして平方根なのか」だろう
  • こんなことを試してみた
    • 分布のタイプごとに分布のパラメタを振りながら、乱数を発生させて、box.coxの返り値との関係をみてやると:
    • 引数とbox.cox指数との間に明らかに関係のあるものもあります。(ポアソン、指数、ワイブル…)
    • ここで、既知の分布というのは、その生起理由と関係していることが多いですから、box.coxをしてやって、返り値を見ている、というのは、「分布の形状解析」をしているという側面がありそうです
par(mfcol=c(2,3))
# normal
ms<-seq(from=1,to=16,length=20)
bcout<-ms
for(i in 1:length(ms)){
	rp<-rnorm(1000,ms[i])
	#rp<-rexp(1000,ms[i])
	bcout[i]<-Box.Cox.transformation2(rp-min(rp)+1)
}

plot(ms,bcout,main="norm")

# poisson
ms<-seq(from=1,to=16,length=20)
bcout<-ms
for(i in 1:length(ms)){
	rp<-rpois(1000,ms[i])
	#rp<-rexp(1000,ms[i])
	bcout[i]<-Box.Cox.transformation2(rp-min(rp)+1)
}

plot(ms,bcout,main="pois")

# exponential
ms<-seq(from=1,to=50,length=20)
bcout<-ms
for(i in 1:length(ms)){
	#rp<-rpois(1000,ms[i])
	rp<-rexp(1000,ms[i])
	bcout[i]<-Box.Cox.transformation2(rp-min(rp)+1)
}

plot(ms,bcout,main="exp")

# uniform
ms<-seq(from=1,to=50,length=20)
bcout<-ms
for(i in 1:length(ms)){
	
	rp<-runif(1000)
	bcout[i]<-Box.Cox.transformation2(rp-min(rp)+1)
}

plot(ms,bcout,main="unif")

# gamma
ms<-seq(from=1,to=50,length=20)
bcout<-ms
for(i in 1:length(ms)){
	
	rp<-rgamma(1000,ms[i])
	bcout[i]<-Box.Cox.transformation2(rp-min(rp)+1)
}

plot(ms,bcout,main="gamma")

# weibull
ms<-seq(from=1,to=50,length=20)
bcout<-ms
for(i in 1:length(ms)){
	
	rp<-rweibull(1000,ms[i])
	bcout[i]<-Box.Cox.transformation2(rp-min(rp)+1)
}

plot(ms,bcout,main="weibull")