comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/stat/descriptive/rank/Percentile.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> package org.apache.commons.math.stat.descriptive.rank;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.io.Serializable;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.util.Arrays;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.stat.descriptive.AbstractUnivariateStatistic;<a name="line.23"></a>
27 <FONT color="green">024</FONT> <a name="line.24"></a>
28 <FONT color="green">025</FONT> /**<a name="line.25"></a>
29 <FONT color="green">026</FONT> * Provides percentile computation.<a name="line.26"></a>
30 <FONT color="green">027</FONT> * &lt;p&gt;<a name="line.27"></a>
31 <FONT color="green">028</FONT> * There are several commonly used methods for estimating percentiles (a.k.a.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * quantiles) based on sample data. For large samples, the different methods<a name="line.29"></a>
33 <FONT color="green">030</FONT> * agree closely, but when sample sizes are small, different methods will give<a name="line.30"></a>
34 <FONT color="green">031</FONT> * significantly different results. The algorithm implemented here works as follows:<a name="line.31"></a>
35 <FONT color="green">032</FONT> * &lt;ol&gt;<a name="line.32"></a>
36 <FONT color="green">033</FONT> * &lt;li&gt;Let &lt;code&gt;n&lt;/code&gt; be the length of the (sorted) array and<a name="line.33"></a>
37 <FONT color="green">034</FONT> * &lt;code&gt;0 &lt; p &lt;= 100&lt;/code&gt; be the desired percentile.&lt;/li&gt;<a name="line.34"></a>
38 <FONT color="green">035</FONT> * &lt;li&gt;If &lt;code&gt; n = 1 &lt;/code&gt; return the unique array element (regardless of<a name="line.35"></a>
39 <FONT color="green">036</FONT> * the value of &lt;code&gt;p&lt;/code&gt;); otherwise &lt;/li&gt;<a name="line.36"></a>
40 <FONT color="green">037</FONT> * &lt;li&gt;Compute the estimated percentile position<a name="line.37"></a>
41 <FONT color="green">038</FONT> * &lt;code&gt; pos = p * (n + 1) / 100&lt;/code&gt; and the difference, &lt;code&gt;d&lt;/code&gt;<a name="line.38"></a>
42 <FONT color="green">039</FONT> * between &lt;code&gt;pos&lt;/code&gt; and &lt;code&gt;floor(pos)&lt;/code&gt; (i.e. the fractional<a name="line.39"></a>
43 <FONT color="green">040</FONT> * part of &lt;code&gt;pos&lt;/code&gt;). If &lt;code&gt;pos &gt;= n&lt;/code&gt; return the largest<a name="line.40"></a>
44 <FONT color="green">041</FONT> * element in the array; otherwise&lt;/li&gt;<a name="line.41"></a>
45 <FONT color="green">042</FONT> * &lt;li&gt;Let &lt;code&gt;lower&lt;/code&gt; be the element in position<a name="line.42"></a>
46 <FONT color="green">043</FONT> * &lt;code&gt;floor(pos)&lt;/code&gt; in the array and let &lt;code&gt;upper&lt;/code&gt; be the<a name="line.43"></a>
47 <FONT color="green">044</FONT> * next element in the array. Return &lt;code&gt;lower + d * (upper - lower)&lt;/code&gt;<a name="line.44"></a>
48 <FONT color="green">045</FONT> * &lt;/li&gt;<a name="line.45"></a>
49 <FONT color="green">046</FONT> * &lt;/ol&gt;&lt;/p&gt;<a name="line.46"></a>
50 <FONT color="green">047</FONT> * &lt;p&gt;<a name="line.47"></a>
51 <FONT color="green">048</FONT> * To compute percentiles, the data must be (totally) ordered. Input arrays<a name="line.48"></a>
52 <FONT color="green">049</FONT> * are copied and then sorted using {@link java.util.Arrays#sort(double[])}.<a name="line.49"></a>
53 <FONT color="green">050</FONT> * The ordering used by &lt;code&gt;Arrays.sort(double[])&lt;/code&gt; is the one determined<a name="line.50"></a>
54 <FONT color="green">051</FONT> * by {@link java.lang.Double#compareTo(Double)}. This ordering makes<a name="line.51"></a>
55 <FONT color="green">052</FONT> * &lt;code&gt;Double.NaN&lt;/code&gt; larger than any other value (including<a name="line.52"></a>
56 <FONT color="green">053</FONT> * &lt;code&gt;Double.POSITIVE_INFINITY&lt;/code&gt;). Therefore, for example, the median<a name="line.53"></a>
57 <FONT color="green">054</FONT> * (50th percentile) of<a name="line.54"></a>
58 <FONT color="green">055</FONT> * &lt;code&gt;{0, 1, 2, 3, 4, Double.NaN}&lt;/code&gt; evaluates to &lt;code&gt;2.5.&lt;/code&gt;&lt;/p&gt;<a name="line.55"></a>
59 <FONT color="green">056</FONT> * &lt;p&gt;<a name="line.56"></a>
60 <FONT color="green">057</FONT> * Since percentile estimation usually involves interpolation between array<a name="line.57"></a>
61 <FONT color="green">058</FONT> * elements, arrays containing &lt;code&gt;NaN&lt;/code&gt; or infinite values will often<a name="line.58"></a>
62 <FONT color="green">059</FONT> * result in &lt;code&gt;NaN&lt;code&gt; or infinite values returned.&lt;/p&gt;<a name="line.59"></a>
63 <FONT color="green">060</FONT> * &lt;p&gt;<a name="line.60"></a>
64 <FONT color="green">061</FONT> * &lt;strong&gt;Note that this implementation is not synchronized.&lt;/strong&gt; If<a name="line.61"></a>
65 <FONT color="green">062</FONT> * multiple threads access an instance of this class concurrently, and at least<a name="line.62"></a>
66 <FONT color="green">063</FONT> * one of the threads invokes the &lt;code&gt;increment()&lt;/code&gt; or<a name="line.63"></a>
67 <FONT color="green">064</FONT> * &lt;code&gt;clear()&lt;/code&gt; method, it must be synchronized externally.&lt;/p&gt;<a name="line.64"></a>
68 <FONT color="green">065</FONT> *<a name="line.65"></a>
69 <FONT color="green">066</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.66"></a>
70 <FONT color="green">067</FONT> */<a name="line.67"></a>
71 <FONT color="green">068</FONT> public class Percentile extends AbstractUnivariateStatistic implements Serializable {<a name="line.68"></a>
72 <FONT color="green">069</FONT> <a name="line.69"></a>
73 <FONT color="green">070</FONT> /** Serializable version identifier */<a name="line.70"></a>
74 <FONT color="green">071</FONT> private static final long serialVersionUID = -8091216485095130416L;<a name="line.71"></a>
75 <FONT color="green">072</FONT> <a name="line.72"></a>
76 <FONT color="green">073</FONT> /** Determines what percentile is computed when evaluate() is activated<a name="line.73"></a>
77 <FONT color="green">074</FONT> * with no quantile argument */<a name="line.74"></a>
78 <FONT color="green">075</FONT> private double quantile = 0.0;<a name="line.75"></a>
79 <FONT color="green">076</FONT> <a name="line.76"></a>
80 <FONT color="green">077</FONT> /**<a name="line.77"></a>
81 <FONT color="green">078</FONT> * Constructs a Percentile with a default quantile<a name="line.78"></a>
82 <FONT color="green">079</FONT> * value of 50.0.<a name="line.79"></a>
83 <FONT color="green">080</FONT> */<a name="line.80"></a>
84 <FONT color="green">081</FONT> public Percentile() {<a name="line.81"></a>
85 <FONT color="green">082</FONT> this(50.0);<a name="line.82"></a>
86 <FONT color="green">083</FONT> }<a name="line.83"></a>
87 <FONT color="green">084</FONT> <a name="line.84"></a>
88 <FONT color="green">085</FONT> /**<a name="line.85"></a>
89 <FONT color="green">086</FONT> * Constructs a Percentile with the specific quantile value.<a name="line.86"></a>
90 <FONT color="green">087</FONT> * @param p the quantile<a name="line.87"></a>
91 <FONT color="green">088</FONT> * @throws IllegalArgumentException if p is not greater than 0 and less<a name="line.88"></a>
92 <FONT color="green">089</FONT> * than or equal to 100<a name="line.89"></a>
93 <FONT color="green">090</FONT> */<a name="line.90"></a>
94 <FONT color="green">091</FONT> public Percentile(final double p) {<a name="line.91"></a>
95 <FONT color="green">092</FONT> setQuantile(p);<a name="line.92"></a>
96 <FONT color="green">093</FONT> }<a name="line.93"></a>
97 <FONT color="green">094</FONT> <a name="line.94"></a>
98 <FONT color="green">095</FONT> /**<a name="line.95"></a>
99 <FONT color="green">096</FONT> * Copy constructor, creates a new {@code Percentile} identical<a name="line.96"></a>
100 <FONT color="green">097</FONT> * to the {@code original}<a name="line.97"></a>
101 <FONT color="green">098</FONT> *<a name="line.98"></a>
102 <FONT color="green">099</FONT> * @param original the {@code Percentile} instance to copy<a name="line.99"></a>
103 <FONT color="green">100</FONT> */<a name="line.100"></a>
104 <FONT color="green">101</FONT> public Percentile(Percentile original) {<a name="line.101"></a>
105 <FONT color="green">102</FONT> copy(original, this);<a name="line.102"></a>
106 <FONT color="green">103</FONT> }<a name="line.103"></a>
107 <FONT color="green">104</FONT> <a name="line.104"></a>
108 <FONT color="green">105</FONT> /**<a name="line.105"></a>
109 <FONT color="green">106</FONT> * Returns an estimate of the &lt;code&gt;p&lt;/code&gt;th percentile of the values<a name="line.106"></a>
110 <FONT color="green">107</FONT> * in the &lt;code&gt;values&lt;/code&gt; array.<a name="line.107"></a>
111 <FONT color="green">108</FONT> * &lt;p&gt;<a name="line.108"></a>
112 <FONT color="green">109</FONT> * Calls to this method do not modify the internal &lt;code&gt;quantile&lt;/code&gt;<a name="line.109"></a>
113 <FONT color="green">110</FONT> * state of this statistic.&lt;/p&gt;<a name="line.110"></a>
114 <FONT color="green">111</FONT> * &lt;p&gt;<a name="line.111"></a>
115 <FONT color="green">112</FONT> * &lt;ul&gt;<a name="line.112"></a>
116 <FONT color="green">113</FONT> * &lt;li&gt;Returns &lt;code&gt;Double.NaN&lt;/code&gt; if &lt;code&gt;values&lt;/code&gt; has length<a name="line.113"></a>
117 <FONT color="green">114</FONT> * &lt;code&gt;0&lt;/code&gt;&lt;/li&gt;<a name="line.114"></a>
118 <FONT color="green">115</FONT> * &lt;li&gt;Returns (for any value of &lt;code&gt;p&lt;/code&gt;) &lt;code&gt;values[0]&lt;/code&gt;<a name="line.115"></a>
119 <FONT color="green">116</FONT> * if &lt;code&gt;values&lt;/code&gt; has length &lt;code&gt;1&lt;/code&gt;&lt;/li&gt;<a name="line.116"></a>
120 <FONT color="green">117</FONT> * &lt;li&gt;Throws &lt;code&gt;IllegalArgumentException&lt;/code&gt; if &lt;code&gt;values&lt;/code&gt;<a name="line.117"></a>
121 <FONT color="green">118</FONT> * is null or p is not a valid quantile value (p must be greater than 0<a name="line.118"></a>
122 <FONT color="green">119</FONT> * and less than or equal to 100) &lt;/li&gt;<a name="line.119"></a>
123 <FONT color="green">120</FONT> * &lt;/ul&gt;&lt;/p&gt;<a name="line.120"></a>
124 <FONT color="green">121</FONT> * &lt;p&gt;<a name="line.121"></a>
125 <FONT color="green">122</FONT> * See {@link Percentile} for a description of the percentile estimation<a name="line.122"></a>
126 <FONT color="green">123</FONT> * algorithm used.&lt;/p&gt;<a name="line.123"></a>
127 <FONT color="green">124</FONT> *<a name="line.124"></a>
128 <FONT color="green">125</FONT> * @param values input array of values<a name="line.125"></a>
129 <FONT color="green">126</FONT> * @param p the percentile value to compute<a name="line.126"></a>
130 <FONT color="green">127</FONT> * @return the percentile value or Double.NaN if the array is empty<a name="line.127"></a>
131 <FONT color="green">128</FONT> * @throws IllegalArgumentException if &lt;code&gt;values&lt;/code&gt; is null<a name="line.128"></a>
132 <FONT color="green">129</FONT> * or p is invalid<a name="line.129"></a>
133 <FONT color="green">130</FONT> */<a name="line.130"></a>
134 <FONT color="green">131</FONT> public double evaluate(final double[] values, final double p) {<a name="line.131"></a>
135 <FONT color="green">132</FONT> test(values, 0, 0);<a name="line.132"></a>
136 <FONT color="green">133</FONT> return evaluate(values, 0, values.length, p);<a name="line.133"></a>
137 <FONT color="green">134</FONT> }<a name="line.134"></a>
138 <FONT color="green">135</FONT> <a name="line.135"></a>
139 <FONT color="green">136</FONT> /**<a name="line.136"></a>
140 <FONT color="green">137</FONT> * Returns an estimate of the &lt;code&gt;quantile&lt;/code&gt;th percentile of the<a name="line.137"></a>
141 <FONT color="green">138</FONT> * designated values in the &lt;code&gt;values&lt;/code&gt; array. The quantile<a name="line.138"></a>
142 <FONT color="green">139</FONT> * estimated is determined by the &lt;code&gt;quantile&lt;/code&gt; property.<a name="line.139"></a>
143 <FONT color="green">140</FONT> * &lt;p&gt;<a name="line.140"></a>
144 <FONT color="green">141</FONT> * &lt;ul&gt;<a name="line.141"></a>
145 <FONT color="green">142</FONT> * &lt;li&gt;Returns &lt;code&gt;Double.NaN&lt;/code&gt; if &lt;code&gt;length = 0&lt;/code&gt;&lt;/li&gt;<a name="line.142"></a>
146 <FONT color="green">143</FONT> * &lt;li&gt;Returns (for any value of &lt;code&gt;quantile&lt;/code&gt;)<a name="line.143"></a>
147 <FONT color="green">144</FONT> * &lt;code&gt;values[begin]&lt;/code&gt; if &lt;code&gt;length = 1 &lt;/code&gt;&lt;/li&gt;<a name="line.144"></a>
148 <FONT color="green">145</FONT> * &lt;li&gt;Throws &lt;code&gt;IllegalArgumentException&lt;/code&gt; if &lt;code&gt;values&lt;/code&gt;<a name="line.145"></a>
149 <FONT color="green">146</FONT> * is null, or &lt;code&gt;start&lt;/code&gt; or &lt;code&gt;length&lt;/code&gt;<a name="line.146"></a>
150 <FONT color="green">147</FONT> * is invalid&lt;/li&gt;<a name="line.147"></a>
151 <FONT color="green">148</FONT> * &lt;/ul&gt;&lt;/p&gt;<a name="line.148"></a>
152 <FONT color="green">149</FONT> * &lt;p&gt;<a name="line.149"></a>
153 <FONT color="green">150</FONT> * See {@link Percentile} for a description of the percentile estimation<a name="line.150"></a>
154 <FONT color="green">151</FONT> * algorithm used.&lt;/p&gt;<a name="line.151"></a>
155 <FONT color="green">152</FONT> *<a name="line.152"></a>
156 <FONT color="green">153</FONT> * @param values the input array<a name="line.153"></a>
157 <FONT color="green">154</FONT> * @param start index of the first array element to include<a name="line.154"></a>
158 <FONT color="green">155</FONT> * @param length the number of elements to include<a name="line.155"></a>
159 <FONT color="green">156</FONT> * @return the percentile value<a name="line.156"></a>
160 <FONT color="green">157</FONT> * @throws IllegalArgumentException if the parameters are not valid<a name="line.157"></a>
161 <FONT color="green">158</FONT> *<a name="line.158"></a>
162 <FONT color="green">159</FONT> */<a name="line.159"></a>
163 <FONT color="green">160</FONT> @Override<a name="line.160"></a>
164 <FONT color="green">161</FONT> public double evaluate( final double[] values, final int start, final int length) {<a name="line.161"></a>
165 <FONT color="green">162</FONT> return evaluate(values, start, length, quantile);<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> * Returns an estimate of the &lt;code&gt;p&lt;/code&gt;th percentile of the values<a name="line.166"></a>
170 <FONT color="green">167</FONT> * in the &lt;code&gt;values&lt;/code&gt; array, starting with the element in (0-based)<a name="line.167"></a>
171 <FONT color="green">168</FONT> * position &lt;code&gt;begin&lt;/code&gt; in the array and including &lt;code&gt;length&lt;/code&gt;<a name="line.168"></a>
172 <FONT color="green">169</FONT> * values.<a name="line.169"></a>
173 <FONT color="green">170</FONT> * &lt;p&gt;<a name="line.170"></a>
174 <FONT color="green">171</FONT> * Calls to this method do not modify the internal &lt;code&gt;quantile&lt;/code&gt;<a name="line.171"></a>
175 <FONT color="green">172</FONT> * state of this statistic.&lt;/p&gt;<a name="line.172"></a>
176 <FONT color="green">173</FONT> * &lt;p&gt;<a name="line.173"></a>
177 <FONT color="green">174</FONT> * &lt;ul&gt;<a name="line.174"></a>
178 <FONT color="green">175</FONT> * &lt;li&gt;Returns &lt;code&gt;Double.NaN&lt;/code&gt; if &lt;code&gt;length = 0&lt;/code&gt;&lt;/li&gt;<a name="line.175"></a>
179 <FONT color="green">176</FONT> * &lt;li&gt;Returns (for any value of &lt;code&gt;p&lt;/code&gt;) &lt;code&gt;values[begin]&lt;/code&gt;<a name="line.176"></a>
180 <FONT color="green">177</FONT> * if &lt;code&gt;length = 1 &lt;/code&gt;&lt;/li&gt;<a name="line.177"></a>
181 <FONT color="green">178</FONT> * &lt;li&gt;Throws &lt;code&gt;IllegalArgumentException&lt;/code&gt; if &lt;code&gt;values&lt;/code&gt;<a name="line.178"></a>
182 <FONT color="green">179</FONT> * is null , &lt;code&gt;begin&lt;/code&gt; or &lt;code&gt;length&lt;/code&gt; is invalid, or<a name="line.179"></a>
183 <FONT color="green">180</FONT> * &lt;code&gt;p&lt;/code&gt; is not a valid quantile value (p must be greater than 0<a name="line.180"></a>
184 <FONT color="green">181</FONT> * and less than or equal to 100)&lt;/li&gt;<a name="line.181"></a>
185 <FONT color="green">182</FONT> * &lt;/ul&gt;&lt;/p&gt;<a name="line.182"></a>
186 <FONT color="green">183</FONT> * &lt;p&gt;<a name="line.183"></a>
187 <FONT color="green">184</FONT> * See {@link Percentile} for a description of the percentile estimation<a name="line.184"></a>
188 <FONT color="green">185</FONT> * algorithm used.&lt;/p&gt;<a name="line.185"></a>
189 <FONT color="green">186</FONT> *<a name="line.186"></a>
190 <FONT color="green">187</FONT> * @param values array of input values<a name="line.187"></a>
191 <FONT color="green">188</FONT> * @param p the percentile to compute<a name="line.188"></a>
192 <FONT color="green">189</FONT> * @param begin the first (0-based) element to include in the computation<a name="line.189"></a>
193 <FONT color="green">190</FONT> * @param length the number of array elements to include<a name="line.190"></a>
194 <FONT color="green">191</FONT> * @return the percentile value<a name="line.191"></a>
195 <FONT color="green">192</FONT> * @throws IllegalArgumentException if the parameters are not valid or the<a name="line.192"></a>
196 <FONT color="green">193</FONT> * input array is null<a name="line.193"></a>
197 <FONT color="green">194</FONT> */<a name="line.194"></a>
198 <FONT color="green">195</FONT> public double evaluate(final double[] values, final int begin,<a name="line.195"></a>
199 <FONT color="green">196</FONT> final int length, final double p) {<a name="line.196"></a>
200 <FONT color="green">197</FONT> <a name="line.197"></a>
201 <FONT color="green">198</FONT> test(values, begin, length);<a name="line.198"></a>
202 <FONT color="green">199</FONT> <a name="line.199"></a>
203 <FONT color="green">200</FONT> if ((p &gt; 100) || (p &lt;= 0)) {<a name="line.200"></a>
204 <FONT color="green">201</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.201"></a>
205 <FONT color="green">202</FONT> "out of bounds quantile value: {0}, must be in (0, 100]", p);<a name="line.202"></a>
206 <FONT color="green">203</FONT> }<a name="line.203"></a>
207 <FONT color="green">204</FONT> if (length == 0) {<a name="line.204"></a>
208 <FONT color="green">205</FONT> return Double.NaN;<a name="line.205"></a>
209 <FONT color="green">206</FONT> }<a name="line.206"></a>
210 <FONT color="green">207</FONT> if (length == 1) {<a name="line.207"></a>
211 <FONT color="green">208</FONT> return values[begin]; // always return single value for n = 1<a name="line.208"></a>
212 <FONT color="green">209</FONT> }<a name="line.209"></a>
213 <FONT color="green">210</FONT> double n = length;<a name="line.210"></a>
214 <FONT color="green">211</FONT> double pos = p * (n + 1) / 100;<a name="line.211"></a>
215 <FONT color="green">212</FONT> double fpos = Math.floor(pos);<a name="line.212"></a>
216 <FONT color="green">213</FONT> int intPos = (int) fpos;<a name="line.213"></a>
217 <FONT color="green">214</FONT> double dif = pos - fpos;<a name="line.214"></a>
218 <FONT color="green">215</FONT> double[] sorted = new double[length];<a name="line.215"></a>
219 <FONT color="green">216</FONT> System.arraycopy(values, begin, sorted, 0, length);<a name="line.216"></a>
220 <FONT color="green">217</FONT> Arrays.sort(sorted);<a name="line.217"></a>
221 <FONT color="green">218</FONT> <a name="line.218"></a>
222 <FONT color="green">219</FONT> if (pos &lt; 1) {<a name="line.219"></a>
223 <FONT color="green">220</FONT> return sorted[0];<a name="line.220"></a>
224 <FONT color="green">221</FONT> }<a name="line.221"></a>
225 <FONT color="green">222</FONT> if (pos &gt;= n) {<a name="line.222"></a>
226 <FONT color="green">223</FONT> return sorted[length - 1];<a name="line.223"></a>
227 <FONT color="green">224</FONT> }<a name="line.224"></a>
228 <FONT color="green">225</FONT> double lower = sorted[intPos - 1];<a name="line.225"></a>
229 <FONT color="green">226</FONT> double upper = sorted[intPos];<a name="line.226"></a>
230 <FONT color="green">227</FONT> return lower + dif * (upper - lower);<a name="line.227"></a>
231 <FONT color="green">228</FONT> }<a name="line.228"></a>
232 <FONT color="green">229</FONT> <a name="line.229"></a>
233 <FONT color="green">230</FONT> /**<a name="line.230"></a>
234 <FONT color="green">231</FONT> * Returns the value of the quantile field (determines what percentile is<a name="line.231"></a>
235 <FONT color="green">232</FONT> * computed when evaluate() is called with no quantile argument).<a name="line.232"></a>
236 <FONT color="green">233</FONT> *<a name="line.233"></a>
237 <FONT color="green">234</FONT> * @return quantile<a name="line.234"></a>
238 <FONT color="green">235</FONT> */<a name="line.235"></a>
239 <FONT color="green">236</FONT> public double getQuantile() {<a name="line.236"></a>
240 <FONT color="green">237</FONT> return quantile;<a name="line.237"></a>
241 <FONT color="green">238</FONT> }<a name="line.238"></a>
242 <FONT color="green">239</FONT> <a name="line.239"></a>
243 <FONT color="green">240</FONT> /**<a name="line.240"></a>
244 <FONT color="green">241</FONT> * Sets the value of the quantile field (determines what percentile is<a name="line.241"></a>
245 <FONT color="green">242</FONT> * computed when evaluate() is called with no quantile argument).<a name="line.242"></a>
246 <FONT color="green">243</FONT> *<a name="line.243"></a>
247 <FONT color="green">244</FONT> * @param p a value between 0 &lt; p &lt;= 100<a name="line.244"></a>
248 <FONT color="green">245</FONT> * @throws IllegalArgumentException if p is not greater than 0 and less<a name="line.245"></a>
249 <FONT color="green">246</FONT> * than or equal to 100<a name="line.246"></a>
250 <FONT color="green">247</FONT> */<a name="line.247"></a>
251 <FONT color="green">248</FONT> public void setQuantile(final double p) {<a name="line.248"></a>
252 <FONT color="green">249</FONT> if (p &lt;= 0 || p &gt; 100) {<a name="line.249"></a>
253 <FONT color="green">250</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.250"></a>
254 <FONT color="green">251</FONT> "out of bounds quantile value: {0}, must be in (0, 100]", p);<a name="line.251"></a>
255 <FONT color="green">252</FONT> }<a name="line.252"></a>
256 <FONT color="green">253</FONT> quantile = p;<a name="line.253"></a>
257 <FONT color="green">254</FONT> }<a name="line.254"></a>
258 <FONT color="green">255</FONT> <a name="line.255"></a>
259 <FONT color="green">256</FONT> /**<a name="line.256"></a>
260 <FONT color="green">257</FONT> * {@inheritDoc}<a name="line.257"></a>
261 <FONT color="green">258</FONT> */<a name="line.258"></a>
262 <FONT color="green">259</FONT> @Override<a name="line.259"></a>
263 <FONT color="green">260</FONT> public Percentile copy() {<a name="line.260"></a>
264 <FONT color="green">261</FONT> Percentile result = new Percentile();<a name="line.261"></a>
265 <FONT color="green">262</FONT> copy(this, result);<a name="line.262"></a>
266 <FONT color="green">263</FONT> return result;<a name="line.263"></a>
267 <FONT color="green">264</FONT> }<a name="line.264"></a>
268 <FONT color="green">265</FONT> <a name="line.265"></a>
269 <FONT color="green">266</FONT> /**<a name="line.266"></a>
270 <FONT color="green">267</FONT> * Copies source to dest.<a name="line.267"></a>
271 <FONT color="green">268</FONT> * &lt;p&gt;Neither source nor dest can be null.&lt;/p&gt;<a name="line.268"></a>
272 <FONT color="green">269</FONT> *<a name="line.269"></a>
273 <FONT color="green">270</FONT> * @param source Percentile to copy<a name="line.270"></a>
274 <FONT color="green">271</FONT> * @param dest Percentile to copy to<a name="line.271"></a>
275 <FONT color="green">272</FONT> * @throws NullPointerException if either source or dest is null<a name="line.272"></a>
276 <FONT color="green">273</FONT> */<a name="line.273"></a>
277 <FONT color="green">274</FONT> public static void copy(Percentile source, Percentile dest) {<a name="line.274"></a>
278 <FONT color="green">275</FONT> dest.quantile = source.quantile;<a name="line.275"></a>
279 <FONT color="green">276</FONT> }<a name="line.276"></a>
280 <FONT color="green">277</FONT> <a name="line.277"></a>
281 <FONT color="green">278</FONT> }<a name="line.278"></a>
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342 </PRE>
343 </BODY>
344 </HTML>