[statistics] corrected %hm_stdev to fix all tests in statistics 84/17984/9
Pierre-Aime Agnel [Fri, 25 Mar 2016 17:09:33 +0000 (18:09 +0100)]
test_run statistics stdev

test_run statistics bug_2407

test_run statistics bug_7593

Change-Id: I2a707a941af64030698c439433aa698540125277

scilab/CHANGES
scilab/modules/overloading/macros/%hm_stdev.sci
scilab/modules/statistics/help/en_US/descriptive_statistics/stdev.xml
scilab/modules/statistics/help/fr_FR/descriptive_statistics/stdev.xml
scilab/modules/statistics/help/ja_JP/descriptive_statistics/stdev.xml
scilab/modules/statistics/macros/stdev.sci
scilab/modules/statistics/tests/unit_tests/correl.dia.ref
scilab/modules/statistics/tests/unit_tests/correl.tst
scilab/modules/statistics/tests/unit_tests/stdev.dia.ref
scilab/modules/statistics/tests/unit_tests/stdev.tst

index b2f734f..8adde4e 100644 (file)
@@ -260,6 +260,7 @@ Modified Functions
 * pdiv: Return a matrix of type 'constant' when all the rank are 0.
 * test_run can now take "[]" as argument to be used on console; for instance: test_run string [] no_check_ref
 * strange([]) now returns %nan instead of [], as all other functions for statistical dispersion
+* stdev(x, dir>ndims(x)) now yields an error instead of returning zeros(x)
 * Writing string or string matrix in a file does not add blanck space before each value:
     write("TMPDIR/test", ["test", "sample"; "sample", "test"])
     "-" + mgetl("TMPDIR/test") + "-"
index b529edb..1be0698 100644 (file)
@@ -11,6 +11,7 @@
 // along with this program.
 
 function x = %hm_stdev(m, d, ms)
+    // d: 0, 1, 2...
     if argn(2) < 3 then
         ms = %f
     end
@@ -23,17 +24,13 @@ function x = %hm_stdev(m, d, ms)
         error(msprintf(msg,"stdev",2,1));
     end
 
-    if argn(2) == 1 | d == "*" then
+    if argn(2) == 1 | d==0 then
         if argn(2) == 3 then
             x = stdev(m(:), "*", ms);
         else
             x = stdev(m(:), "*");
         end
         return
-    elseif d == "r" then
-        d = 1;
-    elseif d == "c" then
-        d = 2;
     end
     dims = size(m);
     N = size(dims, "*");
index ec3a157..46f0d33 100644 (file)
         <synopsis>
             y = stdev(x)
             y = stdev(x, '*')
-            y = stdev(x, 'r')
-            y = stdev(x, 'c')
+            y = stdev(x, 'r'|1)
+            y = stdev(x, 'c'|2)
             y = stdev(x, orien, m)
         </synopsis>
     </refsynopsisdiv>
-    <refsection>
+    <refsection role="parameters">
         <title>Arguments</title>
         <variablelist>
             <varlistentry>
@@ -51,7 +51,9 @@
                 <term>orien</term>
                 <listitem>
                     <para>
-                        string scalar or positive integer, can be <literal>"*"</literal>, <literal>"r"</literal> (or <literal>1</literal>) or <literal>"c"</literal> (or <literal>2</literal>)
+                        <literal>"*"</literal> (default), <literal>"r"</literal> or 1,
+                        <literal>"c"</literal> or 2, or 0&lt;integer&lt;=ndims(x): direction along
+                        which calculations are performed.
                     </para>
                 </listitem>
             </varlistentry>
@@ -63,7 +65,7 @@
             </varlistentry>
         </variablelist>
     </refsection>
-    <refsection>
+    <refsection role="description">
         <title>Description</title>
         <para>
             stdev computes the "sample" standard deviation, that
             entry of the row vector <literal>y</literal> the standard deviation of each column of <literal>x</literal>.
         </para>
         <para>
-            <literal>y=stdev(x,'c')</literal> (or, equivalently, <literal>y=stdev(x,2)</literal>) is the columnwise stdev. It returns in each
-            entry of the column vector <literal>y</literal> the standard deviation of each row of <literal>x</literal>.
+            <literal>y=stdev(x,'c')</literal> (or, equivalently, <literal>y=stdev(x,2)</literal>)
+            is the columnwise stdev. It returns in each
+            entry of the column vector <literal>y</literal> the standard deviation of each row of
+          <literal>x</literal>.
         </para>
         <para>
