1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package ubic.basecode.math.metaanalysis;
20  
21  import cern.colt.list.DoubleArrayList;
22  import cern.jet.stat.Descriptive;
23  import cern.jet.stat.Probability;
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  public class MeanDifferenceMetaAnalysis extends MetaAnalysis {
42  
43      private double bsv; 
44  
45      private double e; 
46      private boolean fixed = true;
47      private double n; 
48      private double p; 
49      private double q; 
50      private double v; 
51      private double z; 
52  
53      
54  
55  
56      public MeanDifferenceMetaAnalysis( boolean fixed ) {
57          this.fixed = fixed;
58      }
59  
60      public double getBsv() {
61          return bsv;
62      }
63  
64      public double getE() {
65          return e;
66      }
67  
68      public double getN() {
69          return n;
70      }
71  
72      public double getP() {
73          return p;
74      }
75  
76      public double getQ() {
77          return q;
78      }
79  
80      public double getV() {
81          return v;
82      }
83  
84      public double getZ() {
85          return z;
86      }
87  
88      
89  
90  
91  
92  
93      public double run( DoubleArrayList effects, DoubleArrayList cvar ) {
94          DoubleArrayList weights;
95          DoubleArrayList conditionalVariances;
96          
97  
98          conditionalVariances = cvar.copy();
99          weights = metaFEWeights( conditionalVariances );
100         this.q = super.qStatistic( effects, conditionalVariances, super.weightedMean( effects, weights ) );
101 
102         if ( !fixed ) { 
103             this.bsv = metaREVariance( effects, conditionalVariances, weights );
104 
105             for ( int i = 0; i < conditionalVariances.size(); i++ ) {
106                 conditionalVariances.setQuick( i, conditionalVariances.getQuick( i ) + bsv );
107             }
108 
109             weights = metaFEWeights( conditionalVariances );
110         }
111 
112         this.e = super.weightedMean( effects, weights );
113         this.v = super.metaVariance( conditionalVariances );
114         this.z = Math.abs( e ) / Math.sqrt( v );
115         this.p = Probability.errorFunctionComplemented( z );
116         return p;
117     }
118 
119     public double run( DoubleArrayList effects, DoubleArrayList controlSizes, DoubleArrayList testSizes ) {
120         DoubleArrayList weights;
121         DoubleArrayList conditionalVariances;
122         this.n = Descriptive.sum( controlSizes ) + Descriptive.sum( testSizes );
123 
124         conditionalVariances = samplingVariances( effects, controlSizes, testSizes );
125         weights = metaFEWeights( conditionalVariances );
126         this.q = super.qStatistic( effects, conditionalVariances, super.weightedMean( effects, weights ) );
127 
128         if ( !fixed ) { 
129             this.bsv = metaREVariance( effects, conditionalVariances, weights );
130 
131             for ( int i = 0; i < conditionalVariances.size(); i++ ) {
132                 conditionalVariances.setQuick( i, conditionalVariances.getQuick( i ) + bsv );
133             }
134 
135             weights = metaFEWeights( conditionalVariances );
136         }
137 
138         this.e = super.weightedMean( effects, weights );
139         this.v = super.metaVariance( conditionalVariances );
140         this.z = Math.abs( e ) / Math.sqrt( v );
141         this.p = Probability.errorFunctionComplemented( z );
142         return p;
143     }
144 
145     
146 
147 
148 
149 
150 
151 
152 
153     public double samplingVariance( double d, double nC, double nT ) {
154         return ( nT + nC ) / ( nT * nC ) + d * d / 2 * ( nT + nC );
155     }
156 
157     
158 
159 
160 
161 
162 
163 
164 
165     public DoubleArrayList samplingVariances( DoubleArrayList effects, DoubleArrayList controlSizes,
166             DoubleArrayList testSizes ) {
167         if ( effects.size() != controlSizes.size() || controlSizes.size() != testSizes.size() )
168             throw new IllegalArgumentException( "Unequal sample sizes." );
169 
170         DoubleArrayList answer = new DoubleArrayList( controlSizes.size() );
171         for ( int i = 0; i < controlSizes.size(); i++ ) {
172             answer.add( samplingVariance( effects.getQuick( i ), controlSizes.getQuick( i ), testSizes.getQuick( i ) ) );
173         }
174         return answer;
175     }
176 
177 }