Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

RによるBox-Cox変換

12,839 views

Published on

Published in: Education
  • Dating for everyone is here: ♥♥♥ http://bit.ly/39mQKz3 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Sex in your area is here: ♥♥♥ http://bit.ly/39mQKz3 ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

RによるBox-Cox変換

  1. 1. 2009.12 作成 データを正規分布に近づける: Box-Cox 変換 Box-Cox 変換(Box-Cox transformation)とは、正規分布に従わないデータを正規分布に近づける方法。 正の値をとる確率変数 X に対し、 変換パラメータλを用いて以下のように変換すると、変換後のデータ X*は正規分布に従う。λ=-1 では逆数変換、λ=0 で対数変換、λ=0.5 で平方根変換と同じものになる。 下の図は、Tweedie 分布及び対数正規分布に従う乱数データについて、Box-Cox 変換(λ=0)を行い、もとのデータと変換後のデータをそれぞれヒストグラムにしたもの。 Tweedie分布 対数正規分布 0.6 0.6 0.5 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0.0 0.0 0 1 2 3 4 5 0 2 4 6 8 10 Tweedie、変換後 対数正規分布、変換後 0.6 0.6 0.5 0.5 0.4 0.4 0.3 0.3 0.2 0.2 0.1 0.1 0.0 0.0 -3 -2 -1 0 1 2 3 -2 -1 0 1 2
  2. 2. ヒストグラムよりもさらに正規性が目視でわかりやすいのでよく使用されるのが Q-Q プロットで、データを昇順にソートし、カイ二乗分布を想定した理論値と実際の値を仮定してデータをプロットする。 データが正規分布に従っていれば、プロット点が原点を通る傾き 1 の直線上にのる。Tweedie 分布データも、対数化すれば正規分布になる対数正規分布データとおなじくらいきれいに直線上にのることが確認できる。 Tweedie分布 対数正規分布 20 6 15 4 10 2 5 0 0 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 norm quantiles norm quantiles 変換後 変換後 2 1 1 0 0 -1 -1 -2 -2 -3 -3 -2 -1 0 1 2 3 -3 -2 -1 0 1 2 3 norm quantiles norm quantiles注意事項 Box-Cox 変換は単変量データに対する手法であり、もとのデータが他の変数と何らかの関係性がある場合は、変換によってその関係が崩れることに注意が必要。また、0 や負の数のデータがある場合は変換ができないため、全て正の数になるようデータを平行移動するのが定石とされているが、この操作はどの程度動かすかによって結果が変わってしまうため、あまり薦められない。
  3. 3. R プログラム○ データ作成 rm(list=ls(all=TRUE)) # ワークスペースのクリア setwd("d:/test/") # 必要に応じて作業ディレクトリを指定 # Tweedie 分布データ library(tweedie) # Tweedie 分布乱数発生用 p <- 2.5 # べき乗のパラメータ mu <- 1 # 平均値パラメータ ph <- 1 # 分散パラメータ Tdat<- rtweedie(100, power=p, mu=mu, phi=ph) # 対数正規分布データ Ndat<- exp(rnorm(100)) # デフォルトで平均 0 分散 1○ λ(ラムダ)の推計 ライブラリ car を使用する。 library(car) box.cox.powers(Tdat) # 最適なのは 0 box.cox.powers(Ndat) # 最適なのは 0 コンソール出力は以下のとおり。水色でマークしたのが推計結果だが、実際の変換は 通常きりのいい数字を使用する。この場合、両者ともラムダは 0 を使う。 >box.cox.powers(Tdat)# 最適なのは 0 Box-Cox Transformation to Normality Est.PowerStd.Err. Wald(Power=0) Wald(Power=1) 0.0605 0.0834 0.7251 -11.2662 L.R. test, power = 0: 0.5275 df = 1 p = 0.4677 L.R. test, power = 1: 114.9119 df = 1 p = 0 >box.cox.powers(Ndat) Box-Cox Transformation to Normality Est.PowerStd.Err. Wald(Power=0) Wald(Power=1) -0.0832 0.103 -0.8082 -10.5186 L.R. test, power = 0: 0.6629 df = 1 p = 0.4155 L.R. test, power = 1: 127.4005 df = 1 p = 0
  4. 4. ○ データ変換パラメータ p に、推計したλの値を代入する。 Tdat2 <- box.cox(Tdat, p=0) Ndat2 <- box.cox(Ndat, p=0)○ ヒストグラム表示 library(MASS) # truehist 用 par(mfrow=c(2,2)) # グラフィック画面を 2×2 分割 truehist(Tdat, main="Tweedie 分布 変換前") lines(density(Tdat), col="red", lwd=2) # 密度関数表示 truehist(Ndat, main="対数正規分布 変換前") lines(density(Ndat), col="red", lwd=2) # 密度関数表示 truehist(Tdat2, main="Tweedie 分布 対数変換後") lines(density(Tdat2), col="red", lwd=2)# 密度関数表示 truehist(Ndat2, main="対数正規分布 対数変換後") lines(density(Ndat2), col="red", lwd=2)# 密度関数表示○ Q-Q プロット表示 par(mfrow=c(2,2)) # グラフィック画面を 2×2 分割 qq.plot(Tdat, main="Tweedie 分布 変換前") qq.plot(Ndat, main="対数正規分布 変換前") qq.plot(Tdat2, main="Tweedie 分布 対数変換後") qq.plot(Ndat2, main="対数正規分布 対数変換後")

×