Code covered by the BSD License

### Highlights from Mann-Kendall Test

3.5
3.5 | 3 ratings Rate this file 29 Downloads (last 30 days) File Size: 1.93 KB File ID: #25531 Version: 1.0

# Mann-Kendall Test

### Simone Fatichi (view profile)

Mann-Kendall non-parametric trend test.

File Information
Description

The code performs original two tailed Mann-Kendall test. It tests the null hypothesis of trend absence in the vector V, against the alternative of trend.
The result of the test is returned in H = 1 indicates a rejection of the null hypothesis at the alpha significance level. H = 0 indicates a failure to reject the null hypothesis at the alpha significance level.

Required Products Statistics and Machine Learning Toolbox
MATLAB release MATLAB 7.5 (R2007b)
28 May 2016 Ali A

### Ali A (view profile)

@blanca ortiz
You can use the following code

function[H,p_value]=Mann_Kendall(V,alpha)
V=reshape(V,length(V),1);
alpha = alpha/2; %
n=length(V);
S=0;
for i=1:n-1
S = S + sum(sign(V(i+1:n) - V(i)));
end
h=1;
while ~isempty(V)
g=find(V==V(1));
tp=length(g);
Sum(h)=tp*(tp-1)*(2*tp+5); %#ok<AGROW>
V(g)= [];
h=h+1;
end
VarS=((n*(n-1)*(2*n+5))-sum(Sum))/18;
%Standard deviation
De=sqrt(VarS);
if S>=0;
z= ((S-1)/De)*(S~=0);
else
z= ((S+1)/De);
end
p_value=2*(1-normcdf(abs(z),0,1)); % tail on both sides
pz=norminv(1-alpha,0,1);
H=abs(z)>pz;
return

Comment only
28 May 2016 Ali A

### Ali A (view profile)

28 May 2016 Ali A

### Ali A (view profile)

13 May 2015 blanca ortiz

### blanca ortiz (view profile)

Can anyone help me please? I have tried different types of vectors and it doesn't work. I am getting two errors, first:

??? Undefined function or method 'Sqrt' for input arguments of type 'double'
and then too many outputs.
I would really appreciate if anyone could tell me an example of the vectors and if there is any other mistake. Thanks

V=reshape(V,length(V),1);
alpha = alpha/2; %
n=length(V);
i=0;S=0;
for i=1:n-1
S = S + sum(sign(V(i+1:n) - V(i)));
end
h=1;
while ~isempty(V)
g=find(V==V(1));
tp=length(g);
Sum(h)=tp*(tp-1)*(2*tp+5);
V(g)= [];
h=h+1;
end
VarS=((n*(n-1)*(2*n-5))-sum(Sum))/18;
%Standard deviation
De=Sqrt(VarS);
If S>=0;
Z= ((S-1)/De)*(S~=0);
else
z= ((S+1)/De);
end
p_value=2*(1-normcdf(abs(z),0,1)); % tail on both sides
pz=norminv(1-alpha,0,1);
H=abs(z)>pz;
return

Comment only
05 Dec 2014 Jie

### Jie (view profile)

What is the vector type for this test? I tried different types but they didn't work.

Comment only
25 Sep 2014 Hydro

### Hydro (view profile)

I found exactly what i was doing..however, i am getting an error message of too many output argument.Any help would be appreciated.

function [H,P] = mann_kendall(x,alpha)
if nargin<2;
alpha=0.05;
end
n=length(x);
i=0; j=0; S=0;
alpha=alpha/2;

for i = 1:n-1
for j=i+1:n
S = S + sign(x(j) - x(i));
end
end

VS=(n*(n-1))*(2*n+5)/18; % Variance
De=sqrt(VS); % Standard Deviation

if S >= 0;
Z=((S-1)/De)*(S~=0);
else
Z=((S+1)/De);
end

P=2*(1-normcdf(abs(Z),0,1)); % tail on both side
pz = norminv(1-alpha,0,1);
H=abs(Z)> pz;

end

Comment only
01 Oct 2013 Roque Santos

### Roque Santos (view profile)

Hello,

Is showing an error that says: "Undefined function 'Mann_Kendall_Modified' for input arguments of type 'double'."

How do I correct?

Comment only
30 Mar 2013 Ehsan Jalilvand

### Ehsan Jalilvand (view profile)

Hi Simone,
First of all thank you. I've made some minor change to your code as follow,to include tied groups in Calculating the variance:
after line 48:
% Determining the variance (tied group included)
h=1;
while ~isempty(V)
g=find(V==V(1));
tp=length(g);
Sum(h)=tp*(tp-1)*(2*tp+5);
V(g)=[];
h=h+1;
end
VarS=((n*(n-1)*(2*n+5))-sum(Sum))/18;

Ehsan

Comment only
26 Feb 2013 Brian Novak

### Brian Novak (view profile)

Vectorizing the inner loop in the double sum for calculating S speeds it up significantly:

for i = 1:n-1
S = S + sum(sign(V(i+1:n) - V(i)));
end

Comment only
25 May 2012 Janak

### Janak (view profile)

Hi Fatichi,

I want to run your code for trend analysis. I have matlab 11 and statistical tool box in my computer. Can you provide example data file for this code.

Ram

Comment only
04 Mar 2011 Hari

### Hari (view profile)

Hi, Simone Fatichi,

I am new to Mat lab.Please tell me how to give input data and run your Mann_Kendall.m code using Mat lab.

Comment only
10 Nov 2009 Hanna Modin

### Hanna Modin (view profile)

Thank you!

It is working very well and is very convenient to use since it returns the result of the hypothesis test, not just the test statistic. But: the alternative of S = 0 --> Z = 0 is not accounted for if I'm right.

For future updates I would also wish for a default significance level (for convenience). And perhaps a mention in the help text that there should be no autocorrelation in residuals.