Hi.
The description of na.contiguous says:
"Find the longest consecutive stretch of non-missing values in a
time series object. (In the event of a tie, the first such
stretch.)"
But this seems not to be the case if one of the tied longest stretches is at
the start of the sequence/series. In the following example, there are three
stretches of length 3, so I expect the result to be [1 2 3]. But:
> x <- c(1:3, NA, NA, 6:8, NA, 10:12)
> x
[1] 1 2 3 NA NA 6 7 8 NA 10 11 12
> na.contiguous(x)
[1] 6 7 8
## expected: [1] 1 2 3
(I have stripped attributes from the output for clarity.)
Below is the beginning of stats:::na.contiguous.default.
The source of the issue appears to be the line containing the assignment to
'seg' (marked with exclamation marks).
The calculation leading to it does
cumsum(!good)
where !good in this case is
[1] FALSE FALSE FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE
And its cumsum is:
[1] 0 0 0 1 2 2 2 2 3 3 3 3
Then the assignment to 'seg' below picks the first longest stretch and
subtracts 1, since the cumsum at indices corresponding to FALSE stays constant
but the length of the constant stretch is one more then the number of FALSEs,
... except for the stretch at the start of the series which is not preceded by
TRUE! So it is missed.
One way to patch this could be by the two commented assignments added by me to
the code below to prepend a 0 to tt and then drop the first element of 'keep'
to allow correct indexing later.
Georgi Boshnakov
> stats:::na.contiguous.default
function (object, ...)
{
tm <- time(object)
xfreq <- frequency(object)
if (is.matrix(object))
good <- apply(!is.na(object), 1L, all)
else good <- !is.na(object)
if (!sum(good))
stop("all times contain an NA")
tt <- cumsum(!good)
## tt <- c(0, tt)
ln <- sapply(0:max(tt), function(i) sum(tt == i))
seg <- (seq_along(ln)[ln == max(ln)])[1L] - 1 ## !!!
keep <- (tt == seg)
## keep <- keep[-1]
st <- min(which(keep))
[[alternative HTML version deleted]]
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel