matlab练习程序(box-cox变换)

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函数比较长,在这里下载

结果如下:

原数据:

变换后:

posted @ 2022-10-29 12:54  Dsp Tian  阅读(1067)  评论(1编辑  收藏  举报