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

Martin Maechler m@ech|er @end|ng |rom @t@t@m@th@ethz@ch
Thu Jan 2 21:53:43 CET 2025


>>>>> 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



More information about the R-devel mailing list