Stats

Popular Posts

Followers

Box-Cox transformation with Mathematica

戴忠淵 於 2010年3月23日星期二 上午8:17 發表
Box-Cox transformation是一種數據轉換技術,旨在使資料更符合常態分佈或類似常態分佈的假設。它是由統計學家George Box和David Cox在1964年提出的。 Box-Cox轉換涉及到一個指數λ,通過將數據點x進行以下轉換: 

y(λ)=(x^λ-1)/λ, 若λ≠0
y(λ)=Log(x), 若λ=0

Box-Cox轉換可以使資料更加符合常態分佈或類似常態分佈的假設,從而提高模型的預測能力和準確性。在實際應用中,通常需要對資料進行多次Box-Cox轉換,並選擇轉換後使資料分佈最接近正態分佈的λ值。當λ > 1時,它可以將正偏的資料變得更加對稱,而當λ < 1時,它可以將負偏的資料變得更加對稱。當λ = 0時,Box-Cox轉換即為對數轉換。 

需要注意的是,Box-Cox轉換只適用於正數資料。如果數據中包含負數,則可以使用相關的技術,如Yeo-Johnson轉換。另外,Box-Cox轉換不適用於包含零值的資料。在這種情況下,可以使用對數加一(log(x+1))轉換。
data=Flatten[{#,Exp[#+RandomReal[NormalDistribution[0,1],1]]}]&/@Range[1,8,0.025];

(*畫出資料的散佈圖*)
ListPlot@data

(*計算各Lambda之R-Square*)
mymodel[n_]:=Block[{nlm,ntemp=n,datatemp},
datatemp={First@#,
If[ntemp==0,Log[Last@#],((Last@#)^ntemp-1)/ntemp]}&/@data;
nlm=LinearModelFit[datatemp,x,x];
nlm["RSquared"]
]

(*可發現當Lambda=0時,R-Square最大,所以最適轉換為取Ln*)
{#,mymodel[#]}&/@Range[-3,3,0.25]//TableForm
ListPlot[{#,mymodel[#]}&/@Range[-3,3,0.25]]

(*計算模式*)
myfun[x_]=Limit[(x^\[Lambda]-1)/\[Lambda],
\[Lambda]->SortBy[{#,mymodel[#]}&/@Range[-3,3,0.25],Last][[-1,1]]]

lm=LinearModelFit[{First@#,myfun[Last@#]}&/@data,x,x]

(*畫出轉換後之迴歸線及散佈圖*)
Plot[lm[x],{x,0,8},Epilog->{Red,Point[{First@#,myfun[Last@#]}&/@data]}]
Tags: , , , , ,

讀者回應 ( 0 意見 )

發佈留言

Please leave your name and tell me what you thought about this site. Comments, suggestions and views are welcomed.

如果這篇文章對你有幫助,那請留個訊息給我~