R documentation doesn't state what happens if the supplied 'lag' (or 
'differences') to the default, "POSIXt", "Date", "difftime" or "ts" method of 
'diff' is not a whole number.

S-PLUS 3.4 help on 'diff' has such a statement:
lag:
Non-integer values are rounded to the nearest integer.
differences:
Non-integer values are rounded to the nearest integer.


In R 4.6.0:

> diff(1:10, 1.25)
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In r[i1] - `length<-`(r, max(length(r) - lag, 0L)) :
  longer object length is not a multiple of shorter object length
> diff(1:10, 1.75)
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In r[i1] - `length<-`(r, max(length(r) - lag, 0L)) :
  longer object length is not a multiple of shorter object length

9 in the result is because of recycling. It is because
'i1', which is -seq_len(lag) , is -1 and r[i1] has length 9, and
max(length(r) - lag, 0L) is between 8 and 9 and `length<-`(r, max(length(r) - 
lag, 0L)) has length 8.

In R 4.5.3 (and previous R versions):

> diff(1:10, 1.25)
[1] 1 1 1 1 1 1 1 1 1
> diff(1:10, 1.75)
[1] 1 1 1 1 1 1 1 1 1


"POSIXt", "Date" and "difftime" cases are similar.

In R 4.6.0:

> diff(.POSIXct(1:10), 1.25)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In unclass(time1) - unclass(time2) :
  longer object length is not a multiple of shorter object length
> diff(.POSIXct(1:10), 1.75)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In unclass(time1) - unclass(time2) :
  longer object length is not a multiple of shorter object length
> diff(.Date(1:10), 1.25)
Time differences in days
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In unclass(time1) - unclass(time2) :
  longer object length is not a multiple of shorter object length
> diff(.Date(1:10), 1.75)
Time differences in days
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In unclass(time1) - unclass(time2) :
  longer object length is not a multiple of shorter object length
> diff(.difftime(1:10, "secs"), 1.25)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In r[i1] - `length<-`(r, max(length(r) - lag, 0L)) :
  longer object length is not a multiple of shorter object length
> diff(.difftime(1:10, "secs"), 1.75)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 9
Warning message:
In r[i1] - `length<-`(r, max(length(r) - lag, 0L)) :
  longer object length is not a multiple of shorter object length

In R 4.5.3:

> diff(.POSIXct(1:10), 1.25)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 1
> diff(.POSIXct(1:10), 1.75)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 1
> diff(.Date(1:10), 1.25)
Time differences in days
[1] 1 1 1 1 1 1 1 1 1
> diff(.Date(1:10), 1.75)
Time differences in days
[1] 1 1 1 1 1 1 1 1 1
> diff(.difftime(1:10, "secs"), 1.25)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 1
> diff(.difftime(1:10, "secs"), 1.75)
Time differences in secs
[1] 1 1 1 1 1 1 1 1 1


"ts" case is different.

In R 4.5.3 and 4.6.0:

> diff(ts(1:10), 1.25)
Time Series:
Start = 2
End = 10
Frequency = 1
[1] 1 1 1 1 1 1 1 1 1
Warning message:
In lag.default(r, -lag) : 'k' is not an integer
> diff(ts(1:10), 1.75)
Time Series:
Start = 3
End = 10
Frequency = 1
[1] 2 2 2 2 2 2 2 2
Warning message:
In lag.default(r, -lag) : 'k' is not an integer

In R 4.0.3 (or any versions up to 4.5.2):

> diff(ts(1:10), 1.25)
Error in .cbind.ts(list(e1, e2), c(deparse(substitute(e1))[1L], 
deparse(substitute(e2))[1L]),  :
  not all series have the same phase
> diff(ts(1:10), 1.75)
Error in .cbind.ts(list(e1, e2), c(deparse(substitute(e1))[1L], 
deparse(substitute(e2))[1L]),  :
  not all series have the same phase

It is because, since R 4.5.3, in 'diff.ts', 'lag' is used to replace 'tsLag', 
and 'lag.default' rounds 'k'.

The rounding of 'k' by 'lag.default' in R happens since the beginning, but is 
not documented. S-PLUS 3.4 help on 'lag' 
(https://sites.oxy.edu/lengyel/m150/Sueselbeck/helpfiles/lag.html) has a 
statement:
Non-integer, values of 'k' are rounded to the nearest integer.


How about defining how to treat the supplied 'lag' argument to the default, 
"POSIXt", "Date", "difftime" or "ts" method that is not a whole number? Maybe 
following 'lag.default' that rounds? Maybe having the same treatment in the 
default and "ts" method of 'diffinv'? Also, I think it is good to emit a 
warning for non-integer.


Because of
for (i in seq_len(differences))
or
for (i in 1L:differences)
, 'differences' is implicitly truncated. It hasn't changed.


The early return in 'diff.ts' doesn't consider rounding.

In R 4.5.3 and 4.6.0:

> diff(ts(1:10), 1.25, 7)
Time Series:
Start = 8
End = 10
Frequency = 1
[1] 0 0 0
Warning messages:
1: In lag.default(r, -lag) : 'k' is not an integer
2: In lag.default(r, -lag) : 'k' is not an integer
3: In lag.default(r, -lag) : 'k' is not an integer
4: In lag.default(r, -lag) : 'k' is not an integer
5: In lag.default(r, -lag) : 'k' is not an integer
6: In lag.default(r, -lag) : 'k' is not an integer
7: In lag.default(r, -lag) : 'k' is not an integer
> diff(ts(1:10), 1.25, 8)
integer(0)
> diff(ts(1:10), 1.75, 5)
Error in ts(r, end = xtsp[2L], frequency = xtsp[3L]) :
  'ts' object must have one or more observations
In addition: Warning messages:
1: In lag.default(r, -lag) : 'k' is not an integer
2: In lag.default(r, -lag) : 'k' is not an integer
3: In lag.default(r, -lag) : 'k' is not an integer
4: In lag.default(r, -lag) : 'k' is not an integer
5: In lag.default(r, -lag) : 'k' is not an integer
6: In .cbind.ts(list(e1, e2), c(deparse(substitute(e1))[1L], 
deparse(substitute(e2))[1L]),  :
  non-intersecting series

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to