comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/stat/correlation/Covariance.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.correlation;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import org.apache.commons.math.linear.RealMatrix;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import org.apache.commons.math.linear.BlockRealMatrix;<a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.stat.descriptive.moment.Mean;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.stat.descriptive.moment.Variance;<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> * Computes covariances for pairs of arrays or columns of a matrix.<a name="line.26"></a>
30 <FONT color="green">027</FONT> *<a name="line.27"></a>
31 <FONT color="green">028</FONT> * &lt;p&gt;The constructors that take &lt;code&gt;RealMatrix&lt;/code&gt; or<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;code&gt;double[][]&lt;/code&gt; arguments generate covariance matrices. The<a name="line.29"></a>
33 <FONT color="green">030</FONT> * columns of the input matrices are assumed to represent variable values.&lt;/p&gt;<a name="line.30"></a>
34 <FONT color="green">031</FONT> *<a name="line.31"></a>
35 <FONT color="green">032</FONT> * &lt;p&gt;The constructor argument &lt;code&gt;biasCorrected&lt;/code&gt; determines whether or<a name="line.32"></a>
36 <FONT color="green">033</FONT> * not computed covariances are bias-corrected.&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;Unbiased covariances are given by the formula&lt;/p&gt;<a name="line.35"></a>
39 <FONT color="green">036</FONT> * &lt;code&gt;cov(X, Y) = &amp;Sigma;[(x&lt;sub&gt;i&lt;/sub&gt; - E(X))(y&lt;sub&gt;i&lt;/sub&gt; - E(Y))] / (n - 1)&lt;/code&gt;<a name="line.36"></a>
40 <FONT color="green">037</FONT> * where &lt;code&gt;E(X)&lt;/code&gt; is the mean of &lt;code&gt;X&lt;/code&gt; and &lt;code&gt;E(Y)&lt;/code&gt;<a name="line.37"></a>
41 <FONT color="green">038</FONT> * is the mean of the &lt;code&gt;Y&lt;/code&gt; values.<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;Non-bias-corrected estimates use &lt;code&gt;n&lt;/code&gt; in place of &lt;code&gt;n - 1&lt;/code&gt;<a name="line.40"></a>
44 <FONT color="green">041</FONT> *<a name="line.41"></a>
45 <FONT color="green">042</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.42"></a>
46 <FONT color="green">043</FONT> * @since 2.0<a name="line.43"></a>
47 <FONT color="green">044</FONT> */<a name="line.44"></a>
48 <FONT color="green">045</FONT> public class Covariance {<a name="line.45"></a>
49 <FONT color="green">046</FONT> <a name="line.46"></a>
50 <FONT color="green">047</FONT> /** covariance matrix */<a name="line.47"></a>
51 <FONT color="green">048</FONT> private final RealMatrix covarianceMatrix;<a name="line.48"></a>
52 <FONT color="green">049</FONT> <a name="line.49"></a>
53 <FONT color="green">050</FONT> /**<a name="line.50"></a>
54 <FONT color="green">051</FONT> * Create an empty covariance matrix.<a name="line.51"></a>
55 <FONT color="green">052</FONT> */<a name="line.52"></a>
56 <FONT color="green">053</FONT> /** Number of observations (length of covariate vectors) */<a name="line.53"></a>
57 <FONT color="green">054</FONT> private final int n;<a name="line.54"></a>
58 <FONT color="green">055</FONT> <a name="line.55"></a>
59 <FONT color="green">056</FONT> /**<a name="line.56"></a>
60 <FONT color="green">057</FONT> * Create a Covariance with no data<a name="line.57"></a>
61 <FONT color="green">058</FONT> */<a name="line.58"></a>
62 <FONT color="green">059</FONT> public Covariance() {<a name="line.59"></a>
63 <FONT color="green">060</FONT> super();<a name="line.60"></a>
64 <FONT color="green">061</FONT> covarianceMatrix = null;<a name="line.61"></a>
65 <FONT color="green">062</FONT> n = 0;<a name="line.62"></a>
66 <FONT color="green">063</FONT> }<a name="line.63"></a>
67 <FONT color="green">064</FONT> <a name="line.64"></a>
68 <FONT color="green">065</FONT> /**<a name="line.65"></a>
69 <FONT color="green">066</FONT> * Create a Covariance matrix from a rectangular array<a name="line.66"></a>
70 <FONT color="green">067</FONT> * whose columns represent covariates.<a name="line.67"></a>
71 <FONT color="green">068</FONT> *<a name="line.68"></a>
72 <FONT color="green">069</FONT> * &lt;p&gt;The &lt;code&gt;biasCorrected&lt;/code&gt; parameter determines whether or not<a name="line.69"></a>
73 <FONT color="green">070</FONT> * covariance estimates are bias-corrected.&lt;/p&gt;<a name="line.70"></a>
74 <FONT color="green">071</FONT> *<a name="line.71"></a>
75 <FONT color="green">072</FONT> * &lt;p&gt;The input array must be rectangular with at least two columns<a name="line.72"></a>
76 <FONT color="green">073</FONT> * and two rows.&lt;/p&gt;<a name="line.73"></a>
77 <FONT color="green">074</FONT> *<a name="line.74"></a>
78 <FONT color="green">075</FONT> * @param data rectangular array with columns representing covariates<a name="line.75"></a>
79 <FONT color="green">076</FONT> * @param biasCorrected true means covariances are bias-corrected<a name="line.76"></a>
80 <FONT color="green">077</FONT> * @throws IllegalArgumentException if the input data array is not<a name="line.77"></a>
81 <FONT color="green">078</FONT> * rectangular with at least two rows and two columns.<a name="line.78"></a>
82 <FONT color="green">079</FONT> */<a name="line.79"></a>
83 <FONT color="green">080</FONT> public Covariance(double[][] data, boolean biasCorrected) {<a name="line.80"></a>
84 <FONT color="green">081</FONT> this(new BlockRealMatrix(data), biasCorrected);<a name="line.81"></a>
85 <FONT color="green">082</FONT> }<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> * Create a Covariance matrix from a rectangular array<a name="line.85"></a>
89 <FONT color="green">086</FONT> * whose columns represent covariates.<a name="line.86"></a>
90 <FONT color="green">087</FONT> *<a name="line.87"></a>
91 <FONT color="green">088</FONT> * &lt;p&gt;The input array must be rectangular with at least two columns<a name="line.88"></a>
92 <FONT color="green">089</FONT> * and two rows&lt;/p&gt;<a name="line.89"></a>
93 <FONT color="green">090</FONT> *<a name="line.90"></a>
94 <FONT color="green">091</FONT> * @param data rectangular array with columns representing covariates<a name="line.91"></a>
95 <FONT color="green">092</FONT> * @throws IllegalArgumentException if the input data array is not<a name="line.92"></a>
96 <FONT color="green">093</FONT> * rectangular with at least two rows and two columns.<a name="line.93"></a>
97 <FONT color="green">094</FONT> */<a name="line.94"></a>
98 <FONT color="green">095</FONT> public Covariance(double[][] data) {<a name="line.95"></a>
99 <FONT color="green">096</FONT> this(data, true);<a name="line.96"></a>
100 <FONT color="green">097</FONT> }<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> * Create a covariance matrix from a matrix whose columns<a name="line.100"></a>
104 <FONT color="green">101</FONT> * represent covariates.<a name="line.101"></a>
105 <FONT color="green">102</FONT> *<a name="line.102"></a>
106 <FONT color="green">103</FONT> * &lt;p&gt;The &lt;code&gt;biasCorrected&lt;/code&gt; parameter determines whether or not<a name="line.103"></a>
107 <FONT color="green">104</FONT> * covariance estimates are bias-corrected.&lt;/p&gt;<a name="line.104"></a>
108 <FONT color="green">105</FONT> *<a name="line.105"></a>
109 <FONT color="green">106</FONT> * &lt;p&gt;The matrix must have at least two columns and two rows&lt;/p&gt;<a name="line.106"></a>
110 <FONT color="green">107</FONT> *<a name="line.107"></a>
111 <FONT color="green">108</FONT> * @param matrix matrix with columns representing covariates<a name="line.108"></a>
112 <FONT color="green">109</FONT> * @param biasCorrected true means covariances are bias-corrected<a name="line.109"></a>
113 <FONT color="green">110</FONT> * @throws IllegalArgumentException if the input matrix does not have<a name="line.110"></a>
114 <FONT color="green">111</FONT> * at least two rows and two columns<a name="line.111"></a>
115 <FONT color="green">112</FONT> */<a name="line.112"></a>
116 <FONT color="green">113</FONT> public Covariance(RealMatrix matrix, boolean biasCorrected) {<a name="line.113"></a>
117 <FONT color="green">114</FONT> checkSufficientData(matrix);<a name="line.114"></a>
118 <FONT color="green">115</FONT> n = matrix.getRowDimension();<a name="line.115"></a>
119 <FONT color="green">116</FONT> covarianceMatrix = computeCovarianceMatrix(matrix, biasCorrected);<a name="line.116"></a>
120 <FONT color="green">117</FONT> }<a name="line.117"></a>
121 <FONT color="green">118</FONT> <a name="line.118"></a>
122 <FONT color="green">119</FONT> /**<a name="line.119"></a>
123 <FONT color="green">120</FONT> * Create a covariance matrix from a matrix whose columns<a name="line.120"></a>
124 <FONT color="green">121</FONT> * represent covariates.<a name="line.121"></a>
125 <FONT color="green">122</FONT> *<a name="line.122"></a>
126 <FONT color="green">123</FONT> * &lt;p&gt;The matrix must have at least two columns and two rows&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 matrix matrix with columns representing covariates<a name="line.125"></a>
129 <FONT color="green">126</FONT> * @throws IllegalArgumentException if the input matrix does not have<a name="line.126"></a>
130 <FONT color="green">127</FONT> * at least two rows and two columns<a name="line.127"></a>
131 <FONT color="green">128</FONT> */<a name="line.128"></a>
132 <FONT color="green">129</FONT> public Covariance(RealMatrix matrix) {<a name="line.129"></a>
133 <FONT color="green">130</FONT> this(matrix, true);<a name="line.130"></a>
134 <FONT color="green">131</FONT> }<a name="line.131"></a>
135 <FONT color="green">132</FONT> <a name="line.132"></a>
136 <FONT color="green">133</FONT> /**<a name="line.133"></a>
137 <FONT color="green">134</FONT> * Returns the covariance matrix<a name="line.134"></a>
138 <FONT color="green">135</FONT> *<a name="line.135"></a>
139 <FONT color="green">136</FONT> * @return covariance matrix<a name="line.136"></a>
140 <FONT color="green">137</FONT> */<a name="line.137"></a>
141 <FONT color="green">138</FONT> public RealMatrix getCovarianceMatrix() {<a name="line.138"></a>
142 <FONT color="green">139</FONT> return covarianceMatrix;<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> /**<a name="line.142"></a>
146 <FONT color="green">143</FONT> * Returns the number of observations (length of covariate vectors)<a name="line.143"></a>
147 <FONT color="green">144</FONT> *<a name="line.144"></a>
148 <FONT color="green">145</FONT> * @return number of observations<a name="line.145"></a>
149 <FONT color="green">146</FONT> */<a name="line.146"></a>
150 <FONT color="green">147</FONT> <a name="line.147"></a>
151 <FONT color="green">148</FONT> public int getN() {<a name="line.148"></a>
152 <FONT color="green">149</FONT> return n;<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> * Compute a covariance matrix from a matrix whose columns represent<a name="line.153"></a>
157 <FONT color="green">154</FONT> * covariates.<a name="line.154"></a>
158 <FONT color="green">155</FONT> * @param matrix input matrix (must have at least two columns and two rows)<a name="line.155"></a>
159 <FONT color="green">156</FONT> * @param biasCorrected determines whether or not covariance estimates are bias-corrected<a name="line.156"></a>
160 <FONT color="green">157</FONT> * @return covariance matrix<a name="line.157"></a>
161 <FONT color="green">158</FONT> */<a name="line.158"></a>
162 <FONT color="green">159</FONT> protected RealMatrix computeCovarianceMatrix(RealMatrix matrix, boolean biasCorrected) {<a name="line.159"></a>
163 <FONT color="green">160</FONT> int dimension = matrix.getColumnDimension();<a name="line.160"></a>
164 <FONT color="green">161</FONT> Variance variance = new Variance(biasCorrected);<a name="line.161"></a>
165 <FONT color="green">162</FONT> RealMatrix outMatrix = new BlockRealMatrix(dimension, dimension);<a name="line.162"></a>
166 <FONT color="green">163</FONT> for (int i = 0; i &lt; dimension; i++) {<a name="line.163"></a>
167 <FONT color="green">164</FONT> for (int j = 0; j &lt; i; j++) {<a name="line.164"></a>
168 <FONT color="green">165</FONT> double cov = covariance(matrix.getColumn(i), matrix.getColumn(j), biasCorrected);<a name="line.165"></a>
169 <FONT color="green">166</FONT> outMatrix.setEntry(i, j, cov);<a name="line.166"></a>
170 <FONT color="green">167</FONT> outMatrix.setEntry(j, i, cov);<a name="line.167"></a>
171 <FONT color="green">168</FONT> }<a name="line.168"></a>
172 <FONT color="green">169</FONT> outMatrix.setEntry(i, i, variance.evaluate(matrix.getColumn(i)));<a name="line.169"></a>
173 <FONT color="green">170</FONT> }<a name="line.170"></a>
174 <FONT color="green">171</FONT> return outMatrix;<a name="line.171"></a>
175 <FONT color="green">172</FONT> }<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> * Create a covariance matrix from a matrix whose columns represent<a name="line.175"></a>
179 <FONT color="green">176</FONT> * covariates. Covariances are computed using the bias-corrected formula.<a name="line.176"></a>
180 <FONT color="green">177</FONT> * @param matrix input matrix (must have at least two columns and two rows)<a name="line.177"></a>
181 <FONT color="green">178</FONT> * @return covariance matrix<a name="line.178"></a>
182 <FONT color="green">179</FONT> * @see #Covariance<a name="line.179"></a>
183 <FONT color="green">180</FONT> */<a name="line.180"></a>
184 <FONT color="green">181</FONT> protected RealMatrix computeCovarianceMatrix(RealMatrix matrix) {<a name="line.181"></a>
185 <FONT color="green">182</FONT> return computeCovarianceMatrix(matrix, true);<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> /**<a name="line.185"></a>
189 <FONT color="green">186</FONT> * Compute a covariance matrix from a rectangular array whose columns represent<a name="line.186"></a>
190 <FONT color="green">187</FONT> * covariates.<a name="line.187"></a>
191 <FONT color="green">188</FONT> * @param data input array (must have at least two columns and two rows)<a name="line.188"></a>
192 <FONT color="green">189</FONT> * @param biasCorrected determines whether or not covariance estimates are bias-corrected<a name="line.189"></a>
193 <FONT color="green">190</FONT> * @return covariance matrix<a name="line.190"></a>
194 <FONT color="green">191</FONT> */<a name="line.191"></a>
195 <FONT color="green">192</FONT> protected RealMatrix computeCovarianceMatrix(double[][] data, boolean biasCorrected) {<a name="line.192"></a>
196 <FONT color="green">193</FONT> return computeCovarianceMatrix(new BlockRealMatrix(data), biasCorrected);<a name="line.193"></a>
197 <FONT color="green">194</FONT> }<a name="line.194"></a>
198 <FONT color="green">195</FONT> <a name="line.195"></a>
199 <FONT color="green">196</FONT> /**<a name="line.196"></a>
200 <FONT color="green">197</FONT> * Create a covariance matrix from a rectangual array whose columns represent<a name="line.197"></a>
201 <FONT color="green">198</FONT> * covariates. Covariances are computed using the bias-corrected formula.<a name="line.198"></a>
202 <FONT color="green">199</FONT> * @param data input array (must have at least two columns and two rows)<a name="line.199"></a>
203 <FONT color="green">200</FONT> * @return covariance matrix<a name="line.200"></a>
204 <FONT color="green">201</FONT> * @see #Covariance<a name="line.201"></a>
205 <FONT color="green">202</FONT> */<a name="line.202"></a>
206 <FONT color="green">203</FONT> protected RealMatrix computeCovarianceMatrix(double[][] data) {<a name="line.203"></a>
207 <FONT color="green">204</FONT> return computeCovarianceMatrix(data, true);<a name="line.204"></a>
208 <FONT color="green">205</FONT> }<a name="line.205"></a>
209 <FONT color="green">206</FONT> <a name="line.206"></a>
210 <FONT color="green">207</FONT> /**<a name="line.207"></a>
211 <FONT color="green">208</FONT> * Computes the covariance between the two arrays.<a name="line.208"></a>
212 <FONT color="green">209</FONT> *<a name="line.209"></a>
213 <FONT color="green">210</FONT> * &lt;p&gt;Array lengths must match and the common length must be at least 2.&lt;/p&gt;<a name="line.210"></a>
214 <FONT color="green">211</FONT> *<a name="line.211"></a>
215 <FONT color="green">212</FONT> * @param xArray first data array<a name="line.212"></a>
216 <FONT color="green">213</FONT> * @param yArray second data array<a name="line.213"></a>
217 <FONT color="green">214</FONT> * @param biasCorrected if true, returned value will be bias-corrected<a name="line.214"></a>
218 <FONT color="green">215</FONT> * @return returns the covariance for the two arrays<a name="line.215"></a>
219 <FONT color="green">216</FONT> * @throws IllegalArgumentException if the arrays lengths do not match or<a name="line.216"></a>
220 <FONT color="green">217</FONT> * there is insufficient data<a name="line.217"></a>
221 <FONT color="green">218</FONT> */<a name="line.218"></a>
222 <FONT color="green">219</FONT> public double covariance(final double[] xArray, final double[] yArray, boolean biasCorrected)<a name="line.219"></a>
223 <FONT color="green">220</FONT> throws IllegalArgumentException {<a name="line.220"></a>
224 <FONT color="green">221</FONT> Mean mean = new Mean();<a name="line.221"></a>
225 <FONT color="green">222</FONT> double result = 0d;<a name="line.222"></a>
226 <FONT color="green">223</FONT> int length = xArray.length;<a name="line.223"></a>
227 <FONT color="green">224</FONT> if(length == yArray.length &amp;&amp; length &gt; 1) {<a name="line.224"></a>
228 <FONT color="green">225</FONT> double xMean = mean.evaluate(xArray);<a name="line.225"></a>
229 <FONT color="green">226</FONT> double yMean = mean.evaluate(yArray);<a name="line.226"></a>
230 <FONT color="green">227</FONT> for (int i = 0; i &lt; length; i++) {<a name="line.227"></a>
231 <FONT color="green">228</FONT> double xDev = xArray[i] - xMean;<a name="line.228"></a>
232 <FONT color="green">229</FONT> double yDev = yArray[i] - yMean;<a name="line.229"></a>
233 <FONT color="green">230</FONT> result += (xDev * yDev - result) / (i + 1);<a name="line.230"></a>
234 <FONT color="green">231</FONT> }<a name="line.231"></a>
235 <FONT color="green">232</FONT> }<a name="line.232"></a>
236 <FONT color="green">233</FONT> else {<a name="line.233"></a>
237 <FONT color="green">234</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.234"></a>
238 <FONT color="green">235</FONT> "arrays must have the same length and both must have at " +<a name="line.235"></a>
239 <FONT color="green">236</FONT> "least two elements. xArray has size {0}, yArray has {1} elements",<a name="line.236"></a>
240 <FONT color="green">237</FONT> length, yArray.length);<a name="line.237"></a>
241 <FONT color="green">238</FONT> }<a name="line.238"></a>
242 <FONT color="green">239</FONT> return biasCorrected ? result * ((double) length / (double)(length - 1)) : result;<a name="line.239"></a>
243 <FONT color="green">240</FONT> }<a name="line.240"></a>
244 <FONT color="green">241</FONT> <a name="line.241"></a>
245 <FONT color="green">242</FONT> /**<a name="line.242"></a>
246 <FONT color="green">243</FONT> * Computes the covariance between the two arrays, using the bias-corrected<a name="line.243"></a>
247 <FONT color="green">244</FONT> * formula.<a name="line.244"></a>
248 <FONT color="green">245</FONT> *<a name="line.245"></a>
249 <FONT color="green">246</FONT> * &lt;p&gt;Array lengths must match and the common length must be at least 2.&lt;/p&gt;<a name="line.246"></a>
250 <FONT color="green">247</FONT> *<a name="line.247"></a>
251 <FONT color="green">248</FONT> * @param xArray first data array<a name="line.248"></a>
252 <FONT color="green">249</FONT> * @param yArray second data array<a name="line.249"></a>
253 <FONT color="green">250</FONT> * @return returns the covariance for the two arrays<a name="line.250"></a>
254 <FONT color="green">251</FONT> * @throws IllegalArgumentException if the arrays lengths do not match or<a name="line.251"></a>
255 <FONT color="green">252</FONT> * there is insufficient data<a name="line.252"></a>
256 <FONT color="green">253</FONT> */<a name="line.253"></a>
257 <FONT color="green">254</FONT> public double covariance(final double[] xArray, final double[] yArray)<a name="line.254"></a>
258 <FONT color="green">255</FONT> throws IllegalArgumentException {<a name="line.255"></a>
259 <FONT color="green">256</FONT> return covariance(xArray, yArray, true);<a name="line.256"></a>
260 <FONT color="green">257</FONT> }<a name="line.257"></a>
261 <FONT color="green">258</FONT> <a name="line.258"></a>
262 <FONT color="green">259</FONT> /**<a name="line.259"></a>
263 <FONT color="green">260</FONT> * Throws IllegalArgumentException of the matrix does not have at least<a name="line.260"></a>
264 <FONT color="green">261</FONT> * two columns and two rows<a name="line.261"></a>
265 <FONT color="green">262</FONT> * @param matrix matrix to check<a name="line.262"></a>
266 <FONT color="green">263</FONT> */<a name="line.263"></a>
267 <FONT color="green">264</FONT> private void checkSufficientData(final RealMatrix matrix) {<a name="line.264"></a>
268 <FONT color="green">265</FONT> int nRows = matrix.getRowDimension();<a name="line.265"></a>
269 <FONT color="green">266</FONT> int nCols = matrix.getColumnDimension();<a name="line.266"></a>
270 <FONT color="green">267</FONT> if (nRows &lt; 2 || nCols &lt; 2) {<a name="line.267"></a>
271 <FONT color="green">268</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.268"></a>
272 <FONT color="green">269</FONT> "insufficient data: only {0} rows and {1} columns.",<a name="line.269"></a>
273 <FONT color="green">270</FONT> nRows, nCols);<a name="line.270"></a>
274 <FONT color="green">271</FONT> }<a name="line.271"></a>
275 <FONT color="green">272</FONT> }<a name="line.272"></a>
276 <FONT color="green">273</FONT> }<a name="line.273"></a>
277
278
279
280
281
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 </PRE>
338 </BODY>
339 </HTML>