timesift
0.3.1Learn Predictive Representations of Time-Varying Data
Overview
Fits and compares representations of time-varying data against a prediction target. Given a table of targets and a table of time-stamped series belonging to them, it builds each candidate representation, from the record unreduced through a calendar grain such as a week or a month to a lookback anchored on each target, fits the requested learners on each, scores every candidate on one set of held-out folds, and stacks the out-of-fold predictions into an ensemble. Calendar-aware binning keeps a bin a real week or month rather than a fixed block of hours. Learners, response heads and metrics are registered rather than hard-coded, so adding one is a registration and not a fork of the fitting code. The penalised baseline is an elastic net fitted by cyclic coordinate descent along a warm-started path, following Friedman, Hastie and Tibshirani (2010) doi:10.18637/jss.v033.i01. The shipped default is presence-absence with a joint multi-label head scored by the true skill statistic of Allouche, Tsoar and Kadmon (2006) doi:10.1111/j.1365-2664.2006.01214.x, the setting used for species distribution modelling from microclimate loggers.
New
calendar_channels()gainscycles."day"addsday_sinandday_cos, the place of each bin's midpoint in the UTC day, beside or instead of the year's pair, in the order named. It is read in UTC for the reason the year is: a zone's offset and a site's longitude are the same shift for every bin, where a clock's summer time would move the phase by an hour twice a year. It is refused on bins a day or more apart, where every bin would sit at one place in the day. One definition in the shared core serves both languages, and the fixtures pin it as they pin the year's.
Fixed
- The encoders read the channels of
calendar_channels()at their own amplitude, where they used to standardise them like a reading. The channels lie on the unit circle already, and being identical across units they reach a network as a bias, whose step under AdamW grows with the scale of the input carrying it; standardising multiplied them by 1.41. At the hourly rung they are four of the fully connected encoder's five channels, and on the Schrankogel record they cost it 0.044 TSS against the study, which fed them unscaled.calendar_channels()records its channels in apositionattribute (a field in Python), andbind_channels()carriespositionandstaticfrom every argument; R's used to dropstaticand Python's to keep the first argument's alone (#81).
Show all changes in 0.3.1Hide the rest of the changes in 0.3.1
plot()of aselect_grain()result drew empty axes. The inner scores were matched to their candidates on a label joined by a space where the candidates' was joined by a bar, so every line and every circle was placed at no position. One helper now writes the label wherever a selection's tables are matched, the bottom margin is sized to the longest candidate name, and the table returned says where each score was drawn and which one its fold selected (#79).occlusion()withsubstitute = "permute"permuted each channel of a held-back bin separately, so a unit could be shown the coldest day of one unit beside the warmest day of another, a reading no unit made. A bin is now held back whole, by one permutation per draw. A channel that is the same for every unit, as the calendar channels are, is left in place when a bin is held back;unit_meanused to replace it too, which took the bin's place in the year away along with its reading (#79).- The Python
occlusion()scored every cell, including the ones the scorable-cell mask leaves out, so its weights could rest on cells R's did not. It now reads the mask as every score does (#79). grain_contrasts()read each grain's name back out of the contrast label emmeans writes, which puts parentheses around a level holding a character it treats as an operator: a grain calledmonth-meancame back as(month-mean). The name is now taken from the factor's levels (#79).grain_contrasts()stopped with "undefined columns selected" on a ladder of more than 3000 scored cells, which the Schrankogel grid is at 7070 per architecture: emmeans stops computing Satterthwaite's degrees of freedom past that size and names its interval columns differently. The limit is now the ladder's own size (#79).- Recovery tests for
grain_contrasts(): a planted effect per grain is recovered and its intervals cover it at their stated rate over twenty seeds, and with no effect the contrast finds none (#79).
The reproduction
inst/reproduce/schrankogel.Rcompares the stepwise arm and the network grid with the paper, where it used to write them without a reference (#80). The stepwise arm is fitted unweighted, as the study's forward selection was, under a head that differs from the shipped one in that alone. The eleven-member ensemble is the study's: each member at its own window, channels, kernel, dropout and seed, where the driver used to run one generic set at every window. The hourly rung reads the five channels the study's hourly networks read. The grain contrast is read in AUC against the window the study took as each architecture's best, as its table is.
From NEWS.md in the release
Install
Health
ERRORwhether package can be installedr-devel-linux-x86_64-fedora-clang
Installation failed. See ‘/data/localhost/ripley/R/packages/tests-clang/timesift.Rcheck/00install.out’ for details.
- ERROR12 OK, 1 ERRORNow
- ERROR10 OK, 1 ERROR2026-10-08
- OK5 OK2026-10-03
Documentation
The repository also keeps web-only articles.
- Help pages
- 53 (3 internal)includes a package overview page
- Examples that run
- 98%45 run in a plain check · 1 only when donttest examples are enabled (R CMD check --as-cran)
- Exported functions with examples
- 96%
- Documented parameters
- 98%
- Return-value docs
- 98%
- Help pages citing references
- 4%
Downloads
Repository
- PRs merged (all time)
- not measured
- Median days to close, 50 most recently updated closed issues
- 0
- Median days to close, 50 most recently updated closed PRs
- not measured
Releases over time
Commits over time
8 development-tooling and community-health practices detected across 6 families in the upstream repository
Checks run against github.com/gcol33/timesift on 2026-10-11.
The R CMD check workflow runs on Linux, macOS and Windows, and on R-devel
Show all practicesHide 2 practices
This repository shows signs of AI coding tools.
- Claude Codefirst seen 2026-09-02Seen in the repository: CLAUDE.mdNamed in .Rbuildignore: CLAUDE.mdCommits: 2 by its own account · at least 202 crediting it in the message
- Claude Opus 598 commits · Sep 2026
- Claude Fable 5.116 commits · Sep 2026
- Claude Sonnet 51 commit · Sep 2026
Some of these counts are a minimum, because the search stopped before the oldest commits.
Dependencies
Installing timesift adds 8 packages (5 with compiled code, 3.1 MB of source tarballs). Heaviest: vctrs 1.0 MB, rlang 766 KB, cli 629 KB.
Code & Tests
People & History
- 0.3.1Latest2026-10-02 · current release
- RR 4.6.0 released · 2026-04-24
Package metadata
- First published
- 2026-10-02
- Total releases
- 1 / 1 yrs
- License
- MIT + file LICENSE OSI
- Minimum R
- ≥ 4.1
- Download size
- 804 KB
Cite
Cite this package
Run in R for the authors' entry:
citation("timesift")The package provides a citation file, so citation() returns the authors' own entry.
Cite the R Observatory
For a number measured here: a download total, a coverage figure, an archival date.
From data release v2026-10-17, which the citation names so these numbers can be found later. More on citing and the projects behind them.