* Bug #13208 fixed - Statistics: reglin with NaNs 48/13548/7
Paul Bignier [Mon, 27 Jan 2014 10:03:10 +0000 (11:03 +0100)]
Change-Id: Ib092b900a75c1f93d807e1dc8daa69b8a67534a4

16 files changed:
SEP/INDEX
SEP/SEP_128_nanreglin.odt [new file with mode: 0644]
scilab/CHANGES_5.5.X
scilab/modules/helptools/etc/images_md5.txt
scilab/modules/helptools/images/nanreglin_1.png [new file with mode: 0644]
scilab/modules/helptools/images/nanreglin_2.png [new file with mode: 0644]
scilab/modules/helptools/images/reglin_1.png [new file with mode: 0644]
scilab/modules/helptools/images/reglin_2.png [new file with mode: 0644]
scilab/modules/statistics/help/en_US/data_missing_values/nanreglin.xml [new file with mode: 0644]
scilab/modules/statistics/help/en_US/reglin.xml
scilab/modules/statistics/help/fr_FR/data_missing_values/nanreglin.xml [new file with mode: 0644]
scilab/modules/statistics/help/fr_FR/reglin.xml [new file with mode: 0644]
scilab/modules/statistics/macros/nanreglin.sci [new file with mode: 0644]
scilab/modules/statistics/macros/reglin.sci
scilab/modules/statistics/tests/nonreg_tests/bug_13208.dia.ref [new file with mode: 0644]
scilab/modules/statistics/tests/nonreg_tests/bug_13208.tst [new file with mode: 0644]

index 21b6ed5..7d36398 100644 (file)
--- a/SEP/INDEX
+++ b/SEP/INDEX
@@ -123,3 +123,4 @@ SEP #124: New input argument for csvRead(), to ignore header comments.
 SEP #125: New input argument to matfile_open to open Matlab 7.3 files.
 SEP #126: New function unwrap
 SEP #127: jmat tagged as obsolete. New input argument to flipdim to replace jmat.
