Sim_Setting1 <- function(eValType = c("exponential", "linear"),
s2 = 0,
seed = NULL,
N = 250,
M = 8,
argvals = argvalsSetting1,
argvalsfd,
uniExpansions = uniExpansions,
B){
set.seed(seed)
## MFPCA
MRSE <- numeric(B)
ErrValues <- matrix(NA, nrow = B, ncol = M)
ErrFuns <- matrix(NA, nrow = B, ncol = M)
## fda
MRSE_RS <- numeric(B)
ErrValuesRS <- matrix(NA, nrow = B, ncol = M)
ErrFunsRS <- matrix(NA, nrow = B, ncol = M)
for (i in 1:B) {
SimData <- simMultiFunData(type = "split",
argvals = argvalsSetting1,
M = M,
eFunType = "Fourier",
eValType = eValType,
N = N)
TrueValues <- SimData$trueVals
TrueFunctions <- SimData$trueFuns
if (s2 > 0) {
SimData2 <- addError(SimData$simData, sd = sqrt(s2))
} else {
SimData2 <- SimData$simData
}
MFPCAObj <- MFPCA(SimData2,
M = M,
uniExpansions = uniExpansions,
fit = TRUE)
FittedValues <- MFPCAObj$values
FittedFunctions <- MFPCAObj$functions
fits <- MFPCAObj$fit
# MRSE
num <- norm(SimData2 - fits, squared = TRUE)
den <- norm(SimData2, squared = TRUE)
MRSE[i] <- mean(num / den)
# Eigenvalue relative error
ErrValues[i, ] <- (TrueValues - FittedValues) ^ 2 / (TrueValues ^ 2)
# Eigenfunction relative error
ErrFunsA <- norm(TrueFunctions - FittedFunctions, squared = TRUE)
ErrFunsB <- norm(TrueFunctions + FittedFunctions, squared = TRUE)
ErrFunsC <- norm(TrueFunctions, squared = TRUE)
ErrFuns[i, ] <- pmin(ErrFunsA, ErrFunsB)
### fda package
fdData1 <- aperm(SimData2@.Data[[1]]@X, c(2, 1))
fdData2 <- aperm(SimData2@.Data[[2]]@X, c(2, 1))
fdData <- array(NA, dim = c(nrow(fdData1), ncol(fdData1), 2))
fdData[ , , 1] <- fdData1
fdData[ , , 2] <- fdData2
fdarange <- range(argvalsfd)
fdabasis = create.bspline.basis(rangeval = fdarange,
nbasis = 15,
norder = 4)
fdatime <- argvalsfd
fdafd <- smooth.basis(fdatime, fdData, fdabasis)$fd
nharm <- M
fdapcaList <- pca.fd(fdafd, nharm)
fdaValues <- fdapcaList$values[1:M]
harmEval <- eval.fd(argvalsfd, fdapcaList$harmonics)
fdaFuns <- multiFunData(list(funData(argvals = list(argvalsfd),
X = t(harmEval[, , 1])),
funData(argvals = list(argvalsfd),
X = t(harmEval[, , 2]))))
sgn <- ifelse(scalarProduct(TrueFunctions, fdaFuns) < 0, -1, 1)
for (j in 1:2) {
fdaFuns[[j]]@X <- fdaFuns[[j]]@X * sgn
}
### MRSE
meanEval <- eval.fd(argvalsfd, fdapcaList$meanfd)
scores_RS <- apply(fdapcaList$scores[, , , drop = FALSE], c(1, 2), sum)
fits_fd <- array(0, dim = c(length(argvalsfd), N, 2))
for (j in 1:2) {
for (m in 1:M) {
fits_fd[, , j] <- fits_fd[, , j] + outer(harmEval[, m, j], scores_RS[, m])
}
fits_fd[, , j] <- sweep(fits_fd[, , j], 1, meanEval[, , j], "+")
}
fits_RS <- multiFunData(list(funData(argvals = list(argvalsfd),
X = t(fits_fd[, , 1])),
funData(argvals = list(argvalsfd),
X = t(fits_fd[, , 2]))))
numRS <- norm(SimData2 - fits_RS, squared = TRUE)
denRS <- norm(SimData2, squared = TRUE)
MRSE_RS[i] <- mean(numRS / denRS)
# Eigenvalue relative error
ErrValuesRS[i, ] <- (TrueValues - fdaValues) ^ 2 / (TrueValues ^ 2)
# Eigenfunction relative error
ErrFunsARS <- norm(TrueFunctions - fdaFuns, squared = TRUE)
ErrFunsBRS <- norm(TrueFunctions + fdaFuns, squared = TRUE)
ErrFunsCRS <- norm(TrueFunctions, squared = TRUE)
ErrFunsRS[i, ] <- pmin(ErrFunsARS, ErrFunsBRS)
}
return(list(MRSE = MRSE,
ErrValues = ErrValues,
ErrFuns = ErrFuns,
MRSERS = MRSE_RS,
ErrValuesRS = ErrValuesRS,
ErrFunsRS = ErrFunsRS))
}