Defines a term \(\int X_i(s)\beta(t,s)ds\)
for inclusion in an mgcv::gam
-formula (or bam
or gamm
or gamm4:::gamm4
) as constructed
by pffr
.
ffpc(
X,
yind = NULL,
xind = seq(0, 1, length = ncol(X)),
splinepars = list(bs = "ps", m = c(2, 1), k = 8),
decomppars = list(pve = 0.99, useSymm = TRUE),
npc.max = 15
)
an n by ncol(xind)
matrix of function evaluations \(X_i(s_{i1}),\dots, X_i(s_{iS})\); \(i=1,\dots,n\).
DEPRECATED used to supply matrix (or vector) of indices of evaluations of \(Y_i(t)\), no longer used.
matrix (or vector) of indices of evaluations of \(X_i(t)\), defaults to seq(0, 1, length=ncol(X))
.
optional arguments supplied to the basistype
-term. Defaults to a cubic
B-spline with first difference penalties and 8 basis functions for each \(\tilde \beta_k(t)\).
parameters for the FPCA performed with fpca.sc
.
maximal number \(K\) of FPCs to use, regardless of decomppars
; defaults to 15
A list containing the necessary information to construct a term to be included in a mgcv::gam
-formula.
In contrast to ff
, ffpc
does an FPCA decomposition \(X(s) \approx \sum^K_{k=1} \xi_{ik} \Phi_k(s)\) using fpca.sc
and
represents \(\beta(t,s)\) in the function space spanned by these \(\Phi_k(s)\).
That is, since
$$\int X_i(s)\beta(t,s)ds = \sum^K_{k=1} \xi_{ik} \int \Phi_k(s) \beta(s,t) ds = \sum^K_{k=1} \xi_{ik} \tilde \beta_k(t),$$
the function-on-function term can be represented as a sum of \(K\) univariate functions \(\tilde \beta_k(t)\) in \(t\) each multiplied by the FPC
scores \(\xi_{ik}\). The truncation parameter \(K\) is chosen as described in fpca.sc
.
Using this instead of ff()
can be beneficial if the covariance operator of the \(X_i(s)\)
has low effective rank (i.e., if \(K\) is small). If the covariance operator of the \(X_i(s)\)
is of (very) high rank, i.e., if \(K\) is large, ffpc()
will not be very efficient.
To reduce model complexity, the \(\tilde \beta_k(t)\) all have a single joint smoothing parameter
(in mgcv
, they get the same id
, see s
).
Please see pffr
for details on model specification and
implementation.
# NOT RUN { set.seed(1122) n <- 55 S <- 60 T <- 50 s <- seq(0,1, l=S) t <- seq(0,1, l=T) #generate X from a polynomial FPC-basis: rankX <- 5 Phi <- cbind(1/sqrt(S), poly(s, degree=rankX-1)) lambda <- rankX:1 Xi <- sapply(lambda, function(l) scale(rnorm(n, sd=sqrt(l)), scale=FALSE)) X <- Xi %*% t(Phi) beta.st <- outer(s, t, function(s, t) cos(2 * pi * s * t)) y <- (1/S*X) %*% beta.st + 0.1 * matrix(rnorm(n * T), nrow=n, ncol=T) data <- list(y=y, X=X) # set number of FPCs to true rank of process for this example: m.pc <- pffr(y ~ c(1) + 0 + ffpc(X, yind=t, decomppars=list(npc=rankX)), data=data, yind=t) summary(m.pc) m.ff <- pffr(y ~ c(1) + 0 + ff(X, yind=t), data=data, yind=t) summary(m.ff) # fits are very similar: all.equal(fitted(m.pc), fitted(m.ff)) # plot implied coefficient surfaces: layout(t(1:3)) persp(t, s, t(beta.st), theta=50, phi=40, main="Truth", ticktype="detailed") plot(m.ff, select=1, pers=TRUE, zlim=range(beta.st), theta=50, phi=40, ticktype="detailed") title(main="ff()") ffpcplot(m.pc, type="surf", auto.layout=FALSE, theta = 50, phi = 40) title(main="ffpc()") # show default ffpcplot: ffpcplot(m.pc) # }