-
Notifications
You must be signed in to change notification settings - Fork 25
/
Copy pathfdr.pas
executable file
·78 lines (74 loc) · 2.37 KB
/
fdr.pas
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
74
75
76
77
78
unit fdr;
interface
uses define_types;
procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double);
procedure qsort(lower, upper : integer; var Data:SingleP);
implementation
procedure qsort(lower, upper : integer; var Data:SingleP);
//40ms - very recursive...
var
left, right : integer;
pivot,lswap: single;
begin
pivot:=Data^[(lower+upper) div 2];
left:=lower;
right:=upper;
while left<=right do begin
while Data^[left] < pivot do left:=left+1; { Parting for left }
while Data^[right] > pivot do right:=right-1;{ Parting for right}
if left<=right then begin { Validate the change }
lswap := Data^[left];
Data^[left] := Data^[right];
Data^[right] := lswap;
left:=left+1;
right:=right-1;
end; //validate
end;//while left <=right
if right>lower then qsort(lower,right,Data); { Sort the LEFT part }
if upper>left then qsort(left ,upper,data); { Sort the RIGHT part }
end;
procedure EstimateFDR2(lnTests: integer; var Ps: SingleP; var lFDR05, lFDR01,lnegFDR05, lnegFDR01: double);
var
lInc: integer;
lrPs,Qs: SingleP;
begin
//rank Pvalues
//ShaQuickSort(lnTests,Singlep0(Ps[1]));
qSort(1,lnTests,Ps);
//qcksrt(1,lnTests,Ps);
GetMem(Qs,lnTests*sizeof(single));
//next findcrit FDR05
for lInc := 1 to lnTests do
Qs^[lInc] := (0.05*lInc)/lnTests;
lFDR05 := 0;
for lInc := 1 to lnTests do
if Ps^[lInc] <= Qs^[lInc] then
lFDR05 := Ps^[lInc];
//next findcrit FDR01
for lInc := 1 to lnTests do
Qs^[lInc] := (0.01*lInc)/lnTests;
lFDR01 := 0;
for lInc := 1 to lnTests do
if Ps^[lInc] <= Qs^[lInc] then
lFDR01 := Ps^[lInc];
//reverse
GetMem(lrPs,lnTests*sizeof(single));
for lInc := 1 to lnTests do
lrPs^[lInc] := 1- Ps^[lnTests-lInc+1];
for lInc := 1 to lnTests do
Qs^[lInc] := (0.05*lInc)/lnTests;
lnegFDR05 := 0;
for lInc := 1 to lnTests do
if lrPs^[lInc] <= Qs^[lInc] then
lnegFDR05 := lrPs^[lInc];
//next findcrit FDR01
for lInc := 1 to lnTests do
Qs^[lInc] := (0.01*lInc)/lnTests;
lnegFDR01 := 0;
for lInc := 1 to lnTests do
if lrPs^[lInc] <= Qs^[lInc] then
lnegFDR01 := lrPs^[lInc];
FreeMem(lrPs);
Freemem(Qs);
end;
end.