Flip functional data objects
This function flips an object newObject
of class funData
,
irregFunData
or multiFunData
with respect to a reference object
refObject
of the same class (or of class funData
, if
newObject
is irregular). This is particularly useful when dealing with
functional principal components, as they are only defined up to a sign
change. For details, see below.
flipFuns(refObject, newObject, ...)
refObject |
An object of class |
newObject |
An object of class |
... |
Further parameters passed to |
Functional principal component analysis is an important tool in functional
data analysis. Just as eigenvectors, eigenfunctions (or functional principal
components) are only defined up to a sign change. This may lead to
difficulties in simulation studies or when bootstrapping pointwise confidence
bands, as in these cases one wants the estimates to have the same
"orientation" as the true function (in simulation settings) or the
non-bootstrapped estimate (when calculating bootstrap confidence bands). This
function allows to flip (i.e. multiply by -1) all observations in
newObject
that have a different orientation than their counterparts in
refData
.
Technically, the function compares the distance between newObject
and
refObject
||| f_{new} - f_{ref}|||
and the distance between newObject
and
-1 * refObject
||| f_{new} + f_{ref}|||.
If newObject
is closer to -1 * refObject
, it is
flipped, i.e. multiplied by -1.
An object of the same class as newData
with flipped
observations.
The function is currently implemented only for functional data with one- and two-dimensional domains.
### Univariate argvals <- seq(0,2*pi,0.01) refData <- funData(argvals, rbind(sin(argvals))) # one observation as reference newData <- funData(argvals, outer(sample(c(-1,1), 11, replace = TRUE) * seq(0.75, 1.25, by = 0.05), sin(argvals))) oldpar <- par(no.readonly = TRUE) par(mfrow = c(1,2)) plot(newData, col = "grey", main = "Original data") plot(refData, col = "red", lwd = 2, add = TRUE) plot(flipFuns(refData, newData), col = "grey", main = "Flipped data") plot(refData, col = "red", lwd = 2, add = TRUE) ### Univariate (irregular) ind <- replicate(11, sort(sample(1:length(argvals), sample(5:10,1)))) # sample observation points argvalsIrreg <- lapply(ind, function(i){argvals[i]}) argvalsIrregAll <- unique(sort(unlist(argvalsIrreg))) # one observation as reference (fully observed) refDataFull <- funData(argvals, rbind(sin(argvals))) # one observation as reference (irregularly observed) refDataIrreg <- irregFunData(argvals = list(argvalsIrregAll), X = list(sin(argvalsIrregAll))) newData <- irregFunData(argvals = argvalsIrreg, X = mapply(function(x, a, s){s * a * sin(x)}, x = argvalsIrreg, a = seq(0.75, 1.25, by = 0.05), s = sample(c(-1,1), 11, replace = TRUE))) plot(newData, col = "grey", main = "Original data (regular reference)") plot(refDataFull, col = "red", lwd = 2, add = TRUE) plot(flipFuns(refDataFull, newData), col = "grey", main = "Flipped data") plot(refDataFull, col = "red", lwd = 2, add = TRUE) plot(newData, col = "grey", main = "Original data (irregular reference)") plot(refDataIrreg, col = "red", lwd = 2, add = TRUE) plot(flipFuns(refDataIrreg, newData), col = "grey", main = "Flipped data") plot(refDataIrreg, col = "red", lwd = 2, add = TRUE) ### Multivariate refData <- multiFunData(funData(argvals, rbind(sin(argvals))), # one observation as reference funData(argvals, rbind(cos(argvals)))) sig <- sample(c(-1,1), 11, replace = TRUE) newData <- multiFunData(funData(argvals, outer(sig * seq(0.75, 1.25, by = 0.05), sin(argvals))), funData(argvals, outer(sig * seq(0.75, 1.25, by = 0.05), cos(argvals)))) par(mfrow = c(2,2)) plot(newData[[1]], col = topo.colors(11), main = "Original data") plot(refData[[1]], col = "red", lwd = 2, add = TRUE) plot(newData[[2]], col = topo.colors(11), main = "Original data") plot(refData[[2]], col = "red", lwd = 2, add = TRUE) plot(flipFuns(refData, newData)[[1]], col = topo.colors(11), main = "Flipped data") plot(refData[[1]], col = "red", lwd = 2, add = TRUE) plot(flipFuns(refData, newData)[[2]], col = topo.colors(11), main = "Flipped data") plot(refData[[2]], col = "red", lwd = 2, add = TRUE) par(oldpar)
Please choose more modern alternatives, such as Google Chrome or Mozilla Firefox.