-
Notifications
You must be signed in to change notification settings - Fork 0
/
chi2test.m
60 lines (54 loc) · 1.99 KB
/
chi2test.m
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
function [p, Q]= chi2test(x)
% Usage: [p, Q]= chi2test(x)
%
% The chi-squared test.
%
% Given a number of samples this function tests the hypothesis that the samples are
% independent. If Q > chi2(p, nu), the hypothesis is rejected.
%
% Each column represents a variables, each row a sample.
%
% If you find any errors, please let me know: .
%
% ARGUMENTS:
% x Absolut numbers.
% p The prob ability value, calculated from Q.
% Q The resulting Q-value.
%
% EXAMPLE 1
% In region A, 324 of 556 cows were red, whereas in region B 98 of 260 were red.
% [p, Q]= chi2test([324, 556-324; 98, 260-98])
% p=
% 4.2073e-08
% Q=
% 30.0515
% With an error risk of about 4e-08, we can claim that the samples are independent.
%
% EXAMPLE 2
% Throw two different dices to see if they have the same probability of 1 (and 2, 3, 4, 5, 6).
% We don't check if they are symetrical, only if the both behave in the same way.
% [p,Q] = chi2test([15,10; 7,11; 9,7; 20,15; 26,21; 19,16])
% p=
% 0.8200
% Q =
% 2.2059
% The dices don't significantly behave differently. That is, they seem to behave in the same way.
%
% HISTORY: v.1.0, first working version, 2007-08-30.
%
% COPYRIGHT: (c) 2007 Peder Axensten. Use at own risk.
% KEYWORDS: chi-squared test, chi-squared, chi2, test
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Check the arguments.
if(nargin ~= 1), error('One and only one argument required!'); end
if(ndims(x) ~= 2), error('The argument (x) must be a 2d matrix!'); end
if(any(size(x) == 1)), error('The argument (x) must be a 2d matrix!'); end
if(any(~isreal(x))), error('All values of the argument (x) must be real values!'); end
% Calculate Q = sum( (a-np*)^2/(np*(1-p*)) )
s= size(x, 1);
r= size(x, 2);
np= sum(x, 2)/sum(sum(x)) * sum(x); % p=sum(x, 2)/sum(sum(x)) and n=sum(x)
Q= sum(sum((x-np).^2./(np)));
% Calculate cdf of chi-squared to Q. Degrees of freedom, v, is (r-1)*(s-1).
p= 1 - gammainc(Q/2, (r-1)*(s-1)/2);
end