ts.intersect bug?
The problem was that a tolerance in window.default was abs(start)*ts.eps, which is no tolerance at all if start = 0. So the special feature here was that the intersection of the series started at zero. I had already tested and committed a fix. window.default does use a tolerance for en, just as Baz suggests it should. The code is there to be read .... (That tolerance was inadequate if end = 0, but has been changed.)
On Wed, 21 Sep 2005, Barry Rowlingson wrote:
Antonio, Fabio Di Narzo wrote:
Ooops, bad example. Try this instead: a <- ts(runif(6500), start=0, freq=10) b <- lag(a, 1) c <- ts.intersect(a, b) Gives an error from .cbind.ts
or even:
> a=ts(numeric(2600),freq=10,start=0);b=lag(a,1);c=ts.intersect(a,b)
Error in "[<-"(`*tmp*`, , (1 + cs[i]):cs[i + 1], value = c(0, 0, 0, 0, :
number of items to replace is not a multiple of replacement length
seems to be sensitive to the lengths of the time series:
> a=ts(numeric(2601),freq=10,start=0);b=lag(a,1);c=ts.intersect(a,b) > (works fine)
Digging into the code, the window() function is returning a different length time series for each one in these failing cases. I reckon its a floating-point precision situation, where the last time series point should be included but the arithmetic precision of a 2600-long series at separation of 1/10 is leaving it out.
> st;en
[1] 0 [1] 259.8
> a=ts(numeric(2600),freq=10,start=0);b=lag(a,1) > length(window(a,st,en))
[1] 2599
> length(window(b,st,en))
[1] 2598 - ts.intersect is trying to put these two time series together, and so fails. But:
> a=ts(numeric(2601),freq=10,start=0);b=lag(a,1) > length(window(a,st,en))
[1] 2599
> length(window(b,st,en))
[1] 2599 - works. Note that en is not precisely 259.8:
> en == 259.8
[1] FALSE
> en-259.8
[1] -5.684342e-14 I've computed 'en' as the .cbind.ts function does, and its not exactly 259.8. If it were, then it would work... Perhaps .cbind.ts should round to the nearest true time point or something... Note that it fails in plenty of smaller cases too:
> a=ts(numeric(13),freq=10,start=0);b=lag(a,1);c=ts.intersect(a,b)
Error in "[<-"(`*tmp*`, , (1 + cs[i]):cs[i + 1], value = c(0, 0, 0, 0, :
number of items to replace is not a multiple of replacement length
Seems to not like 13s and 10s and integer products thereof (2600,
6500). Are you superstitious?
Baz
PS without counting, how many letters are there in 'superstitious'?
______________________________________________ R-help at stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595