-            By extension, <literal>y=stdev(x,n)</literal> with <literal>n</literal> a positive integer returns the deviation
-            along the <literal>n</literal>-th dimension, and if <literal>n>ndims(x)</literal>, then <literal>stdev(x,n)</literal> returns <literal>zeros(x)</literal>.
+            By extension, <literal>y=stdev(x,n)</literal> with <literal>n</literal> a positive integer
+             returns the deviation along the <literal>n</literal>-th dimension.
         </para>
         <note>
-            If <varname>m</varname> is a scalar, then it is expanded to match the size of <code>mean(x)</code> along the <literal>n</literal>-th dimension.
+            If <varname>m</varname> is a scalar, then it is expanded to match the size of
+          <code>mean(x)</code> along the <literal>n</literal>-th dimension.
         </note>
     </refsection>
-    <refsection>
+    <refsection role="examples">
         <title>Examples</title>
         <programlisting role="example"><![CDATA[
 A = [1 2 10; 7 7.1 7.01];
 stdev(A)
 stdev(A, 'r')
 stdev(A, 'c')
-stdev(A, 'c', mean(A,'c'))
-stdev(A, 'c', 1)
+stdev(A,  2 )
+
+// Deviation from a known (a-priori, built-in) mean:
+A = grand(10, 10, "nor", 7.5, 3);
+stdev(A) / 3             // unknown mean => assessed from A before computing stdev
+stdev(A, '*', 7.5) / 3   // using the theoretical built-in mean
+
+// With an hypermatrix:
+A = grand(3, 5, 30, "nor", 4.1, 1.5);
+stdev(A) / 1.5
+sd = stdev(A, 3, 4.1) / 1.5
+mean(sd)
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -123,7 +138,7 @@ stdev(A, 'c', 1)
             </member>
         </simplelist>
     </refsection>
-    <refsection>
+    <refsection role="history">
         <title>History</title>
         <revhistory>
             <revision>
@@ -132,6 +147,12 @@ stdev(A, 'c', 1)
                     Can now compute the mean squared deviation using the a priori mean defined by <varname>m</varname>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    stdev(x, orien>ndims(x)) no longer returns zeros(x) but yields an error.
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 4cdc753..ff649c4 100644 (file)
@@ -19,7 +19,7 @@
         <refpurpose>écart-type des termes d'une matrice</refpurpose>
     </refnamediv>
     <refsynopsisdiv>
-        <title>Séquence d'appel</title>
+        <title>Syntaxe</title>
         <synopsis>
             y = stdev(x)
             y = stdev(x, '*')
@@ -49,7 +49,9 @@
                 <term>orien</term>
                 <listitem>
                     <para>
-                        caractère, peut valoir <literal>"*"</literal>, <literal>"r"</literal> ou <literal>"c"</literal>
+                        <literal>"*"</literal> (par défaut), <literal>"r"</literal> ou 1,
+                        <literal>"c"</literal> ou 2, ou un entier &lt;= ndims(x): direction selon
+                        laquelle l'écart-type est calculé.
                     </para>
                 </listitem>
             </varlistentry>
@@ -80,8 +82,8 @@
             <literal>y=stdev(x,'c')</literal> (ou <literal>y=stdev(x,2)</literal>) est l'écart-type selon l'indice de colonne. Chaque composante du vecteur colonne <literal>y</literal> contient l'écart-type de chaque ligne de <literal>x</literal>.
         </para>
         <para>
-            Par extension, <literal>y=stdev(x,n)</literal> avec <literal>n</literal> un entier positif retourne la déviation
-            suivant la <literal>n</literal>-ème dimension, et si <literal>n>ndims(x)</literal>, alors <literal>stdev(x,n)</literal> retourne <literal>zeros(x)</literal>.
+            Par extension, <literal>y=stdev(x,n)</literal> avec <literal>n</literal> un entier positif
+            retourne la déviation suivant la <literal>n</literal>-ème dimension.
         </para>
     </refsection>
     <refsection>
@@ -91,7 +93,19 @@ A = [1 2 10; 7 7.1 7.01];
 stdev(A)
 stdev(A, 'r')
 stdev(A, 'c')
-stdev(A, 'c', mean(x,'c'))
+stdev(A,  2 )
+
+// Ecart-type par rapport à une moyenne théorique connue a priori (par construction) :
+A = grand(10, 10, "nor", 7.5, 3);
+stdev(A) / 3             // Moyenne inconnue => estimée d'après A avant d'y référer l'écart-type
+stdev(A, '*', 7.5) / 3   // Utilisation de la moyenne consignée pour le tirage aléatoire avec grand()
+
+// Avec une hypermatrice :
+A = grand(3, 5, 30, "nor", 4.1, 1.5);
+stdev(A) / 1.5
+sd = stdev(A, 3, 4.1) / 1.5
+mean(sd)
+
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -123,6 +137,12 @@ stdev(A, 'c', mean(x,'c'))
                     Peut désormais calculer l'écart-type moyen quadratique en utilisant la moyenne a priori définie par <varname>m</varname>
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    stdev(x, orien>ndims(x)) ne donne plus zeros(x) mais produit une erreur.
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 7c504a0..bc42f94 100644 (file)
@@ -32,7 +32,7 @@
             y = stdev(x, orien, m)
         </synopsis>
     </refsynopsisdiv>
-    <refsection>
+    <refsection role="parameters">
         <title>引数</title>
         <variablelist>
             <varlistentry>
                 <term>orien</term>
                 <listitem>
                     <para>
-                        文字列スカラーまたは正の整数であり,
-                        <literal>"*"</literal>, <literal>"r"</literal>
-                        (または<literal>1</literal>)または
-                        <literal>"c"</literal> (または <literal>2</literal>)を指定可能
+                        <literal>"*"</literal> (default), <literal>"r"</literal> or 1,
+                        <literal>"c"</literal> or 2, or integer&lt;=ndims(x): direction along
+                        which calculations are performed.
                     </para>
                 </listitem>
             </varlistentry>
@@ -66,7 +65,7 @@
             </varlistentry>
         </variablelist>
     </refsection>
-    <refsection>
+    <refsection role="description">
         <title>説明</title>
         <para>
             stdev は "標本" 標準偏差を計算します.
@@ -96,8 +95,6 @@
             拡張表現として,正の整数<literal>n</literal>を指定して<literal>y=stdev(x,n)</literal>と
             すると,<literal>n</literal>番目の次元に沿った
             標準偏差を返します.
-            <literal>n>ndims(x)</literal>の場合,
-            <literal>stdev(x,n)</literal> は <literal>zeros(x)</literal>を返します.
         </para>
         <note>
             <varname>m</varname> がスカラーの場合, 
             <code>mean(x)</code> の大きさに一致するように拡張されます.
         </note>
     </refsection>
-    <refsection>
+    <refsection role="examples">
         <title>例</title>
         <programlisting role="example"><![CDATA[
 A = [1 2 10; 7 7.1 7.01];
 stdev(A)
 stdev(A, 'r')
 stdev(A, 'c')
-stdev(A, 'c', mean(A,'c'))
-stdev(A, 'c', 1)
+stdev(A,  2 )
+
+// Deviation from a known (a-priori, built-in) mean:
+A = grand(10, 10, "nor", 7.5, 3);
+stdev(A) / 3             // unknown mean => assessed from A before computing stdev
+stdev(A, '*', 7.5) / 3   // using the theoretical built-in mean
+
+// With an hypermatrix:
+A = grand(3, 5, 30, "nor", 4.1, 1.5);
+stdev(A) / 1.5
+sd = stdev(A, 3, 4.1) / 1.5
+mean(sd)
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
@@ -136,7 +143,7 @@ stdev(A, 'c', 1)
             </member>
         </simplelist>
     </refsection>
-    <refsection>
+    <refsection role="history">
         <title>履歴</title>
         <revhistory>
             <revision>
@@ -146,6 +153,12 @@ stdev(A, 'c', 1)
                     先験平均を用いて平均二乗偏差を計算できるようになりました
                 </revdescription>
             </revision>
+            <revision>
+                <revnumber>6.0</revnumber>
+                <revdescription>
+                    stdev(x, orien>ndims(x)) no longer returns zeros(x) but yields an error.
+                </revdescription>
+            </revision>
         </revhistory>
     </refsection>
 </refentry>
index 3ba3659..e58dbb0 100644 (file)
@@ -36,7 +36,8 @@ function sd = stdev(x, o, m)
     [lhs, rhs] = argn(0);
 
     if rhs < 1 then
-        error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),"stdev",1,3));
+        msg = _("%s: Wrong number of input arguments: %d to %d expected.\n")
+        error(msprintf(msg, "stdev", 1, 3))
     end
 
     if rhs < 2 then
@@ -51,8 +52,13 @@ function sd = stdev(x, o, m)
         case "c" then
             on = 2
         else
-            if type(o) <> 1 | size(o, "*") <> 1 | o < 0 | floor(o) <> o then
-                error(msprintf(_("%s: Wrong value for input argument #%d: ''%s'', ''%s'', ''%s'' or a positive integer expected.\n"),"stdev",2,"*","r","c")),
+            if type(o) <> 1 || size(o, "*") <> 1 || floor(o) <> o | o < 1 | o > ndims(x) then
+                msg = _("%s: Argument #%d: Must be in the set {%s}.\n")
+                sset =  """*"" ""r"" ""c"" 1 2"
+                if ndims(x)>2
+                    sset = sset + strcat(msprintf(" %d\n",(3:ndims(x))'))
+                end
+                error(msprintf(msg, "stdev", 2, sset))
             else
                 on = o
             end
@@ -61,9 +67,9 @@ function sd = stdev(x, o, m)
 
     if (length(size(x)) > 2) then
         if rhs == 3 then
-            sd = %hm_stdev(x, o, m);
+            sd = %hm_stdev(x, on, m);
         else
-            sd = %hm_stdev(x, o);
+            sd = %hm_stdev(x, on);
         end
         return
     end
@@ -75,7 +81,7 @@ function sd = stdev(x, o, m)
 
     siz = size(x);
     if rhs == 3 then
-        if and(typeof(m) ~= ["constant" "hypermat"]) | ~isreal(m) then
+        if typeof(m) ~= "constant" | ~isreal(m) then
             tmp = _("%s: Wrong type for input argument #%d: A real matrix expected.\n")
             error(msprintf(tmp, "stdev", 3))
         elseif on == 0 then
index ac527db..38df7c9 100644 (file)
@@ -50,11 +50,11 @@ assert_checkalmostequal(r, -0.0089969, [], 1.e-7);
 r = correl([1 4 9 7 2], [2 5 10 8 3])
  r  = 
     1.
-assert_checkequal(r, 1);
+assert_checkalmostequal(r, 1, 2*%eps);
 r = correl([1 4 9 7 2], [-0 -3 -8 -6 -1])
  r  = 
   - 1.
-assert_checkequal(r, -1);
+assert_checkalmostequal(r, -1, 2*%eps);
 x = [24.2; 22.7;30.5;28.6;25.5;32.0;28.6;26.5;25.3;26.0;24.4;24.8;20.6;25.1;21.4;23.7;23.9;25.2;27.4;28.3;28.8;26.6];
 y = [25;31;36;33;19;24;27;25;16;14;22;23;20;25;25;23;27;30;33;32;35;24];
 r = correl(x,y);
index 92f3248..dcb912a 100644 (file)
@@ -69,10 +69,10 @@ r = correl([1 4 9 7 2], [6 3 0], [0.3 0.5 0.7;0.1 1 0.4;0.3 0.6 0.4;0.2 0.2 0.3;
 assert_checkalmostequal(r, -0.0089969, [], 1.e-7);
 
 r = correl([1 4 9 7 2], [2 5 10 8 3])
-assert_checkequal(r, 1);
+assert_checkalmostequal(r, 1, 2*%eps);
 
 r = correl([1 4 9 7 2], [-0 -3 -8 -6 -1])
-assert_checkequal(r, -1);
+assert_checkalmostequal(r, -1, 2*%eps);
 
 x = [24.2; 22.7;30.5;28.6;25.5;32.0;28.6;26.5;25.3;26.0;24.4;24.8;20.6;25.1;21.4;23.7;23.9;25.2;27.4;28.3;28.8;26.6];
 y = [25;31;36;33;19;24;27;25;16;14;22;23;20;25;25;23;27;30;33;32;35;24];
index 8c963e1..f78e2e5 100644 (file)
 assert_checkequal(stdev(0), 0);
 assert_checkequal(stdev(zeros(3,3)), 0);
 assert_checkequal(stdev(zeros(3,3,3)), 0);
-// stdev returns 0 when asking for singleton dimensions
 assert_checkequal(stdev(1, 1), 0);
 assert_checkequal(stdev(1, 2), 0);
-assert_checkequal(stdev(ones(3,3), 3), zeros(3,3));
-assert_checkequal(stdev(ones(3,3,3), 4), zeros(3,3,3));
 rand("seed", 0);
 a = rand(3, 3, 3);
 refY = 0.272002431404198;
index d93fe19..cc97d95 100644 (file)
 assert_checkequal(stdev(0), 0);
 assert_checkequal(stdev(zeros(3,3)), 0);
 assert_checkequal(stdev(zeros(3,3,3)), 0);
-// stdev returns 0 when asking for singleton dimensions
 assert_checkequal(stdev(1, 1), 0);
 assert_checkequal(stdev(1, 2), 0);
-assert_checkequal(stdev(ones(3,3), 3), zeros(3,3));
-assert_checkequal(stdev(ones(3,3,3), 4), zeros(3,3,3));
 
 rand("seed", 0);
 a = rand(3, 3, 3);