box-cox变换可以将非正态分布的数据变换到正态分布。
变换公式如下:
其中lambda是待求参数。
这里就遍历可能的lambda值,得到变换后的数据,再通过sw正态分布检验,选取最好的lambda值。
如果有自变量的话可以考虑这篇文章中的优化方法。
matlab代码如下:
clear all;close all;clc y = chi2rnd(5,1500,1); %自由度5的卡方分布1500个数 histogram(y,50); maxp = -1; re_y=[]; re_lambda=0; for lambda=-3:0.01:3 if lambda==0 %box-cox变换 newy = log(y); else newy = (y.^lambda-1)./lambda; end [~,p,~] = swtest(newy); %Shapiro-Wilk正态分布检验 if p > maxp maxp = p; re_y = newy; re_lambda = lambda; end end figure; histogram(re_y,50);
其中swtest函数比较长,在这里下载。
结果如下:
原数据:
变换后: