From m@ech|er @end|ng |rom @t@t@m@th@ethz@ch  Thu Jan  2 21:53:43 2025
From: m@ech|er @end|ng |rom @t@t@m@th@ethz@ch (Martin Maechler)
Date: Thu, 2 Jan 2025 21:53:43 +0100
Subject: [Rd] Possible issue in stats/arima.R package
In-Reply-To: <26486.60482.328642.701605@stat.math.ethz.ch>
References: <CAMUMQUSh5t2sazypdiAeOSJ2MQssNfb89jQJvvBwRbA1PwAqeA@mail.gmail.com>
 <822e67f1-5900-4355-b231-a09c8691d4ae@gmail.com>
 <e93186db-914d-41cf-b1df-46cbc90af3b6@gmail.com>
 <26486.60482.328642.701605@stat.math.ethz.ch>
Message-ID: <26486.64727.599697.148053@stat.math.ethz.ch>

>>>>> Martin Maechler on Thu, 2 Jan 2025 20:42:58 +0100 writes:
 >>>>> Duncan Murdoch on Thu, 2 Jan 2025 11:28:45 -0500 writes:
    >> On 2025-01-02 11:20 a.m., Duncan Murdoch wrote:
    >>> On 2025-01-02 9:04 a.m., Norbert Kuder wrote:
    >>>> Hello all,
    >>>> 
    >>>> I am running R version 4.4.2 (2024-10-31 ucrt) on Windows 10 x64, and
    >>>> noticed something that might be a minor bug (or at least inconsistent code)
    >>>> in the stats/arima.R package.
    >>>> I have found:
    >>>> 1. A missing stop() call at line 69:
    >>>>  if (length(order) == 3) seasonal <- list(order = seasonal) else
    >>>>    ("\'seasonal\' is of the wrong length")
    >>>> it should be rather:
    >>>> if (length(order) == 3) seasonal <- list(order = seasonal) else
    >>>> stop("\'seasonal\' is of the wrong length")
    >>> 
    >>> I think you're right about this one.

well, actually, the mishap is larger:

Reading the help page for arima,  'seasonal' is documented as

 seasonal: A specification of the seasonal part of the ARIMA model, plus
           the period (which defaults to ?frequency(x)?).  This may be a
           list with components ?order? and ?period?, or just a numeric
           vector of length 3 which specifies the seasonal ?order?.  In
           the latter case the default period is used.

Note the
    or just a numeric vector of length 3 ... the seasonal 'order'
part.
If you look at the larger context of the

   else ("'seasonal...

part, it becomes clear that -- in order to fulfill the above
documented behavior, it's not length(order),
but length(seasonal) which should be 3   which leads to the
following change :

@@ -124,10 +124,11 @@
             if(!is.numeric(seasonal$order) || length(seasonal$order) != 3L
                || any(seasonal$order < 0L))
                 stop("'seasonal$order' must be a non-negative numeric vector of length 3")
-        } else if(is.numeric(order)) {
-            if(length(order) == 3L) seasonal <- list(order=seasonal)
-            else ("'seasonal' is of the wrong length")
-        } else stop("'seasonal' must be a list with component 'order'")
+        } else if(is.numeric(seasonal)) { # meant to be  seasonal$order
+            if(length(seasonal) != 3L || any(seasonal < 0))
+                stop("if not a list, 'seasonal' must be a non-negative numeric vector of length 3")
+            seasonal <- list(order=seasonal)
+        } else stop("'seasonal' must be a list with component 'order' or length-3 vector")
 

... I still plan to commit this, but it may well be that this
change will wake up arima() use that was buggy and never detected
till now.

Martin



[Rd] Possible issue in stats/arima.R package
Martin Maechler