[R] mgcv::gam is it possible to have a 'simple' product of 1-d smooths?

Mathew Guilfoyle mrguilfoyle at gmail.com
Wed Jan 17 11:25:39 CET 2018

I am trying to test out several mgcv::gam models in a scalar-on-function regression analysis.

The following is the 'hierarchy' of models I would like to test:

(1)  Y_i = a + integral[ X_i(t)*Beta(t) dt ]

(2)  Y_i = a + integral[ F{X_i(t)}*Beta(t) dt ]

(3)  Y_i = a + integral[ F{X_i(t),t} dt ]

equivalents for discrete data might be:

1)  Y_i = a + sum_t[ L_t * X_it * Beta_t ]

(2)  Y_i = a + sum_t[ L_t * F{X_it} * Beta_t ]

(3)  Y_i = a + sum_t[ L_t * F{X_it,t} ]

where Y_i are scalar outcomes for the i-th subject, and X_i(t) is a functional covariate observed at times t in [0,1,...T], and L are the quadrature weights.  Beta() and/or F{} are the functions to be estimated.   Intuitively, model 1 is a linear functional model with a (potentially non-linear) time-dependent regression coefficient (beta()) for the covariate.  Model 2 allows for a non-linear function of the covariate (F{}), but which is constant over time.  Model 3 is the full 'functional GAM' that allows for a fully flexible non-linear covariate- and time- dependent function.  

In my mind at least these would seem to form a natural step-by-step approach of increasing complexity for exploring this type of regression model.

Models 1 (linear functional) and 3 (functional GAM) are relatively straightforward to do with matrix arguments to mgcv::gam.  Assume N subjects observed at T time points.  Y is the length-N vector of scalar outcomes and X, T, and W are the N*T matrices of the functional predictor data values, their observation times, and trapezoidal quadrature weights, respectively.

Models (1) and (3) could be obtained with:

    m1 = gam(Y ~ s(T, by=I(X*W), bs='ps')
    m3 = gam(Y ~ te(X, T, by=W), bs='ps')

However, I cannot find a way to achieve model (2) where there is a 'simple' product of the smooth functions of X and T.  Effectively what I need (I think) is a way of creating a `te()` tensor product smooth but somehow constraining each marginal smooth to be the same for all values of the other variable?  Is this possible?

More information about the R-help mailing list