Source code of Hypergeometric macros
Contents
Introduction
This is a report by Prateek Papriwal for the GSOC 2012 on the project "Distribution functions". This page gathers proposals for the Hypergeometric distribution.
A word of caution
These function are just temporary work and may contain bugs, which may have been fixed in the distfun project at http://forge.scilab.org/index.php/p/distfun/source/.
distfun_hygepdf.sci
function y = distfun_hygepdf(varargin) [lhs,rhs] = argn() apifun_checkrhs("distfun_hygepdf",rhs,4) apifun_checklhs("distfun_hygepdf",lhs,0:1) x = varargin(1) M = varargin(2) N = varargin(3) k = varargin(4) // // Check type apifun_checktype("distfun_hygepdf",x,"x",1,"constant") apifun_checktype("distfun_hygepdf",M,"M",2,"constant") apifun_checktype("distfun_hygepdf",N,"N",3,"constant") apifun_checktype("distfun_hygepdf",k,"k",4,"constant") // // Check content apifun_checkgreq("distfun_hygepdf",x,"x",1,0) apifun_checkgreq("distfun_hygepdf",M,"M",2,0) apifun_checkgreq("distfun_hygepdf",N,"N",3,0) apifun_checkgreq("distfun_hygepdf",k,"k",4,0) [x,M,N,k] = apifun_expandvar(x,M,N,k) if (x == []) then y=[] return end ok = k < x | N < x | k - x > M - N p = k ./ M for i = 1:size(x,'c') if (ok(i)) then y(1,i) = 0 else y1 = distfun_binopdf(x(i),N(i),p(i)) y2 = distfun_binopdf(k(i)-x(i),M(i)-N(i),p(i)) y3 = distfun_binopdf(k(i),M(i),p(i)) y(1,i) = y1 .* y2 ./ y3 end end endfunction
distfun_hygecdf.sci
function p = distfun_hygecdf(varargin) [lhs,rhs] = argn() apifun_checkrhs("distfun_hygepdf",rhs,4:5) apifun_checklhs("distfun_hygepdf",lhs,0:1) x = varargin(1) M = varargin(2) N = varargin(3) k = varargin(4) lowertail = apifun_argindefault(varargin,5,%t) // // Check type apifun_checktype("distfun_hygepdf",x,"x",1,"constant") apifun_checktype("distfun_hygepdf",M,"M",2,"constant") apifun_checktype("distfun_hygepdf",N,"N",3,"constant") apifun_checktype("distfun_hygepdf",k,"k",4,"constant") apifun_checktype("distfun_hygecdf",lowertail,"lowertail",5,"boolean") apifun_checkscalar("distfun_hygecdf",lowertail,"lowertail",5) // // Check content apifun_checkgreq("distfun_hygepdf",x,"x",1,0) apifun_checkgreq("distfun_hygepdf",M,"M",2,0) apifun_checkgreq("distfun_hygepdf",N,"N",3,0) apifun_checkgreq("distfun_hygepdf",k,"k",4,0) [x,M,N,k] = apifun_expandvar(x,M,N,k) if (x == []) then p=[] return end temp = zeros(1,size(x,'c')) for i = 1:size(x,'c') for j = 0:x(i) temp(i) = temp(i) + distfun_hygepdf(j,M(i),N(i),k(i)) end end if (lowertail) then p = temp else path = distfun_getpath() internallib = lib(fullfile(path,"macros","internals")) p = distfun_p2q(temp) end endfunction
distfun_hygeinv.sci
function x = distfun_hygeinv(varargin) [lhs,rhs] = argn() apifun_checkrhs("distfun_hygeinv",rhs,4:5) apifun_checklhs("distfun_hygeinv",lhs,0:1) p = varargin(1) M = varargin(2) N = varargin(3) k = varargin(4) lowertail = apifun_argindefault(varargin,5,%t) // // Check type apifun_checktype("distfun_hygeinv",p,"p",1,"constant") apifun_checktype("distfun_hygeinv",M,"M",2,"constant") apifun_checktype("distfun_hygeinv",N,"N",3,"constant") apifun_checktype("distfun_hygeinv",k,"k",4,"constant") apifun_checktype("distfun_hygeinv",lowertail,"lowertail",5,"boolean") apifun_checkscalar("distfun_hygeinv",lowertail,"lowertail",5) // // Check content apifun_checkrange("distfun_hygeinv",p,"p",1,0,1) apifun_checkgreq("distfun_hygeinv",M,"M",2,0) apifun_checkgreq("distfun_hygeinv",N,"N",3,0) apifun_checkgreq("distfun_hygepdf",k,"k",4,0) [p,M,N,k] = apifun_expandvar(p,M,N,k) if (p == []) then x = [] return end i = zeros(1,size(p,'c')) for j = 1:size(p,'c') if (lowertail) then while(%t) if(distfun_hygecdf(i(j),M(j),N(j),k(j)) >= p(j) ) then break end i(j) = i(j) + 1 end x(1,j) = i(j) else path = distfun_getpath() internallib = lib(fullfile(path,"macros","internals")) q(j) = distfun_p2q(p(j)) while(%t) if(distfun_hygecdf(i(j),M(j),N(j),k(j)) >= q(j) ) then break end i(j) = i(j) + 1 end x = i(1,j) + 1 end end endfunction
distfun_hygernd.sci
function R = distfun_hygernd(varargin) path = distfun_getpath() internallib = lib(fullfile(path,"macros","internals")) [lhs,rhs] = argn() apifun_checkrhs("distfun_hygernd",rhs,3:5) apifun_checklhs("distfun_hygernd",lhs,0:1) M = varargin(1) N = varargin(2) k = varargin(3) // // Check type apifun_checktype ( "distfun_hygernd" , M , "M" , 1 , "constant" ) apifun_checktype ( "distfun_hygernd" , N , "N" , 2 , "constant" ) apifun_checktype ( "distfun_hygernd" , k , "k" , 3 , "constant" ) [M,N,k] = apifun_expandvar(M,N,k) if (rhs == 3) then m = size(M,'r') n = size(M,'c') b = zeros(m,n) for i = 1:m for j = 1:n count = 0 t = 0:k(i,j) p = distfun_hygepdf(t,M(i,j),N(i,j),k(i,j)) a = cumsum(p(1:k(i,j))) ./ sum(p) for l = 1:k(i,j) if (rand(1,1) >= a(l) ) then count = count + 1 end end b(i,j) = count b(i,j) = t(b(i,j)+1) end end R = b return end if ( rhs == 4 ) then v = varargin(4) end if ( rhs == 5 ) then m = varargin(4) n = varargin(5) end distfun_checkvmn ( "distfun_hygernd" , 4 , varargin(4:$) ) if (M == []) then R = [] return end // // Check content apifun_checkgreq("distfun_hygernd",M,"M",1,0) apifun_checkgreq("distfun_hygernd",N,"N",2,0) apifun_checkgreq("distfun_hygernd",k,"k",3,0) t = 0:k p = distfun_hygepdf(t,M,N,k) a = cumsum(p(1:k)) ./ sum(p) b = rand(m,n) for i = 1:m for j = 1:n count = 0 for l = 1:k if (b(i,j) >= a(l)) then count = count + 1 end end b(i,j) = count end end R = t(b + 1) R = matrix(R,m,n) endfunction
distfun_hygestat.sci
function [M,V] = distfun_hygestat(M,N,k) [lhs,rhs] = argn() apifun_checkrhs("distfun_hygestat",rhs,3) apifun_checklhs("distfun_hygestat",lhs,1:2) // Check type // apifun_checktype("distfun_hygestat",M,"M",1,"constant") apifun_checktype("distfun_hygestat",N,"M",2,"constant") apifun_checktype("distfun_hygestat",k,"M",3,"constant") [M,N,k] = apifun_expandvar(M,N,k) //Check content // apifun_checkgreq("distfun_hygestat",M,"M",1,N) apifun_checkrange("distfun_hygestat",N,"N",2,0,M) apifun_checkrange("distfun_hygestat",k,"k",3,0,M) // M = k .* N ./ M V = (k .* N .* (M-N) .* (M -k)) ./ (M .* M .* (M - 1)) endfunction