当前位置:   article > 正文

M-K趋势检验以及突变检验_m-k检验

m-k检验

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
正态分布概率分布表,自查概率密度函数
标准正态分布置信值查表
调用函数如下

% M-K总体趋势检验
clc
clear
%file= readmatrix("7777.csv");
data=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 19 18 ...
    17 16 15 14 3 15 1 2 5 1 15 2 5 21 4 7 58 9 6 4 5 1 2 0];    %输入原始数据--时间序列
%趋势检验
data=data';
alp=0.05;   %假设置信度为0.05
[Zmk,beta,output] = MK_trend(data,alp)
%突变检验
[UF,UB]= MK_mutation(data);
%概率密度函数
F=@(t)integral(@(x)(exp(-x.^2/2)/sqrt(2*pi)),-t,t)-(1-alp);
UF1 = fsolve(F,1);
%绘图
x=1:1:length(UF);
UF1=UF1.*ones(length(UF),1);
figure;
plot(x,UF,'b-')
hold on;
plot(x,UB,'g-')
hold on;
plot(x,UF1,'r-')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

趋势检验调用函数

%趋势检验
function [Zmk,beta,output] = MK_trend(data,alp)
%Zmk为趋势检验统计值,beta横梁趋势大小的指标,output假设检验结果
%计算检验统计值S
sgn=[];
for i=1:size(data,1)-1
    if data(i)>data(i+1)
        sgn(i,1)=-1;
    elseif data(i)==data(i+1)
        sgn(i,1)=0;
    elseif data(i)<data(i+1)
        sgn(i,1)=1;
    end
end
S=sum(sgn);
%计算方差Var
%当数据量小于10个数据的时候,此时数据量太小,一般是直接去概率表中查找S,这里直接给出S与Zmk的关系式
if size(data,1)<=10
    Zmk=2*S/((size(data,1))*(size(data,1)-1));
    %当数据量大于10个数据的时候
else
    %判断数据是否都是唯一的数据,如果数据唯一的话采用下面的计算方法
    if length(unique(data))==length(data)
        Var=((size(data,1))*(size(data,1)-1)*(2*size(data,1)+5))/18;
        %当数据量不唯一的时候
    else
        %找出所有重复数据的重复次数
        count=hist(data,unique(data));
        %将重复次数为1的数据剔除掉
        count(count==1)=[];
        %计算Var
        Var=(length(data)*(length(data)-1)*(2*length(data)+5)...
            -sum(count.*(count-1).*(2.*count+5)))/18;
    end
    %计算Zmk
    if S>0
        Zmk=(S-1)/sqrt(Var);
    elseif S==0
        Zmk=0;
    elseif S<0
        Zmk=(S+1)/sqrt(Var);
    end
end
%衡量趋势大小的指标
t=1;
for i=2:length(data)
    for j=1:(i-1)
        slope(t)=(data(i)-data(j))/(i-j);
        t=t+1;
    end
end
beta=median(slope);
%假设检验,双边假设,判断趋势是否明显
%概率密度函数
F=@(t)integral(@(x)(exp(-x.^2/2)/sqrt(2*pi)),-t,t)-(1-alp);
Zmk1 = fsolve(F,1);
if Zmk>0
    if abs(Zmk)>=Zmk1
        output=1;   %'在alp的置信水平上,数据处于明显上升的趋势'
    else
        output=2;   %'在alp的置信水平上,数据处于上升趋势'
    end
elseif Zmk<0
    if abs(Zmk)>=Zmk1
        output=3;  %'在alp的置信水平上,数据处于明显下降的趋势'
    else
        output=4;    %'在alp的置信水平上,数据处于下降趋势'
    end
else
    output=5;    %'不增不减'
end
end

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73

突变检验

function [UF,UB]= MK_mutation(data)
%将正序放在第一列,逆序放在第二列
data=[data flipud(data)];
for n=1:2
    for i =2:size(data,1)
        r=[];
        %计算秩序列
        for j=1:i-1
            if data(i,n)>data(j,n)
                r(j,n)=1;
            else
                r(j,n)=0;
            end
        end
        k=i-1;
        Sk(k,n)=sum(r(:,n));
        %计算均值
        ESk(k,n)=k*(k+1)/4;
        %计算方差
        VarSk(k,n)=k*(k-1)*(2*k+5)/72;
        %计算统计变量
        UFk(k,n)=(Sk(k,n)-ESk(k,n))/sqrt(VarSk(k,n));
    end
end
%正序计算结果取第一列
UF=UFk(:,1);
%逆序计算结果取第二列的负数
UB=flipud(-UFk(:,2));
%UF1、UB1都为0;
%UF=[0;UF];
%UB=[0;UB];

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/472154
推荐阅读
相关标签
  

闽ICP备14008679号