comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/stat/descriptive/moment/SemiVariance.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.stat.descriptive.moment;<a name="line.18"></a>
22 <FONT color="green">019</FONT> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.io.Serializable;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.stat.descriptive.AbstractUnivariateStatistic;<a name="line.22"></a>
26 <FONT color="green">023</FONT> <a name="line.23"></a>
27 <FONT color="green">024</FONT> /**<a name="line.24"></a>
28 <FONT color="green">025</FONT> * &lt;p&gt;Computes the semivariance of a set of values with respect to a given cutoff value.<a name="line.25"></a>
29 <FONT color="green">026</FONT> * We define the &lt;i&gt;downside semivariance&lt;/i&gt; of a set of values &lt;code&gt;x&lt;/code&gt;<a name="line.26"></a>
30 <FONT color="green">027</FONT> * against the &lt;i&gt;cutoff value&lt;/i&gt; &lt;code&gt;cutoff&lt;/code&gt; to be &lt;br/&gt;<a name="line.27"></a>
31 <FONT color="green">028</FONT> * &lt;code&gt;&amp;Sigma; (x[i] - target)&lt;sup&gt;2&lt;/sup&gt; / df&lt;/code&gt; &lt;br/&gt;<a name="line.28"></a>
32 <FONT color="green">029</FONT> * where the sum is taken over all &lt;code&gt;i&lt;/code&gt; such that &lt;code&gt;x[i] &lt; cutoff&lt;/code&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * and &lt;code&gt;df&lt;/code&gt; is the length of &lt;code&gt;x&lt;/code&gt; (non-bias-corrected) or<a name="line.30"></a>
34 <FONT color="green">031</FONT> * one less than this number (bias corrected). The &lt;i&gt;upside semivariance&lt;/i&gt;<a name="line.31"></a>
35 <FONT color="green">032</FONT> * is defined similarly, with the sum taken over values of &lt;code&gt;x&lt;/code&gt; that<a name="line.32"></a>
36 <FONT color="green">033</FONT> * exceed the cutoff value.&lt;/p&gt;<a name="line.33"></a>
37 <FONT color="green">034</FONT> *<a name="line.34"></a>
38 <FONT color="green">035</FONT> * &lt;p&gt;The cutoff value defaults to the mean, bias correction defaults to &lt;code&gt;true&lt;/code&gt;<a name="line.35"></a>
39 <FONT color="green">036</FONT> * and the "variance direction" (upside or downside) defaults to downside. The variance direction<a name="line.36"></a>
40 <FONT color="green">037</FONT> * and bias correction may be set using property setters or their values can provided as<a name="line.37"></a>
41 <FONT color="green">038</FONT> * parameters to {@link #evaluate(double[], double, Direction, boolean, int, int)}.&lt;/p&gt;<a name="line.38"></a>
42 <FONT color="green">039</FONT> *<a name="line.39"></a>
43 <FONT color="green">040</FONT> * &lt;p&gt;If the input array is null, &lt;code&gt;evaluate&lt;/code&gt; methods throw<a name="line.40"></a>
44 <FONT color="green">041</FONT> * &lt;code&gt;IllegalArgumentException.&lt;/code&gt; If the array has length 1, &lt;code&gt;0&lt;/code&gt;<a name="line.41"></a>
45 <FONT color="green">042</FONT> * is returned, regardless of the value of the &lt;code&gt;cutoff.&lt;/code&gt;<a name="line.42"></a>
46 <FONT color="green">043</FONT> *<a name="line.43"></a>
47 <FONT color="green">044</FONT> * &lt;p&gt;&lt;strong&gt;Note that this class is not intended to be threadsafe.&lt;/strong&gt; If<a name="line.44"></a>
48 <FONT color="green">045</FONT> * multiple threads access an instance of this class concurrently, and one or<a name="line.45"></a>
49 <FONT color="green">046</FONT> * more of these threads invoke property setters, external synchronization must<a name="line.46"></a>
50 <FONT color="green">047</FONT> * be provided to ensure correct results.&lt;/p&gt;<a name="line.47"></a>
51 <FONT color="green">048</FONT> *<a name="line.48"></a>
52 <FONT color="green">049</FONT> * @version $Revision: 917275 $ $Date: 2010-02-28 14:43:11 -0500 (Sun, 28 Feb 2010) $<a name="line.49"></a>
53 <FONT color="green">050</FONT> * @since 2.1<a name="line.50"></a>
54 <FONT color="green">051</FONT> */<a name="line.51"></a>
55 <FONT color="green">052</FONT> <a name="line.52"></a>
56 <FONT color="green">053</FONT> public class SemiVariance extends AbstractUnivariateStatistic implements Serializable {<a name="line.53"></a>
57 <FONT color="green">054</FONT> <a name="line.54"></a>
58 <FONT color="green">055</FONT> /**<a name="line.55"></a>
59 <FONT color="green">056</FONT> * The UPSIDE Direction is used to specify that the observations above the<a name="line.56"></a>
60 <FONT color="green">057</FONT> * cutoff point will be used to calculate SemiVariance.<a name="line.57"></a>
61 <FONT color="green">058</FONT> */<a name="line.58"></a>
62 <FONT color="green">059</FONT> public static final Direction UPSIDE_VARIANCE = Direction.UPSIDE;<a name="line.59"></a>
63 <FONT color="green">060</FONT> <a name="line.60"></a>
64 <FONT color="green">061</FONT> /**<a name="line.61"></a>
65 <FONT color="green">062</FONT> * The DOWNSIDE Direction is used to specify that the observations below<a name="line.62"></a>
66 <FONT color="green">063</FONT> * the cutoff point will be used to calculate SemiVariance<a name="line.63"></a>
67 <FONT color="green">064</FONT> */<a name="line.64"></a>
68 <FONT color="green">065</FONT> public static final Direction DOWNSIDE_VARIANCE = Direction.DOWNSIDE;<a name="line.65"></a>
69 <FONT color="green">066</FONT> <a name="line.66"></a>
70 <FONT color="green">067</FONT> /** Serializable version identifier */<a name="line.67"></a>
71 <FONT color="green">068</FONT> private static final long serialVersionUID = -2653430366886024994L;<a name="line.68"></a>
72 <FONT color="green">069</FONT> <a name="line.69"></a>
73 <FONT color="green">070</FONT> /**<a name="line.70"></a>
74 <FONT color="green">071</FONT> * Determines whether or not bias correction is applied when computing the<a name="line.71"></a>
75 <FONT color="green">072</FONT> * value of the statisic. True means that bias is corrected.<a name="line.72"></a>
76 <FONT color="green">073</FONT> */<a name="line.73"></a>
77 <FONT color="green">074</FONT> private boolean biasCorrected = true;<a name="line.74"></a>
78 <FONT color="green">075</FONT> <a name="line.75"></a>
79 <FONT color="green">076</FONT> /**<a name="line.76"></a>
80 <FONT color="green">077</FONT> * Determines whether to calculate downside or upside SemiVariance.<a name="line.77"></a>
81 <FONT color="green">078</FONT> */<a name="line.78"></a>
82 <FONT color="green">079</FONT> private Direction varianceDirection = Direction.DOWNSIDE;<a name="line.79"></a>
83 <FONT color="green">080</FONT> <a name="line.80"></a>
84 <FONT color="green">081</FONT> /**<a name="line.81"></a>
85 <FONT color="green">082</FONT> * Constructs a SemiVariance with default (true) &lt;code&gt;biasCorrected&lt;/code&gt;<a name="line.82"></a>
86 <FONT color="green">083</FONT> * property and default (Downside) &lt;code&gt;varianceDirection&lt;/code&gt; property.<a name="line.83"></a>
87 <FONT color="green">084</FONT> */<a name="line.84"></a>
88 <FONT color="green">085</FONT> public SemiVariance() {<a name="line.85"></a>
89 <FONT color="green">086</FONT> }<a name="line.86"></a>
90 <FONT color="green">087</FONT> <a name="line.87"></a>
91 <FONT color="green">088</FONT> /**<a name="line.88"></a>
92 <FONT color="green">089</FONT> * Constructs a SemiVariance with the specified &lt;code&gt;biasCorrected&lt;/code&gt;<a name="line.89"></a>
93 <FONT color="green">090</FONT> * property and default (Downside) &lt;code&gt;varianceDirection&lt;/code&gt; property.<a name="line.90"></a>
94 <FONT color="green">091</FONT> *<a name="line.91"></a>
95 <FONT color="green">092</FONT> * @param biasCorrected setting for bias correction - true means<a name="line.92"></a>
96 <FONT color="green">093</FONT> * bias will be corrected and is equivalent to using the argumentless<a name="line.93"></a>
97 <FONT color="green">094</FONT> * constructor<a name="line.94"></a>
98 <FONT color="green">095</FONT> */<a name="line.95"></a>
99 <FONT color="green">096</FONT> public SemiVariance(final boolean biasCorrected) {<a name="line.96"></a>
100 <FONT color="green">097</FONT> this.biasCorrected = biasCorrected;<a name="line.97"></a>
101 <FONT color="green">098</FONT> }<a name="line.98"></a>
102 <FONT color="green">099</FONT> <a name="line.99"></a>
103 <FONT color="green">100</FONT> <a name="line.100"></a>
104 <FONT color="green">101</FONT> /**<a name="line.101"></a>
105 <FONT color="green">102</FONT> * Constructs a SemiVariance with the specified &lt;code&gt;Direction&lt;/code&gt; property<a name="line.102"></a>
106 <FONT color="green">103</FONT> * and default (true) &lt;code&gt;biasCorrected&lt;/code&gt; property<a name="line.103"></a>
107 <FONT color="green">104</FONT> *<a name="line.104"></a>
108 <FONT color="green">105</FONT> * @param direction setting for the direction of the SemiVariance<a name="line.105"></a>
109 <FONT color="green">106</FONT> * to calculate<a name="line.106"></a>
110 <FONT color="green">107</FONT> */<a name="line.107"></a>
111 <FONT color="green">108</FONT> public SemiVariance(final Direction direction) {<a name="line.108"></a>
112 <FONT color="green">109</FONT> this.varianceDirection = direction;<a name="line.109"></a>
113 <FONT color="green">110</FONT> }<a name="line.110"></a>
114 <FONT color="green">111</FONT> <a name="line.111"></a>
115 <FONT color="green">112</FONT> <a name="line.112"></a>
116 <FONT color="green">113</FONT> /**<a name="line.113"></a>
117 <FONT color="green">114</FONT> * Constructs a SemiVariance with the specified &lt;code&gt;isBiasCorrected&lt;/code&gt;<a name="line.114"></a>
118 <FONT color="green">115</FONT> * property and the specified &lt;code&gt;Direction&lt;/code&gt; property.<a name="line.115"></a>
119 <FONT color="green">116</FONT> *<a name="line.116"></a>
120 <FONT color="green">117</FONT> * @param corrected setting for bias correction - true means<a name="line.117"></a>
121 <FONT color="green">118</FONT> * bias will be corrected and is equivalent to using the argumentless<a name="line.118"></a>
122 <FONT color="green">119</FONT> * constructor<a name="line.119"></a>
123 <FONT color="green">120</FONT> *<a name="line.120"></a>
124 <FONT color="green">121</FONT> * @param direction setting for the direction of the SemiVariance<a name="line.121"></a>
125 <FONT color="green">122</FONT> * to calculate<a name="line.122"></a>
126 <FONT color="green">123</FONT> */<a name="line.123"></a>
127 <FONT color="green">124</FONT> public SemiVariance(final boolean corrected, final Direction direction) {<a name="line.124"></a>
128 <FONT color="green">125</FONT> this.biasCorrected = corrected;<a name="line.125"></a>
129 <FONT color="green">126</FONT> this.varianceDirection = direction;<a name="line.126"></a>
130 <FONT color="green">127</FONT> }<a name="line.127"></a>
131 <FONT color="green">128</FONT> <a name="line.128"></a>
132 <FONT color="green">129</FONT> <a name="line.129"></a>
133 <FONT color="green">130</FONT> /**<a name="line.130"></a>
134 <FONT color="green">131</FONT> * Copy constructor, creates a new {@code SemiVariance} identical<a name="line.131"></a>
135 <FONT color="green">132</FONT> * to the {@code original}<a name="line.132"></a>
136 <FONT color="green">133</FONT> *<a name="line.133"></a>
137 <FONT color="green">134</FONT> * @param original the {@code SemiVariance} instance to copy<a name="line.134"></a>
138 <FONT color="green">135</FONT> */<a name="line.135"></a>
139 <FONT color="green">136</FONT> public SemiVariance(final SemiVariance original) {<a name="line.136"></a>
140 <FONT color="green">137</FONT> copy(original, this);<a name="line.137"></a>
141 <FONT color="green">138</FONT> }<a name="line.138"></a>
142 <FONT color="green">139</FONT> <a name="line.139"></a>
143 <FONT color="green">140</FONT> <a name="line.140"></a>
144 <FONT color="green">141</FONT> /**<a name="line.141"></a>
145 <FONT color="green">142</FONT> * {@inheritDoc}<a name="line.142"></a>
146 <FONT color="green">143</FONT> */<a name="line.143"></a>
147 <FONT color="green">144</FONT> @Override<a name="line.144"></a>
148 <FONT color="green">145</FONT> public SemiVariance copy() {<a name="line.145"></a>
149 <FONT color="green">146</FONT> SemiVariance result = new SemiVariance();<a name="line.146"></a>
150 <FONT color="green">147</FONT> copy(this, result);<a name="line.147"></a>
151 <FONT color="green">148</FONT> return result;<a name="line.148"></a>
152 <FONT color="green">149</FONT> }<a name="line.149"></a>
153 <FONT color="green">150</FONT> <a name="line.150"></a>
154 <FONT color="green">151</FONT> <a name="line.151"></a>
155 <FONT color="green">152</FONT> /**<a name="line.152"></a>
156 <FONT color="green">153</FONT> * Copies source to dest.<a name="line.153"></a>
157 <FONT color="green">154</FONT> * &lt;p&gt;Neither source nor dest can be null.&lt;/p&gt;<a name="line.154"></a>
158 <FONT color="green">155</FONT> *<a name="line.155"></a>
159 <FONT color="green">156</FONT> * @param source SemiVariance to copy<a name="line.156"></a>
160 <FONT color="green">157</FONT> * @param dest SemiVariance to copy to<a name="line.157"></a>
161 <FONT color="green">158</FONT> * @throws NullPointerException if either source or dest is null<a name="line.158"></a>
162 <FONT color="green">159</FONT> */<a name="line.159"></a>
163 <FONT color="green">160</FONT> public static void copy(final SemiVariance source, SemiVariance dest) {<a name="line.160"></a>
164 <FONT color="green">161</FONT> dest.biasCorrected = source.biasCorrected;<a name="line.161"></a>
165 <FONT color="green">162</FONT> dest.varianceDirection = source.varianceDirection;<a name="line.162"></a>
166 <FONT color="green">163</FONT> }<a name="line.163"></a>
167 <FONT color="green">164</FONT> <a name="line.164"></a>
168 <FONT color="green">165</FONT> <a name="line.165"></a>
169 <FONT color="green">166</FONT> /**<a name="line.166"></a>
170 <FONT color="green">167</FONT> * This method calculates {@link SemiVariance} for the entire array against the mean, using<a name="line.167"></a>
171 <FONT color="green">168</FONT> * instance properties varianceDirection and biasCorrection.<a name="line.168"></a>
172 <FONT color="green">169</FONT> *<a name="line.169"></a>
173 <FONT color="green">170</FONT> * @param values the input array<a name="line.170"></a>
174 <FONT color="green">171</FONT> * @return the SemiVariance<a name="line.171"></a>
175 <FONT color="green">172</FONT> * @throws IllegalArgumentException if values is null<a name="line.172"></a>
176 <FONT color="green">173</FONT> *<a name="line.173"></a>
177 <FONT color="green">174</FONT> */<a name="line.174"></a>
178 <FONT color="green">175</FONT> @Override<a name="line.175"></a>
179 <FONT color="green">176</FONT> public double evaluate(final double[] values) {<a name="line.176"></a>
180 <FONT color="green">177</FONT> if (values == null) {<a name="line.177"></a>
181 <FONT color="green">178</FONT> throw MathRuntimeException.createIllegalArgumentException("input values array is null");<a name="line.178"></a>
182 <FONT color="green">179</FONT> }<a name="line.179"></a>
183 <FONT color="green">180</FONT> return evaluate(values, 0, values.length);<a name="line.180"></a>
184 <FONT color="green">181</FONT> }<a name="line.181"></a>
185 <FONT color="green">182</FONT> <a name="line.182"></a>
186 <FONT color="green">183</FONT> <a name="line.183"></a>
187 <FONT color="green">184</FONT> /**<a name="line.184"></a>
188 <FONT color="green">185</FONT> * &lt;p&gt;Returns the {@link SemiVariance} of the designated values against the mean, using<a name="line.185"></a>
189 <FONT color="green">186</FONT> * instance properties varianceDirection and biasCorrection.&lt;/p&gt;<a name="line.186"></a>
190 <FONT color="green">187</FONT> *<a name="line.187"></a>
191 <FONT color="green">188</FONT> * &lt;p&gt;Returns &lt;code&gt;NaN&lt;/code&gt; if the array is empty and throws<a name="line.188"></a>
192 <FONT color="green">189</FONT> * &lt;code&gt;IllegalArgumentException&lt;/code&gt; if the array is null.&lt;/p&gt;<a name="line.189"></a>
193 <FONT color="green">190</FONT> *<a name="line.190"></a>
194 <FONT color="green">191</FONT> * @param values the input array<a name="line.191"></a>
195 <FONT color="green">192</FONT> * @param start index of the first array element to include<a name="line.192"></a>
196 <FONT color="green">193</FONT> * @param length the number of elements to include<a name="line.193"></a>
197 <FONT color="green">194</FONT> * @return the SemiVariance<a name="line.194"></a>
198 <FONT color="green">195</FONT> * @throws IllegalArgumentException if the parameters are not valid<a name="line.195"></a>
199 <FONT color="green">196</FONT> *<a name="line.196"></a>
200 <FONT color="green">197</FONT> */<a name="line.197"></a>
201 <FONT color="green">198</FONT> @Override<a name="line.198"></a>
202 <FONT color="green">199</FONT> public double evaluate(final double[] values, final int start, final int length) {<a name="line.199"></a>
203 <FONT color="green">200</FONT> double m = (new Mean()).evaluate(values, start, length);<a name="line.200"></a>
204 <FONT color="green">201</FONT> return evaluate(values, m, varianceDirection, biasCorrected, 0, values.length);<a name="line.201"></a>
205 <FONT color="green">202</FONT> }<a name="line.202"></a>
206 <FONT color="green">203</FONT> <a name="line.203"></a>
207 <FONT color="green">204</FONT> <a name="line.204"></a>
208 <FONT color="green">205</FONT> /**<a name="line.205"></a>
209 <FONT color="green">206</FONT> * This method calculates {@link SemiVariance} for the entire array against the mean, using<a name="line.206"></a>
210 <FONT color="green">207</FONT> * the current value of the biasCorrection instance property.<a name="line.207"></a>
211 <FONT color="green">208</FONT> *<a name="line.208"></a>
212 <FONT color="green">209</FONT> * @param values the input array<a name="line.209"></a>
213 <FONT color="green">210</FONT> * @param direction the {@link Direction} of the semivariance<a name="line.210"></a>
214 <FONT color="green">211</FONT> * @return the SemiVariance<a name="line.211"></a>
215 <FONT color="green">212</FONT> * @throws IllegalArgumentException if values is null<a name="line.212"></a>
216 <FONT color="green">213</FONT> *<a name="line.213"></a>
217 <FONT color="green">214</FONT> */<a name="line.214"></a>
218 <FONT color="green">215</FONT> public double evaluate(final double[] values, Direction direction) {<a name="line.215"></a>
219 <FONT color="green">216</FONT> double m = (new Mean()).evaluate(values);<a name="line.216"></a>
220 <FONT color="green">217</FONT> return evaluate (values, m, direction, biasCorrected, 0, values.length);<a name="line.217"></a>
221 <FONT color="green">218</FONT> }<a name="line.218"></a>
222 <FONT color="green">219</FONT> <a name="line.219"></a>
223 <FONT color="green">220</FONT> /**<a name="line.220"></a>
224 <FONT color="green">221</FONT> * &lt;p&gt;Returns the {@link SemiVariance} of the designated values against the cutoff, using<a name="line.221"></a>
225 <FONT color="green">222</FONT> * instance properties variancDirection and biasCorrection.&lt;/p&gt;<a name="line.222"></a>
226 <FONT color="green">223</FONT> *<a name="line.223"></a>
227 <FONT color="green">224</FONT> * &lt;p&gt;Returns &lt;code&gt;NaN&lt;/code&gt; if the array is empty and throws<a name="line.224"></a>
228 <FONT color="green">225</FONT> * &lt;code&gt;IllegalArgumentException&lt;/code&gt; if the array is null.&lt;/p&gt;<a name="line.225"></a>
229 <FONT color="green">226</FONT> *<a name="line.226"></a>
230 <FONT color="green">227</FONT> * @param values the input array<a name="line.227"></a>
231 <FONT color="green">228</FONT> * @param cutoff the reference point<a name="line.228"></a>
232 <FONT color="green">229</FONT> * @return the SemiVariance<a name="line.229"></a>
233 <FONT color="green">230</FONT> * @throws IllegalArgumentException if values is null<a name="line.230"></a>
234 <FONT color="green">231</FONT> */<a name="line.231"></a>
235 <FONT color="green">232</FONT> public double evaluate(final double[] values, final double cutoff) {<a name="line.232"></a>
236 <FONT color="green">233</FONT> return evaluate(values, cutoff, varianceDirection, biasCorrected, 0, values.length);<a name="line.233"></a>
237 <FONT color="green">234</FONT> }<a name="line.234"></a>
238 <FONT color="green">235</FONT> <a name="line.235"></a>
239 <FONT color="green">236</FONT> /**<a name="line.236"></a>
240 <FONT color="green">237</FONT> * &lt;p&gt;Returns the {@link SemiVariance} of the designated values against the cutoff in the<a name="line.237"></a>
241 <FONT color="green">238</FONT> * given direction, using the current value of the biasCorrection instance property.&lt;/p&gt;<a name="line.238"></a>
242 <FONT color="green">239</FONT> *<a name="line.239"></a>
243 <FONT color="green">240</FONT> * &lt;p&gt;Returns &lt;code&gt;NaN&lt;/code&gt; if the array is empty and throws<a name="line.240"></a>
244 <FONT color="green">241</FONT> * &lt;code&gt;IllegalArgumentException&lt;/code&gt; if the array is null.&lt;/p&gt;<a name="line.241"></a>
245 <FONT color="green">242</FONT> *<a name="line.242"></a>
246 <FONT color="green">243</FONT> * @param values the input array<a name="line.243"></a>
247 <FONT color="green">244</FONT> * @param cutoff the reference point<a name="line.244"></a>
248 <FONT color="green">245</FONT> * @param direction the {@link Direction} of the semivariance<a name="line.245"></a>
249 <FONT color="green">246</FONT> * @return the SemiVariance<a name="line.246"></a>
250 <FONT color="green">247</FONT> * @throws IllegalArgumentException if values is null<a name="line.247"></a>
251 <FONT color="green">248</FONT> */<a name="line.248"></a>
252 <FONT color="green">249</FONT> public double evaluate(final double[] values, final double cutoff, final Direction direction) {<a name="line.249"></a>
253 <FONT color="green">250</FONT> return evaluate(values, cutoff, direction, biasCorrected, 0, values.length);<a name="line.250"></a>
254 <FONT color="green">251</FONT> }<a name="line.251"></a>
255 <FONT color="green">252</FONT> <a name="line.252"></a>
256 <FONT color="green">253</FONT> <a name="line.253"></a>
257 <FONT color="green">254</FONT> /**<a name="line.254"></a>
258 <FONT color="green">255</FONT> * &lt;p&gt;Returns the {@link SemiVariance} of the designated values against the cutoff<a name="line.255"></a>
259 <FONT color="green">256</FONT> * in the given direction with the provided bias correction.&lt;/p&gt;<a name="line.256"></a>
260 <FONT color="green">257</FONT> *<a name="line.257"></a>
261 <FONT color="green">258</FONT> * &lt;p&gt;Returns &lt;code&gt;NaN&lt;/code&gt; if the array is empty and throws<a name="line.258"></a>
262 <FONT color="green">259</FONT> * &lt;code&gt;IllegalArgumentException&lt;/code&gt; if the array is null.&lt;/p&gt;<a name="line.259"></a>
263 <FONT color="green">260</FONT> *<a name="line.260"></a>
264 <FONT color="green">261</FONT> * @param values the input array<a name="line.261"></a>
265 <FONT color="green">262</FONT> * @param cutoff the reference point<a name="line.262"></a>
266 <FONT color="green">263</FONT> * @param direction the {@link Direction} of the semivariance<a name="line.263"></a>
267 <FONT color="green">264</FONT> * @param corrected the BiasCorrection flag<a name="line.264"></a>
268 <FONT color="green">265</FONT> * @param start index of the first array element to include<a name="line.265"></a>
269 <FONT color="green">266</FONT> * @param length the number of elements to include<a name="line.266"></a>
270 <FONT color="green">267</FONT> * @return the SemiVariance<a name="line.267"></a>
271 <FONT color="green">268</FONT> * @throws IllegalArgumentException if the parameters are not valid<a name="line.268"></a>
272 <FONT color="green">269</FONT> *<a name="line.269"></a>
273 <FONT color="green">270</FONT> */<a name="line.270"></a>
274 <FONT color="green">271</FONT> public double evaluate (final double[] values, final double cutoff, final Direction direction,<a name="line.271"></a>
275 <FONT color="green">272</FONT> final boolean corrected, final int start, final int length) {<a name="line.272"></a>
276 <FONT color="green">273</FONT> <a name="line.273"></a>
277 <FONT color="green">274</FONT> test(values, start, length);<a name="line.274"></a>
278 <FONT color="green">275</FONT> if (values.length == 0) {<a name="line.275"></a>
279 <FONT color="green">276</FONT> return Double.NaN;<a name="line.276"></a>
280 <FONT color="green">277</FONT> } else {<a name="line.277"></a>
281 <FONT color="green">278</FONT> if (values.length == 1) {<a name="line.278"></a>
282 <FONT color="green">279</FONT> return 0.0;<a name="line.279"></a>
283 <FONT color="green">280</FONT> } else {<a name="line.280"></a>
284 <FONT color="green">281</FONT> final boolean booleanDirection = direction.getDirection();<a name="line.281"></a>
285 <FONT color="green">282</FONT> <a name="line.282"></a>
286 <FONT color="green">283</FONT> double dev = 0.0;<a name="line.283"></a>
287 <FONT color="green">284</FONT> double sumsq = 0.0;<a name="line.284"></a>
288 <FONT color="green">285</FONT> for (int i = start; i &lt; length; i++) {<a name="line.285"></a>
289 <FONT color="green">286</FONT> if ((values[i] &gt; cutoff) == booleanDirection) {<a name="line.286"></a>
290 <FONT color="green">287</FONT> dev = values[i] - cutoff;<a name="line.287"></a>
291 <FONT color="green">288</FONT> sumsq += dev * dev;<a name="line.288"></a>
292 <FONT color="green">289</FONT> }<a name="line.289"></a>
293 <FONT color="green">290</FONT> }<a name="line.290"></a>
294 <FONT color="green">291</FONT> <a name="line.291"></a>
295 <FONT color="green">292</FONT> if (corrected) {<a name="line.292"></a>
296 <FONT color="green">293</FONT> return sumsq / (length - 1.0);<a name="line.293"></a>
297 <FONT color="green">294</FONT> } else {<a name="line.294"></a>
298 <FONT color="green">295</FONT> return sumsq / length;<a name="line.295"></a>
299 <FONT color="green">296</FONT> }<a name="line.296"></a>
300 <FONT color="green">297</FONT> }<a name="line.297"></a>
301 <FONT color="green">298</FONT> }<a name="line.298"></a>
302 <FONT color="green">299</FONT> }<a name="line.299"></a>
303 <FONT color="green">300</FONT> <a name="line.300"></a>
304 <FONT color="green">301</FONT> /**<a name="line.301"></a>
305 <FONT color="green">302</FONT> * Returns true iff biasCorrected property is set to true.<a name="line.302"></a>
306 <FONT color="green">303</FONT> *<a name="line.303"></a>
307 <FONT color="green">304</FONT> * @return the value of biasCorrected.<a name="line.304"></a>
308 <FONT color="green">305</FONT> */<a name="line.305"></a>
309 <FONT color="green">306</FONT> public boolean isBiasCorrected() {<a name="line.306"></a>
310 <FONT color="green">307</FONT> return biasCorrected;<a name="line.307"></a>
311 <FONT color="green">308</FONT> }<a name="line.308"></a>
312 <FONT color="green">309</FONT> <a name="line.309"></a>
313 <FONT color="green">310</FONT> /**<a name="line.310"></a>
314 <FONT color="green">311</FONT> * Sets the biasCorrected property.<a name="line.311"></a>
315 <FONT color="green">312</FONT> *<a name="line.312"></a>
316 <FONT color="green">313</FONT> * @param biasCorrected new biasCorrected property value<a name="line.313"></a>
317 <FONT color="green">314</FONT> */<a name="line.314"></a>
318 <FONT color="green">315</FONT> public void setBiasCorrected(boolean biasCorrected) {<a name="line.315"></a>
319 <FONT color="green">316</FONT> this.biasCorrected = biasCorrected;<a name="line.316"></a>
320 <FONT color="green">317</FONT> }<a name="line.317"></a>
321 <FONT color="green">318</FONT> <a name="line.318"></a>
322 <FONT color="green">319</FONT> /**<a name="line.319"></a>
323 <FONT color="green">320</FONT> * Returns the varianceDirection property.<a name="line.320"></a>
324 <FONT color="green">321</FONT> *<a name="line.321"></a>
325 <FONT color="green">322</FONT> * @return the varianceDirection<a name="line.322"></a>
326 <FONT color="green">323</FONT> */<a name="line.323"></a>
327 <FONT color="green">324</FONT> public Direction getVarianceDirection () {<a name="line.324"></a>
328 <FONT color="green">325</FONT> return varianceDirection;<a name="line.325"></a>
329 <FONT color="green">326</FONT> }<a name="line.326"></a>
330 <FONT color="green">327</FONT> <a name="line.327"></a>
331 <FONT color="green">328</FONT> /**<a name="line.328"></a>
332 <FONT color="green">329</FONT> * Sets the variance direction<a name="line.329"></a>
333 <FONT color="green">330</FONT> *<a name="line.330"></a>
334 <FONT color="green">331</FONT> * @param varianceDirection the direction of the semivariance<a name="line.331"></a>
335 <FONT color="green">332</FONT> */<a name="line.332"></a>
336 <FONT color="green">333</FONT> public void setVarianceDirection(Direction varianceDirection) {<a name="line.333"></a>
337 <FONT color="green">334</FONT> this.varianceDirection = varianceDirection;<a name="line.334"></a>
338 <FONT color="green">335</FONT> }<a name="line.335"></a>
339 <FONT color="green">336</FONT> <a name="line.336"></a>
340 <FONT color="green">337</FONT> /**<a name="line.337"></a>
341 <FONT color="green">338</FONT> * The direction of the semivariance - either upside or downside. The direction<a name="line.338"></a>
342 <FONT color="green">339</FONT> * is represented by boolean, with true corresponding to UPSIDE semivariance.<a name="line.339"></a>
343 <FONT color="green">340</FONT> */<a name="line.340"></a>
344 <FONT color="green">341</FONT> public enum Direction {<a name="line.341"></a>
345 <FONT color="green">342</FONT> /**<a name="line.342"></a>
346 <FONT color="green">343</FONT> * The UPSIDE Direction is used to specify that the observations above the<a name="line.343"></a>
347 <FONT color="green">344</FONT> * cutoff point will be used to calculate SemiVariance<a name="line.344"></a>
348 <FONT color="green">345</FONT> */<a name="line.345"></a>
349 <FONT color="green">346</FONT> UPSIDE (true),<a name="line.346"></a>
350 <FONT color="green">347</FONT> <a name="line.347"></a>
351 <FONT color="green">348</FONT> /**<a name="line.348"></a>
352 <FONT color="green">349</FONT> * The DOWNSIDE Direction is used to specify that the observations below<a name="line.349"></a>
353 <FONT color="green">350</FONT> * the cutoff point will be used to calculate SemiVariance<a name="line.350"></a>
354 <FONT color="green">351</FONT> */<a name="line.351"></a>
355 <FONT color="green">352</FONT> DOWNSIDE (false);<a name="line.352"></a>
356 <FONT color="green">353</FONT> <a name="line.353"></a>
357 <FONT color="green">354</FONT> /**<a name="line.354"></a>
358 <FONT color="green">355</FONT> * boolean value UPSIDE &lt;-&gt; true<a name="line.355"></a>
359 <FONT color="green">356</FONT> */<a name="line.356"></a>
360 <FONT color="green">357</FONT> private boolean direction;<a name="line.357"></a>
361 <FONT color="green">358</FONT> <a name="line.358"></a>
362 <FONT color="green">359</FONT> /**<a name="line.359"></a>
363 <FONT color="green">360</FONT> * Create a Direction with the given value.<a name="line.360"></a>
364 <FONT color="green">361</FONT> *<a name="line.361"></a>
365 <FONT color="green">362</FONT> * @param b boolean value representing the Direction. True corresponds to UPSIDE.<a name="line.362"></a>
366 <FONT color="green">363</FONT> */<a name="line.363"></a>
367 <FONT color="green">364</FONT> Direction (boolean b) {<a name="line.364"></a>
368 <FONT color="green">365</FONT> direction = b;<a name="line.365"></a>
369 <FONT color="green">366</FONT> }<a name="line.366"></a>
370 <FONT color="green">367</FONT> <a name="line.367"></a>
371 <FONT color="green">368</FONT> /**<a name="line.368"></a>
372 <FONT color="green">369</FONT> * Returns the value of this Direction. True corresponds to UPSIDE.<a name="line.369"></a>
373 <FONT color="green">370</FONT> *<a name="line.370"></a>
374 <FONT color="green">371</FONT> * @return true if direction is UPSIDE; false otherwise<a name="line.371"></a>
375 <FONT color="green">372</FONT> */<a name="line.372"></a>
376 <FONT color="green">373</FONT> boolean getDirection () {<a name="line.373"></a>
377 <FONT color="green">374</FONT> return direction;<a name="line.374"></a>
378 <FONT color="green">375</FONT> }<a name="line.375"></a>
379 <FONT color="green">376</FONT> }<a name="line.376"></a>
380 <FONT color="green">377</FONT> }<a name="line.377"></a>
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441 </PRE>
442 </BODY>
443 </HTML>