The hdrm package provides inference procedures for
high-dimensional repeated-measures data in one-sample (Pauly et al.,
2015) and multiple-group designs (Sattler, 2021; Sattler & Pauly,
2018).
The current version can be installed with:
if (!requireNamespace("remotes", quietly = TRUE)) {
install.packages("remotes")
}
remotes::install_github(
"Schnieboli/hdrm",
dependencies = TRUE
)Because hdrm contains compiled C++ code, Windows users
installing from source need the Rtools version
corresponding to their version of R.
When using hdrm in a scientific publication, please cite
this article Sattler & Hichert (2025). The citation can also be
obtained directly in R:
citation("hdrm")Both main functions accept either:
value, subject
and dimension, giving the measurements and the subject and
dimension IDs.In the grouped case, a vector specifying which subject belongs to
which group must be passed to group.
Missing values in data (and group) are not
allowed and will result in an error. At least two dimensions are
required. The one-group method requires at least three subjects, while
in the multi-group case, each group must contain at least six complete
subjects.
A one-group test can be performed using hdrm_single().
The functionaccepts either a numeric matrix with dimensions in rows and
subjects incolumns, or a data.frame containing columns
value, subject and dimension.
The package includes two example data sets: birthrates
Statistisches Bundesamt (Destatis) (2024), a wide-format data set
containing birth rates for the 16 German federal states from 1990 to
2023, and EEG Höller et al. (2017), a long-format data set
containing EEG measurements of 160 individuals in 40 dimensions.
data("birthrates")
## transform 'birthrates' to matrix and transpose
birthrates_matrix <- t(as.matrix(birthrates))
## test whether the time profile is flat
hdrm_single(
data = birthrates_matrix,
hypothesis = "flat"
)
## define hypothesis = "flat" via equivalent projection matrix
d <- ncol(birthrates_matrix)
flat_projection <- diag(d) -
matrix(1 / d, nrow = d, ncol = d)
## test whether the time profile is flat via custom hypothesis matrix
hdrm_single(
data = birthrates_matrix,
hypothesis = flat_projection
)The included EEG data contain several diagnostic groups.
The following example selects one group for a one-group analysis.
data("EEG")
names(EEG) # already contains columns value, dimension and subject
## select only one diagnostic group for one-group analysis
EEG_single <- EEG[EEG$group == "SCC+", ]
## test whether the time profile is flat
hdrm_single(
data = EEG_single,
hypothesis = "flat"
)
## define hypothesis = "flat" via equivalent projection matrix
d <- nlevels(EEG_single$dimension)
flat_projection <- diag(d) -
matrix(1 / d, nrow = d, ncol = d)
## test whether the time profile is flat via custom hypothesis matrix
hdrm_single(
data = EEG_single,
hypothesis = flat_projection
)hdrm_grouped() covers two different covariance
settings.
| Setting | Main arguments | Interpretation of B |
|---|---|---|
| Heterogeneous covariances with exact available trace estimators | cov.equal = FALSE,
subsampling = FALSE |
Base budget; the joint third-trace estimator uses a * B
joint draws |
| Equal covariances with exact available trace estimators | cov.equal = TRUE, subsampling = FALSE |
Base budget; the pooled third-trace estimators uses
a * B total draws distributed across groups |
| Heterogeneous covariances with additional subsampling | cov.equal = FALSE, subsampling = TRUE |
Base budget; group-specific and pairwise estimators use
B draws per group or pair, while the joint third-trace
estimator uses a * B joint draws |
| Equal covariance matrices | cov.equal = TRUE, subsampling = TRUE |
Base budget; the pooled trace estimators uses a * B
total draws distributed across groups |
In the cov.equal = TRUE case, the a * B
first/second/third-trace draws are allocated across groups approximately
proportionally to the numbers of available two/four/six-subject
subsets.
A third-trace quantity is estimated by subsampling in every grouped
analysis. Consequently, f, tau, and the
p-value depend on B and the random seed even when
subsampling = FALSE. With subsampling = TRUE,
the test statistic itself is seed dependent as well.
Supplying seed makes a call reproducible without
permanently changing the previous R random-number
state.
data("birthrates")
birthrates_matrix <- t(as.matrix(birthrates))
# group states into east and west (Berlin as east)
group <- factor(c(1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 2),
labels = c("west", "east"))
## test for interaction effect of group and time
hdrm_grouped(
data = birthrates_matrix,
hypothesis = "interaction",
group = group,
cov.equal = FALSE,
subsampling = FALSE,
B = "100*N",
seed = 3141
)The equal-covariance method is selected explicitly:
## test for interaction effect of group and time with equal covariance assumption
hdrm_grouped(
data = birthrates_matrix,
hypothesis = "interaction",
group = group,
cov.equal = TRUE,
B = "100*N",
seed = 3141
)If data is a data.frame, it must contain columns
value, subject and dimension.
data("EEG")
names(EEG) # already contains columns 'value', 'subject' and 'dimension'
## test for differences between the diagnostic groups
hdrm_grouped(
data = EEG,
hypothesis = "whole",
group = EEG$group,
cov.equal = FALSE,
subsampling = FALSE,
B = "100*N",
seed = 3141
)For hdrm_grouped(), the predefined hypotheses are:
"whole": no whole-plot or group main effect,"sub": no subplot or dimension main effect,"interaction": no group-by-dimension interaction,"identical": identical expectation vectors across
groups,"flat": a flat expectation profile within every
group.A custom grouped hypothesis is supplied as a named list containing
projection matrices TW and TS:
## custom hypothesis for testing for effect of time
custom_hypothesis <- list(
TW = matrix(1 / 2, nrow = 2, ncol = 2),
TS = diag(34) - matrix(1 / 34, nrow = 34, ncol = 34)
)
## testing for time effect (equivalent to hypothesis = "sub")
hdrm_grouped(
data = birthrates_matrix,
hypothesis = custom_hypothesis,
group = group,
B = "100*N",
seed = 3141
)Upper-tail probabilities are calculated directly. To avoid reporting
an exact numerical zero, p-values smaller than machine precision are
returned as .Machine$double.eps. Such a value should be
interpreted as being no larger than the numerical reporting
threshold.