?PhysioCore now answers: a package help page gives one paragraph on what the
package is for, the main entry points grouped by task, and where to go next.R CMD check.@examples added or corrected across 2 help pages. Each runs
offline in seconds, writes nothing outside tempdir(), and is executed by
R CMD check; anything needing a device, a download or an optional backend is
fenced with the reason stated.PhysioCore:: on
both MultiPhysioExperiment and MultiRatePhysioExperiment. The shim had no
test for the one thing it exists to do.The data model implemented here moved to the PhysioExperiment package,
which is now the foundation of the ecosystem rather than an umbrella
meta-package. This package re-exports that public interface unchanged -- 148
functions, 9 S4 classes and 7 methods, generated from the foundation's
NAMESPACE so the two cannot drift.
Existing code keeps working: library(PhysioCore), PhysioCore::fn(), and
S4 objects saved when the classes were defined here all continue to load,
validate and dispatch. The re-export of the class definitions is what keeps
those saved objects readable.
New code should depend on PhysioExperiment directly.
aggregatePhysioFeatures() summarizes keyed scalar features through trials,
sessions, subjects and cohorts. Default means weight immediate children
equally at each level, so a subject contributing more trials does not
dominate the group mean -- on a deliberately unbalanced example the staged
mean is 17.5 where pooling every observation at once gives 14. Explicit
strata (side, condition, channel), missing-value counts, the intermediate
per-level summaries and links back to the original observations accompany
the output.
Subsetting a PhysioExperiment with [ now records the operation in the
object's provenance: an activity "subset" carrying the supplied row and
column indices, which axes were left unspecified, drop, and the input and
output dimensions. Subsetting was previously the one structural operation
that left no trace, so a derived object could not be related back to its
parent.
A zero-row (or zero-column) selection now retains the annotation columns
of the dropped axis, instead of returning a rowData/colData stripped of
its columns. Empty selections therefore keep the same schema as non-empty
ones.
The provenance JSON serializer escaped only double quotes. Control
characters (tab, newline, and anything below U+0020) were emitted raw,
producing invalid JSON, and a missing character value was written as the
string "NA". Control characters are now escaped as \uXXXX, backslashes
are escaped, and NA is written as null.
Numeric provenance parameters were serialized with R's default seven significant digits, so a recorded value did not round-trip: 0.1234567890123 came back as 0.1234568. They are now written with 17 significant digits, which is lossless for a double.
Generic statistical methods relocated here as their single source of truth (previously in PhysioMoCap), so the whole ecosystem can share them and the statistics layer (PhysioAnalysis) can surface them:
fPCA(), reconstructFPCA(), registerCurves() (the ggplot2
visualiser plotFPCA() stays in PhysioMoCap).waveformCMC(), waveformICC(), waveformReliability().circularSummary(), rayleighTest(),
watsonWilliamsTest(), circularLinearCorrelation().PhysioMoCap re-exports all of these for back-compatibility, so existing
PhysioMoCap::fPCA() etc. calls are unchanged.
PhysioCohort class: the multi-subject / study container above
PhysioLongitudinal. It holds many participants (each a PhysioLongitudinal
timeline; bare PhysioExperiment/MultiRatePhysioExperiment subjects are
auto-wrapped into a single-session timeline) alongside a subject-level
colData table (id, group/arm, diagnosis, ...). This is the cohort / RCT-arm
spine a rehabilitation study needs — previously the ecosystem could represent a
single subject's sessions but had no multi-subject container.
PhysioCohort(); accessors subjects(), subject(),
cohortData(), subjectIds(), nSubjects(), groups(); addSubject(),
subsetCohort() (by group or predicate), [, length, show, and an
aggregated provenance() method.cohortDesign() flattens the whole cohort into a tidy subjects×sessions
table (subject_id + colData + session_id/visit_label/days_from_baseline) —
the iteration unit for pipelines, longitudinal models and trial analyses.appendProvenance()
and companions). No user-facing API changes.AnalysisResult estimate,
uncertainty, estimand, and provenance accessors and for append-only
PhysioExperiment provenance round trips.Initial release as the foundation package of the Physio ecosystem, split out from the former PhysioExperiment monolith. PhysioCore provides the shared data model, metadata management, and cross-package infrastructure that the domain packages (PhysioIO, PhysioEEG, PhysioECG, PhysioMoCap, ...) build on.
PhysioExperiment() class, a SummarizedExperiment extension that
stores multi-modal physiological signals (2D time x channel or 3D
time x channel x trial arrays) alongside a validated samplingRate slot.samplingRate(), defaultAssay(), timeIndex(), and
duration() for reading acquisition metadata and deriving a time axis.show(), length(), dim(), [, summary(), and
as.data.frame(), including per-channel summary statistics (min, max, mean,
sd, median) and a long-format data export.cbindPhysio() and rbindPhysio() to combine objects along the channel
and time axes, extractWindow() to subset by time in seconds, and
timeToSamples() / samplesToTime() for index conversion.colData: channelInfo(),
channelNames(), nChannels(), setChannelTypes(), setChannelUnits(),
getChannelsByType(), pickChannels(), dropChannels(), and
renameChannels().setReference() /
getReference(), setElectrodePositions() / getElectrodePositions(), and
applyMontage().PhysioEvents() class plus getEvents(), setEvents(),
addEvents(), removeEvents(), and nEvents() for managing triggers,
markers, and annotations.EventQuery) via eventQuery(),
filterType(), filterValue(), and resolveQuery(), with cached resolution.logStep(),
withProvenance(), appendProvenance(), and the provenance() accessor
record timestamped, user-attributed analysis steps that deserialize cleanly
on objects created before provenance existed.AnalysisResult() and PhysioBiomarker() S4 containers so every
ecosystem analysis returns a uniformly shaped object, with resultType(),
resultValue(), and biomarkerValue() accessors.cohensD(),
etaSquared()), reliability and measurement error (icc(), sem(),
mdc()), and method agreement (blandAltman()).NormativeReference() class with a stratified z-score engine
(zScore()) and percentPredicted() for turning observed values into
standardized scores against published, stratified reference sets.registerReader(), registerWriter(),
registerOperation(), plus matching get*(), available*(), and
unregister*() verbs. The registry survives namespace reloads.checkNA(), handleNA(), fillEdgeNA(),
hasNA(), naSummary(), and replaceNA(), supporting interpolation,
omission, LOCF, mean, and zero-fill strategies.physioPalette(),
theme_physio(), and scale_color_physio() / scale_colour_physio() /
scale_fill_physio() for consistent ggplot2 styling across the ecosystem.deprecate_physio() for consistent lifecycle signalling across
packages.