+SEP #128: nanreglin.
diff --git a/SEP/SEP_128_nanreglin.odt b/SEP/SEP_128_nanreglin.odt
new file mode 100644 (file)
index 0000000..063ba18
Binary files /dev/null and b/SEP/SEP_128_nanreglin.odt differ
index 84e3cf7..7def602 100644 (file)
@@ -19,6 +19,8 @@ New Features
 
 * pol2str(): support to polynomials with complex coefficients and hypermatrices (See bug #13109).
 
+* nanreglin(): reglin() with arguments containing NaNs (See bug #13208).
+
 
 Obsolete & Removed Functions
 ============================
@@ -555,6 +557,8 @@ Scilab Bug Fixes
 
 * Bug #13205 fixed - group accepted continuous transfer functions.
 
+* Bug #13208 fixed - New function nanreglin to handle NaNs for reglin().
+
 * Bug #13210 fixed - Incorrect argument description in the mseek help page.
 
 * Bug #13213 fixed - User defined margins were reset by auto computation of the margins.
index 958a4cc..7c1924a 100644 (file)
@@ -1012,6 +1012,8 @@ meshgrid_1.png=8e04fd2c2709e1dd252aa22404c6a0b2
 milk_drop_1.png=62d56a06fafd85b51c324f0870e45e4e
 move_1.png=c4599a8693c9c099ac9c7f1a5dee3e91
 mrfit_1.png=d8d3736f01fc8fc707c53508cddd575f
+nanreglin_1.png=a2189dd0a4084c54b9c1e05b45db555b
+nanreglin_2.png=5a3c75b736030778ba4a1717051810cb
 ndgrid_1.png=3ce3028731d1b6677c0b30ae6d59f68e
 ndgrid_2.png=4ef02608494aec0d492a68853b3bec1b
 ndgrid_ru_RU_2.png=de964c7f8e0168a8c01b85f494329120
@@ -1129,6 +1131,8 @@ polyline_properties_2.png=3349e39fe563e09fc488e9ed03c6e4ae
 polyline_properties_3.png=c758a8eb88f3a7383151da8a94cf808
 prbs_a_1.png=346ac375b06faf45f7fe67472b413509
 rainbowcolormap_1.png=68be57c62080633d0e67a91389f5ecd8
+reglin_1.png=9b22e4b782eb58eb90e5dccd50dfb466
+reglin_2.png=ae0a992db0840a018563e225fa3704e8
 remezb_1.png=17a8eb044482a1871bede91c36eddf0f
 replot_1.png=d9ab231632d9298a6f87718df49ce8ae
 replot_2.png=2bbd8e5516bcfba00fb343eff77b4736
diff --git a/scilab/modules/helptools/images/nanreglin_1.png b/scilab/modules/helptools/images/nanreglin_1.png
new file mode 100644 (file)
index 0000000..f19efb1
Binary files /dev/null and b/scilab/modules/helptools/images/nanreglin_1.png differ
diff --git a/scilab/modules/helptools/images/nanreglin_2.png b/scilab/modules/helptools/images/nanreglin_2.png
new file mode 100644 (file)
index 0000000..2061753
Binary files /dev/null and b/scilab/modules/helptools/images/nanreglin_2.png differ
diff --git a/scilab/modules/helptools/images/reglin_1.png b/scilab/modules/helptools/images/reglin_1.png
new file mode 100644 (file)
index 0000000..dcfaa1e
Binary files /dev/null and b/scilab/modules/helptools/images/reglin_1.png differ
diff --git a/scilab/modules/helptools/images/reglin_2.png b/scilab/modules/helptools/images/reglin_2.png
new file mode 100644 (file)
index 0000000..d423849
Binary files /dev/null and b/scilab/modules/helptools/images/reglin_2.png differ
diff --git a/scilab/modules/statistics/help/en_US/data_missing_values/nanreglin.xml b/scilab/modules/statistics/help/en_US/data_missing_values/nanreglin.xml
new file mode 100644 (file)
index 0000000..b5bc176
--- /dev/null
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="nanreglin">
+    <refnamediv>
+        <refname>nanreglin</refname>
+        <refpurpose>Linear regression</refpurpose>
+    </refnamediv>
+    <refsynopsisdiv>
+        <title>Calling Sequence</title>
+        <synopsis>[a,b]=nanreglin(x,y)</synopsis>
+    </refsynopsisdiv>
+    <refsection>
+        <title>Arguments</title>
+        <variablelist>
+            <varlistentry>
+                <term>x, y, a, b</term>
+                <listitem>
+                    <para>numerical vectors or matrices.</para>
+                </listitem>
+            </varlistentry>
+        </variablelist>
+    </refsection>
+    <refsection>
+        <title>Description</title>
+        <para>
+            Solve the regression problem y=a*x+b in the least square sense.
+            <literal>x</literal> and <literal>y</literal> are two matrices of size
+            <literal>x(p,n)</literal> and <literal>y(q,n)</literal>, where <literal>n</literal> is the number of samples.
+        </para>
+        <para>
+            The estimator <literal>a</literal> is a matrix of size <literal>(q,p)</literal> and <literal>b</literal> is a
+            vector of size <literal>(q,1)</literal>.
+        </para>
+        <para>
+            Each line of <literal>y</literal> is treated as an independent problem, if <literal>x</literal>
+            or <literal>y</literal> contain a NaN (<literal>x(i,j) = %nan</literal> or <literal>y(i,j) = %nan</literal>),
+            then <literal>x(:,j)</literal> and <literal>y(i,j)</literal> are ignored,
+            as if the point [x(:,j); y(i,j)] did not exist.
+        </para>
+    </para>
+</refsection>
+<refsection>
+    <title>Examples</title>
+    <para>
+        Graphical example #1:
+    </para>
+    <programlisting role="example"><![CDATA[
+// In the following example, both problems represent two straight lines:
+// one goes from (0,0) to (10,10) and the other one goes from (0,20) to (10,30).
+// reglin and nanreglin find the same values because all the points are aligned and the NaNs have been ignored.
+subplot(211)
+x = 0:10;
+y = 20:30;
+[a1, b1] = reglin(x, [x ; y]);
+plot(x', (a1*x+repmat(b1,1,11))', "red")
+
+subplot(212)
+y2 = y;
+y2(2:10) = %nan; // Leaving y2(1) and y2(11) unchanged.
+[a2, b2] = nanreglin(x, [x ; y2])
+plot(x', (a2*x+repmat(b2,1,11))', "blue")
+ ]]></programlisting>
+    <scilab:image>
+        subplot(211)
+        x = 0:10;
+        y = 20:30;
+        [a1, b1] = reglin(x, [x ; y]);
+        plot(x', (a1*x+repmat(b1,1,11))', "red")
+        subplot(212)
+        y2 = y;
+        y2(2:10) = %nan;
+        [a2, b2] = nanreglin(x, [x ; y2])
+        plot(x', (a2*x+repmat(b2,1,11))', "blue")
+    </scilab:image>
+    <para>
+        Graphical example #2:
+    </para>
+    <programlisting role="example"><![CDATA[
+// Now both problems represent one straight line (reglin(x, x)) from (0,0) to (2,2),
+// but while the second argument of the first problem (reglin(x, y)) represents
+// a flat line (with equation y = 1), the second argument of the second problem
+// (reglin(x, y2)) ignores the central point of y (set to %nan) so the flat line
+// now has equation y = 0, because the two remaining points are (0,0) and (2,0).
+subplot(211)
+x = 0:2;
+y = [0 3 0];
+[a1, b1] = reglin(x, [x ; y]);
+plot(x', (a1*x+repmat(b1,1,3))', "red")
+
+subplot(212)
+y2 = y;
+y2(2) = %nan; // y2 = [0 %nan 0];
+[a2, b2] = nanreglin(x, [x ; y2]);
+plot(x', (a2*x+repmat(b2,1,3))', "blue")
+ ]]></programlisting>
+    <scilab:image>
+        subplot(211)
+        x = 0:2;
+        y = [0 3 0];
+        [a1, b1] = reglin(x, [x ; y]);
+        plot(x', (a1*x+repmat(b1,1,3))', "red")
+        subplot(212)
+        y2 = y;
+        y2(2) = %nan; // y2 = [0 %nan 0];
+        [a2, b2] = nanreglin(x, [x ; y2]);
+        plot(x', (a2*x+repmat(b2,1,3))', "blue")
+    </scilab:image>
+</refsection>
+<refsection role="see also">
+    <title>See Also</title>
+    <simplelist type="inline">
+        <member>
+            <link linkend="reglin">reglin</link>
+        </member>
+        <member>
+            <link linkend="pinv">pinv</link>
+        </member>
+        <member>
+            <link linkend="leastsq">leastsq</link>
+        </member>
+        <member>
+            <link linkend="qr">qr</link>
+        </member>
+    </simplelist>
+</refsection>
+<refsection>
+    <title>History</title>
+    <revhistory>
+        <revision>
+            <revnumber>5.5.0</revnumber>
+            <revdescription>Introduction</revdescription>
+        </revision>
+    </revhistory>
+</refsection>
+</refentry>
index 4b6e887..8238129 100644 (file)
  *
  -->
 <refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="en" xml:id="reglin">
-    <refnamediv>
-        <refname>reglin</refname>
-        <refpurpose>Linear regression</refpurpose>
-    </refnamediv>
-    <refsynopsisdiv>
-        <title>Calling Sequence</title>
-        <synopsis>[a,b,sig]=reglin(x,y)</synopsis>
-    </refsynopsisdiv>
-    <refsection>
-        <title>Description</title>
-        <para>
-            solve the regression problem y=a*x+ b in the least square sense.
-            <literal>sig</literal> is the standard deviation of the residual. <literal>x</literal> and <literal>y</literal>
-            are two matrices of size <literal>x(p,n)</literal> and <literal>y(q,n)</literal>, where  <literal>n</literal>
-            is the number of samples.
-        </para>
-        <para>
-            The estimator <literal>a</literal> is a matrix of size <literal>(q,p)</literal> and <literal>b</literal> is a
-            vector of size <literal>(q,1)</literal>
-        </para>
-    </refsection>
-    <refsection>
-        <title>Examples</title>
-        <programlisting role="example"><![CDATA[
-// simulation of data for a(3,5) and b(3,1)
-x=rand(5,100);
-aa=testmatrix('magi',5);aa=aa(1:3,:);
-bb=[9;10;11]
-y=aa*x +bb*ones(1,100)+ 0.1*rand(3,100);
+<refnamediv>
+    <refname>reglin</refname>
+    <refpurpose>Linear regression</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+    <title>Calling Sequence</title>
+    <synopsis>[a,b,sig]=reglin(x,y)</synopsis>
+</refsynopsisdiv>
+<refsection>
+    <title>Arguments</title>
+    <variablelist>
+        <varlistentry>
+            <term>x, y, a, b, sig</term>
+            <listitem>
+                <para>numerical vectors or matrices.</para>
+            </listitem>
+        </varlistentry>
+    </variablelist>
+</refsection>
+<refsection>
+    <title>Description</title>
+    <para>
+        Solve the regression problem y=a*x+b in the least square sense.
+        <literal>sig</literal> is the standard deviation of the residual. <literal>x</literal> and <literal>y</literal>
+        are two matrices of size <literal>x(p,n)</literal> and <literal>y(q,n)</literal>, where <literal>n</literal>
+        is the number of samples.
+    </para>
+    <para>
+        The estimator <literal>a</literal> is a matrix of size <literal>(q,p)</literal> and <literal>b</literal> is a
+        vector of size <literal>(q,1)</literal>.
+    </para>
+    <para>
+        If <literal>x</literal> or <literal>y</literal> contains NaNs, use <link linkend="nanreglin">nanreglin</link>.
+    </para>
+</refsection>
+<refsection>
+    <title>Examples</title>
+    <programlisting role="example"><![CDATA[
+// Simulation of data for a(3, 5) and b(3, 1)
+x  = rand(5, 100);
+aa = testmatrix("magi", 5); aa = aa(1:3, :);
+bb = [9; 10; 11];
+y  = aa*x +bb*ones(1, 100)+ 0.1*rand(3, 100);
 
-// identification
-[a,b,sig]=reglin(x,y);
+// Identification
+[a, b, sig] = reglin(x, y);
 max(abs(aa-a))
 max(abs(bb-b))
 
-// an other example : fitting a polynomial
-f=1:100; x=[f.*f; f];
-y= [ 2,3]*x+ 10*ones(f) + 0.1*rand(f);
-[a,b]=reglin(x,y)
+// Another example: fitting a polynomial
+f = 1:100; x = [f.*f; f];
+y = [2 3]*x + 10*ones(f) + 0.1*rand(f);
+[a, b] = reglin(x, y)
  ]]></programlisting>
-    </refsection>
-    <refsection role="see also">
-        <title>See Also</title>
-        <simplelist type="inline">
-            <member>
-                <link linkend="pinv">pinv</link>
-            </member>
-            <member>
-                <link linkend="leastsq">leastsq</link>
-            </member>
-            <member>
-                <link linkend="qr">qr</link>
-            </member>
-        </simplelist>
-    </refsection>
+    <para>
+        Graphical example:
+    </para>
+    <programlisting role="example"><![CDATA[
+// Generating an odd function (symmetric with respect to the origin)
+x = -30:30;
+y = x.^3;
+
+// Extracting the least square mean of that function and displaying
+[a, b] = reglin(x, y);
+plot(x, y, "red")
+plot(x, a*x+b)
+ ]]></programlisting>
+    <scilab:image>
+        x = -30:30;
+        y = x.^3;
+        [a, b] = reglin(x, y);
+        plot(x, y, "red")
+        plot(x, a*x+b)
+    </scilab:image>
+</refsection>
+<refsection role="see also">
+    <title>See Also</title>
+    <simplelist type="inline">
+        <member>
+            <link linkend="nanreglin">nanreglin</link>
+        </member>
+        <member>
+            <link linkend="pinv">pinv</link>
+        </member>
+        <member>
+            <link linkend="leastsq">leastsq</link>
+        </member>
+        <member>
+            <link linkend="qr">qr</link>
+        </member>
+    </simplelist>
+</refsection>
 </refentry>
diff --git a/scilab/modules/statistics/help/fr_FR/data_missing_values/nanreglin.xml b/scilab/modules/statistics/help/fr_FR/data_missing_values/nanreglin.xml
new file mode 100644 (file)
index 0000000..893241e
--- /dev/null
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr_FR" xml:id="nanreglin">
+<refnamediv>
+    <refname>nanreglin</refname>
+    <refpurpose>Régréssion linéaire</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+    <title>Séquence d'appel</title>
+    <synopsis>[a,b]=nanreglin(x,y)</synopsis>
+</refsynopsisdiv>
+<refsection>
+    <title>Paramètres</title>
+    <variablelist>
+        <varlistentry>
+            <term>x, y, a, b</term>
+            <listitem>
+                <para>Vecteurs or Matrices numériques.</para>
+            </listitem>
+        </varlistentry>
+    </variablelist>
+</refsection>
+<refsection>
+    <title>Description</title>
+    <para>
+        Résout le problème de régréssion <literal>y=a*x+b</literal> au sens des moindres carrés.
+        <literal>x</literal> et <literal>y</literal> sont deux matrices de taille
+        <literal>x(p,n)</literal> et <literal>y(q,n)</literal>, où <literal>n</literal>
+        est le nombre d'échantillons.
+    </para>
+    <para>
+        L'estimateur <literal>a</literal> est une matrice de taille <literal>(q,p)</literal> et <literal>b</literal> est un
+        vecteur de taille <literal>(q,1)</literal>.
+    </para>
+    <para>
+        Chaque ligne de <literal>y</literal> est traitée comme un problème indépendant, si <literal>x</literal>
+        ou <literal>y</literal> contient un NaN (<literal>x(i,j) = %nan</literal> ou <literal>y(i,j) = %nan</literal>),
+        alors <literal>x(:,j)</literal> et <literal>y(i,j)</literal> sont ignorés,
+        comme si le point [x(:,j); y(i,j)] n'existait pas.
+        <para>
+        </para>
+    </para>
+</refsection>
+<refsection>
+    <title>Exemples</title>
+    <para>
+        Exemple graphique #1 :
+    </para>
+    <programlisting role="example"><![CDATA[
+// Dans l'exemple suivant, les deux problèmes représentent deux lignes droites :
+// l'une va de (0,0) à (10,10) et l'autre va de (0,20) à (10,30).
+// reglin et nanreglin trouvent les mêmes valeurs parce-que tous les points sont alignés et les NaN ont été ignorés.
+subplot(211)
+x = 0:10;
+y = 20:30;
+[a1, b1] = reglin(x, [x ; y]);
+plot(x', (a1*x+repmat(b1,1,11))', "red")
+
+subplot(212)
+y2 = y;
+y2(2:10) = %nan; // Leaving y2(1) and y2(11) unchanged.
+[a2, b2] = nanreglin(x, [x ; y2])
+plot(x', (a2*x+repmat(b2,1,11))', "blue")
+ ]]></programlisting>
+    <scilab:image>
+        subplot(211)
+        x = 0:10;
+        y = 20:30;
+        [a1, b1] = reglin(x, [x ; y]);
+        plot(x', (a1*x+repmat(b1,1,11))', "red")
+        subplot(212)
+        y2 = y;
+        y2(2:10) = %nan;
+        [a2, b2] = nanreglin(x, [x ; y2])
+        plot(x', (a2*x+repmat(b2,1,11))', "blue")
+    </scilab:image>
+    <para>
+        Exemple graphique #2 :
+    </para>
+    <programlisting role="example"><![CDATA[
+// Maintenant les deux problèmes représentent une ligne droite (reglin(x, x)) de (0,0) à (2,2),
+// mais alors que le deuxième argument du premier problème (reglin(x, y)) représente
+// une droite plate (d'équation y = 1), le second argument du deuxième problème
+// (reglin(x, y2)) ignore le point central de y (mis à %nan) donc la droite est maintenant
+// d'équation y = 0, parce-que les deux points restants sont (0,0) et (2,0).
+subplot(211)
+x = 0:2;
+y = [0 3 0];
+[a1, b1] = reglin(x, [x ; y]);
+plot(x', (a1*x+repmat(b1,1,3))', "red")
+
+subplot(212)
+y2 = y;
+y2(2) = %nan; // y2 = [0 %nan 0];
+[a2, b2] = nanreglin(x, [x ; y2]);
+plot(x', (a2*x+repmat(b2,1,3))', "blue")
+ ]]></programlisting>
+    <scilab:image>
+        subplot(211)
+        x = 0:2;
+        y = [0 3 0];
+        [a1, b1] = reglin(x, [x ; y]);
+        plot(x', (a1*x+repmat(b1,1,3))', "red")
+        subplot(212)
+        y2 = y;
+        y2(2) = %nan; // y2 = [0 %nan 0];
+        [a2, b2] = nanreglin(x, [x ; y2]);
+        plot(x', (a2*x+repmat(b2,1,3))', "blue")
+    </scilab:image>
+</refsection>
+<refsection role="see also">
+    <title>Voir aussi</title>
+    <simplelist type="inline">
+        <member>
+            <link linkend="reglin">reglin</link>
+        </member>
+        <member>
+            <link linkend="pinv">pinv</link>
+        </member>
+        <member>
+            <link linkend="leastsq">leastsq</link>
+        </member>
+        <member>
+            <link linkend="qr">qr</link>
+        </member>
+    </simplelist>
+</refsection>
+<refsection>
+    <title>Historique</title>
+    <revhistory>
+        <revision>
+            <revnumber>5.5.0</revnumber>
+            <revdescription>Introduction</revdescription>
+        </revision>
+    </revhistory>
+</refsection>
+</refentry>
diff --git a/scilab/modules/statistics/help/fr_FR/reglin.xml b/scilab/modules/statistics/help/fr_FR/reglin.xml
new file mode 100644 (file)
index 0000000..cc3e03e
--- /dev/null
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ * Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+ *
+ * This file must be used under the terms of the CeCILL.
+ * This source file is licensed as described in the file COPYING, which
+ * you should have received as part of this distribution.  The terms
+ * are also available at
+ * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+ *
+ -->
+<refentry xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svg="http://www.w3.org/2000/svg" xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:db="http://docbook.org/ns/docbook" xmlns:scilab="http://www.scilab.org" xml:lang="fr_FR" xml:id="reglin">
+<refnamediv>
+    <refname>reglin</refname>
+    <refpurpose>Régréssion linéaire</refpurpose>
+</refnamediv>
+<refsynopsisdiv>
+    <title>Séquence d'appel</title>
+    <synopsis>[a,b,sig]=reglin(x,y)</synopsis>
+</refsynopsisdiv>
+<refsection>
+    <title>Paramètres</title>
+    <variablelist>
+        <varlistentry>
+            <term>x, y, a, b, sig</term>
+            <listitem>
+                <para>Vecteurs or Matrices numériques.</para>
+            </listitem>
+        </varlistentry>
+    </variablelist>
+</refsection>
+<refsection>
+    <title>Description</title>
+    <para>
+        Résout le problème de régréssion <literal>y=a*x+b</literal> au sens des moindres carrés.
+        <literal>sig</literal> est l'écart-type du résidu. <literal>x</literal> et <literal>y</literal>
+        sont deux matrices de taille <literal>x(p,n)</literal> et <literal>y(q,n)</literal>, où <literal>n</literal>
+        est le nombre d'échantillons.
+    </para>
+    <para>
+        L'estimateur <literal>a</literal> est une matrice de taille <literal>(q,p)</literal> et <literal>b</literal> est un
+        vecteur de taille <literal>(q,1)</literal>.
+    </para>
+    <para>
+        Si <literal>x</literal> ou <literal>y</literal> contient des NaN, utilisez <link linkend="nanreglin">nanreglin</link>.
+    </para>
+</refsection>
+<refsection>
+    <title>Exemples</title>
+    <programlisting role="example"><![CDATA[
+// Simulation de données pour a(3, 5) et b(3, 1)
+x  = rand(5, 100);
+aa = testmatrix("magi", 5); aa = aa(1:3, :);
+bb = [9; 10; 11];
+y  = aa*x +bb*ones(1, 100)+ 0.1*rand(3, 100);
+
+// Identification
+[a, b, sig] = reglin(x, y);
+max(abs(aa-a))
+max(abs(bb-b))
+
+// Autre exemple : adaptation d'un polynôme
+f = 1:100; x = [f.*f; f];
+y = [2 3]*x + 10*ones(f) + 0.1*rand(f);
+[a, b] = reglin(x, y)
+ ]]></programlisting>
+    <para>
+        Exemple graphique :
+    </para>
+    <programlisting role="example"><![CDATA[
+// Génération d'une fonction impaire (symétrique à l'origine)
+x = -30:30;
+y = x.^3;
+
+// Extraction de la moyenne des moindres carrés de cette fonction et affichage
+[a, b] = reglin(x, y);
+plot(x, y, "red")
+plot(x, a*x+b)
+ ]]></programlisting>
+    <scilab:image>
+        x = -30:30;
+        y = x.^3;
+        [a, b] = reglin(x, y);
+        plot(x, y, "red")
+        plot(x, a*x+b)
+    </scilab:image>
+    <para>
+        Exemple avec un NaN :
+    </para>
+    <programlisting role="example"><![CDATA[
+// Mêmes valeurs que dans l'exemple précédent, mais avec un NaN
+x = -30:30;
+y = x.^3;
+y(10) = %nan;
+
+// Extraction de la moyenne des moindres carrés de cette fonction et affichage
+[a, b] = reglin(x, y);
+plot(x, y, "red")
+plot(x, a*x+b)
+// Le point [x(10), y(10)] a été ignoré, résultant en une valeur non-nulle pour b.
+ ]]></programlisting>
+    <scilab:image>
+        x = -30:30;
+        y = x.^3;
+        y(10) = %nan;
+        [a, b] = reglin(x, y);
+        plot(x, y, "red")
+        plot(x, a*x+b)
+    </scilab:image>
+</refsection>
+<refsection role="see also">
+    <title>Vori aussi</title>
+    <simplelist type="inline">
+        <member>
+            <link linkend="nanreglin">nanreglin</link>
+        </member>
+        <member>
+            <link linkend="pinv">pinv</link>
+        </member>
+        <member>
+            <link linkend="leastsq">leastsq</link>
+        </member>
+        <member>
+            <link linkend="qr">qr</link>
+        </member>
+    </simplelist>
+</refsection>
+</refentry>
diff --git a/scilab/modules/statistics/macros/nanreglin.sci b/scilab/modules/statistics/macros/nanreglin.sci
new file mode 100644 (file)
index 0000000..f809283
--- /dev/null
@@ -0,0 +1,49 @@
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution.  The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+
+function [a, b] = nanreglin(x, y, dflag)
+    // Solves a linear regression
+    // y=a(p,q)*x+b(p,1) + epsilon  where y or x contain NaNs.
+    // x : matrix (q,n) and y matrix (p,n)
+    // dflag is optional if 1 a display of the result is done
+    //!
+
+    [lhs, rhs] = argn(0);
+    if rhs < 2 then
+        error(msprintf(_("%s: Wrong number of input arguments: %d to %d expected.\n"),"nanreglin",2,3))
+    end
+    if rhs <= 2 then
+        dflag = 0;
+    end
+    [n1, n2] = size(x);
+    [p1, p2] = size(y);
+    if n2 <> p2 then
+        error(msprintf(_("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),"nanreglin",1,2));
+    end
+    if ~(or(isnan(x)) | or(isnan(y))) then
+        error(msprintf(_("%s: No NaNs detected, please use %s() instead.\n"), "nanreglin", "reglin"))
+    end
+
+    a = zeros(p1, n1);
+    b = zeros(p1, 1);
+    for i=1:p1
+        // A column of x defines an element of y, but each line of y defines an independent problem.
+        // If x2(:, j) or y2(i, j) contains a %nan, then both x2(:, j) and y2(j) are removed.
+        y2 = y(i, find(~isnan(y(i,:))));
+        x2 = x(:, find(~isnan(y(i,:))));
+        nanX = isnan(x);
+        if or(isnan(x)) then // At least one NaN is x or y.
+            columns = floor((find(nanX==%t)-1)./(n1+1)+1);
+            x2(:, columns) = [];
+            y2(1, columns) = [];
+        end
+        [a(i, :), b(i)] = reglin(x2, y2, dflag);
+    end
+
+endfunction
index 2140fe7..203240a 100644 (file)
@@ -25,10 +25,13 @@ function [a,b,sig]=reglin(x,y,dflag)
     if n2<>p2 then
         error(msprintf(gettext("%s: Incompatible input arguments #%d and #%d: Same column dimensions expected.\n"),"reglin",1,2));
     end;
+    if or(isnan(x)) | or(isnan(y)) then
+        error(msprintf(_("%s: NaNs detected, please use %s() instead.\n"), "reglin", "nanreglin"))
+    end
 
     xmoy=sum(x,2)/n2
     ymoy=sum(y,2)/n2
-    // We use armax for apropriate orders which will perform
+    // We use armax for appropriate orders which will perform
     // nothing but a least square
     // We could directly call pinv or \
     [arc,la,lb,sig]=armax(0,0,y-ymoy*ones(1,n2),x-xmoy*ones(1,n2),0,dflag);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_13208.dia.ref b/scilab/modules/statistics/tests/nonreg_tests/bug_13208.dia.ref
new file mode 100644 (file)
index 0000000..e37b2fb
--- /dev/null
@@ -0,0 +1,49 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13208 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13208
+//
+// <-- Short Description -->
+// reglin returned NaNs when y contained NaNs.
+// =============================================================================
+// In the following case, we can graphically see that a1 and b1 sould be equal
+// to a2 and b2, because both problems represent two straight lines:
+// one goes from from (0,0) to (10,10) and the other one goes from (0,20) to (10,30).
+x = 0:10;
+y = 20:30;
+[a1, b1] = reglin(x, [x ; y]);
+y(2:10) = %nan; // Leaving y(1) and y(11) unchanged.
+[a2, b2] = nanreglin(x, [x ; y]);
+assert_checkequal([a1 b1], [a2 b2]);
+// Now both problems represent one straight line (reglin(x, x)) from (0,0) to (2,2),
+// but while the second argument of the first problem (reglin(x, y)) represents
+// a flat line (with equation y = 1), the second argument of the second problem
+// (reglin(x, y2)) ignores the central point of y (set to %nan) so the flat line
+// now has equation y = 0, because the two remaining points are (0,0) and (2,0).
+x = 0:2;
+y = [0 3 0];
+[a, b] = reglin(x, [x ; y]);
+assert_checkequal(a, [1 ; 0]);
+assert_checkequal(b, [0 ; 1]);
+y2 = y;
+y2(2) = %nan; // y2 = [0 %nan 0];
+[a, b] = nanreglin(x, [x ; y2]);
+assert_checkequal(a, [1 ; 0]);
+assert_checkequal(b, [0 ; 0]);
+// Error checks
+x = 1:3;
+y = 1:3;
+refMsg = msprintf(_("%s: No NaNs detected, please use %s() instead.\n"), "nanreglin", "reglin");
+assert_checkerror("[a, b] = nanreglin(x, [x ; y])", refMsg);
+y = [1 %nan 3];
+refMsg = msprintf(_("%s: NaNs detected, please use %s() instead.\n"), "reglin", "nanreglin");
+assert_checkerror("[a, b, sig] = reglin(x, [x ; y])", refMsg);
diff --git a/scilab/modules/statistics/tests/nonreg_tests/bug_13208.tst b/scilab/modules/statistics/tests/nonreg_tests/bug_13208.tst
new file mode 100644 (file)
index 0000000..47fbc2c
--- /dev/null
@@ -0,0 +1,58 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13208 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=13208
+//
+// <-- Short Description -->
+// reglin returned NaNs when y contained NaNs.
+// =============================================================================
+
+// In the following case, we can graphically see that a1 and b1 sould be equal
+// to a2 and b2, because both problems represent two straight lines:
+// one goes from from (0,0) to (10,10) and the other one goes from (0,20) to (10,30).
+x = 0:10;
+y = 20:30;
+[a1, b1] = reglin(x, [x ; y]);
+
+y(2:10) = %nan; // Leaving y(1) and y(11) unchanged.
+[a2, b2] = nanreglin(x, [x ; y]);
+assert_checkequal([a1 b1], [a2 b2]);
+
+
+// Now both problems represent one straight line (reglin(x, x)) from (0,0) to (2,2),
+// but while the second argument of the first problem (reglin(x, y)) represents
+// a flat line (with equation y = 1), the second argument of the second problem
+// (reglin(x, y2)) ignores the central point of y (set to %nan) so the flat line
+// now has equation y = 0, because the two remaining points are (0,0) and (2,0).
+x = 0:2;
+y = [0 3 0];
+[a, b] = reglin(x, [x ; y]);
+assert_checkequal(a, [1 ; 0]);
+assert_checkequal(b, [0 ; 1]);
+
+y2 = y;
+y2(2) = %nan; // y2 = [0 %nan 0];
+[a, b] = nanreglin(x, [x ; y2]);
+assert_checkequal(a, [1 ; 0]);
+assert_checkequal(b, [0 ; 0]);
+
+
+// Error checks
+x = 1:3;
+y = 1:3;
+refMsg = msprintf(_("%s: No NaNs detected, please use %s() instead.\n"), "nanreglin", "reglin");
+assert_checkerror("[a, b] = nanreglin(x, [x ; y])", refMsg);
+
+y = [1 %nan 3];
+refMsg = msprintf(_("%s: NaNs detected, please use %s() instead.\n"), "reglin", "nanreglin");
+assert_checkerror("[a, b, sig] = reglin(x, [x ; y])", refMsg);
+