sail is a package that fits a linear model with non-linear interactions via penalized maximum likelihood. The regularization path is computed at a grid of values for the regularization parameter $$\lambda$$ and a fixed value of the second regularization parameter $$\alpha$$. The method enforces the strong heredity property, i.e., an interaction is selected only if its corresponding main effects are also included. The interactions are limited to a single exposure variable, i.e., $$y \sim e + x_1 + x_2 + e*x_1 + e*x_2 + \epsilon$$. Furthermore, this package allows a user-defined basis expansion on the $$x$$ variables to allow for non-linear effects. The default is bsplines (e.g. splines::bs(x, 5)). It currently only fits linear models (binomial models are due in the next release).

## Model

Let $$Y=(Y_1, \ldots, Y_n) \in \mathbb{R}^n$$ be a continuous outcome variable, a binary or continuous environment vector, a matrix of predictors, and $$\varepsilon = (\varepsilon_1, \ldots, \varepsilon_n) \in \mathbb{R}^n$$ a vector of i.i.d random variables with mean 0. Furthermore let $$f_j: \mathbb{R} \rightarrow \mathbb{R}$$ be a smoothing method for variable $$X_j$$ by a projection on to a set of basis functions: $$$f_j(X_j) = \sum_{\ell = 1}^{m_j} \psi_{j\ell}(X_j) \beta_{j\ell} \label{eq:smooth}$$$ Here, the $$\left\lbrace \psi_{j\ell} \right\rbrace_1^{m_j}$$ are a family of basis functions in $$X_j$$~. Let $$\boldsymbol{\Psi}_j$$ be the $$n \times m_j$$ matrix of evaluations of the $$\psi_{j\ell}$$ and for $$j = 1, \ldots, p$$, i.e., $$\boldsymbol{\theta}_j$$ is a $$m_j$$-dimensional column vector of basis coefficients for the $$j$$th main effect. In this article we consider an additive interaction regression model of the form \begin{align} Y & = \beta_0 \cdot \boldsymbol{1} + \sum_{j=1}^p \boldsymbol{\Psi}_j \boldsymbol{\theta}_j + \beta_E X_E + \sum_{j=1}^p (X_E \circ \boldsymbol{\Psi}_j) \boldsymbol{\alpha}_{j} + \varepsilon \label{eq:linpred} \end{align} where $$\beta_0$$ is the intercept, $$\beta_E$$ is the coefficient for the environment variable, $$\boldsymbol{\alpha}_j = (\alpha_{j1}, \ldots, \alpha_{jm_j})\in \mathbb{R}^{m_j}$$ are the basis coefficients for the $$j$$th interaction term and $$(X_E \circ \boldsymbol{\Psi}_j)$$ is the $$n \times m_j$$ matrix formed by the component-wise multiplication of the column vector $$X_E$$ by each column of $$\boldsymbol{\Psi}_j$$. To enforce the strong heredity property, we reparametrize the coefficients for the interaction terms in~ as $$\boldsymbol{\alpha}_{j} = \gamma_{j} \beta_E \boldsymbol{\theta}_j$$: \begin{align} Y & = \beta_0 \cdot \boldsymbol{1} + \sum_{j=1}^p \boldsymbol{\Psi}_j \boldsymbol{\theta}_j + \beta_E X_E + \sum_{j=1}^p \gamma_{j} \beta_E (X_E \circ \boldsymbol{\Psi}_j) \boldsymbol{\theta}_j + \varepsilon \label{eq:linpred2} \end{align} For a continuous response, we use the squared-error loss: $$$\mathcal{L}(Y;\boldsymbol{\theta}) = \frac{1}{2n}\lVert Y - \beta_0 \cdot \boldsymbol{1} - \sum_{j=1}^p \boldsymbol{\Psi}_j \boldsymbol{\theta}_j - \beta_E X_E - \sum_{j=1}^p \gamma_{j} \beta_E (X_E \circ \boldsymbol{\Psi}_j) \boldsymbol{\theta}_j \rVert_2^2$$$ where $$\boldsymbol{\theta} \equiv (\beta_0, \beta_E,\boldsymbol{\theta}_1, \ldots, \boldsymbol{\theta}_p, \gamma_1, \ldots, \gamma_p)$$.

We consider the following penalized least squares criterion for this problem: $$$\arg\min_{\boldsymbol{\theta} } \mathcal{L}(Y;\boldsymbol{\theta}) + \lambda (1-\alpha) \left( w_E |\beta_E| + \sum_{j=1}^{p} w_j \lVert\boldsymbol{\theta}_j \rVert_2 \right) + \lambda\alpha \sum_{j=1}^{p} w_{jE} |\gamma_{j}| \label{eq:lassolikelihood3}$$$ where $$\lambda >0$$ and $$\alpha \in (0,1)$$ are tuning parameters and $$w_E, w_j, w_{jE}$$ are adaptive weights for $$j=1, \ldots, p$$. These weights serve as a way of allowing parameters to be penalized differently.

## Installation

The package can be installed from GitHub via

install.packages("pacman")
pacman::p_load_gh('sahirbhatnagar/sail')

## Quick Start

We give a quick overview of the main functions and go into details in other vignettes. We will use the simulated data which ships with the package and can be loaded via:

library(sail)
data("sailsim")
names(sailsim)
#> [1] "x"        "y"        "e"        "f1"       "f2"       "f3"
#> [7] "f4"       "f3.inter" "f4.inter"

We first define a basis expansion. In this example we use cubic bsplines with degree 3.

library(splines)
f.basis <- function(x) splines::bs(x, degree = 3)

Next we fit the model using the most basic call to sail

fit <- sail(x = sailsim$x, y = sailsim$y, e = sailsim$e, basis = f.basis) fit is an object of class sail that contains all the relevant information of the fitted model including the estimated coefficients at each value of $$\lambda$$ (by default the program chooses its own decreasing sequence of 100 $$\lambda$$ values). There are print, plot, coef and predict methods of objects of class sail. The print method outputs the following: fit #> #> Call: sail(x = sailsim$x, y = sailsim$y, e = sailsim$e, basis = f.basis)
#>
#>      df_main df_interaction df_environment     %Dev  Lambda
#> s1         0              0              0 0.000000 1.48800
#> s2         0              0              1 0.001701 1.42000
#> s3         0              0              1 0.003359 1.35600
#> s4         0              0              1 0.004899 1.29400
#> s5         0              0              1 0.006354 1.23500
#> s6         0              0              1 0.007728 1.17900
#> s7         0              0              1 0.009028 1.12600
#> s8         0              0              1 0.010260 1.07500
#> s9         1              0              1 0.018970 1.02600
#> s10        2              0              1 0.042490 0.97900
#> s11        2              0              1 0.069000 0.93450
#> s12        2              0              1 0.094110 0.89210
#> s13        2              0              1 0.117900 0.85150
#> s14        2              0              1 0.140500 0.81280
#> s15        3              0              1 0.163800 0.77590
#> s16        4              0              1 0.189100 0.74060
#> s17        4              0              1 0.214000 0.70690
#> s18        5              0              1 0.238100 0.67480
#> s19        5              0              1 0.262200 0.64410
#> s20        3              1              1 0.439100 0.61490
#> s21        4              2              1 0.457000 0.58690
#> s22        5              2              1 0.475400 0.56020
#> s23        5              2              1 0.491600 0.53480
#> s24        5              2              1 0.505300 0.51050
#> s25        5              2              1 0.518200 0.48730
#> s26        5              2              1 0.530100 0.46510
#> s27        5              2              1 0.541200 0.44400
#> s28        5              2              1 0.551400 0.42380
#> s29        5              2              1 0.561400 0.40450
#> s30        5              2              1 0.569300 0.38620
#> s31        5              2              1 0.577300 0.36860
#> s32        6              2              1 0.585500 0.35190
#> s33        6              2              1 0.594900 0.33590
#> s34        6              2              1 0.603700 0.32060
#> s35        7              3              1 0.612300 0.30600
#> s36        7              3              1 0.620400 0.29210
#> s37        8              4              1 0.629200 0.27880
#> s38        8              4              1 0.641900 0.26620
#> s39        9              4              1 0.650000 0.25410
#> s40        9              4              1 0.658500 0.24250
#> s41        8              4              1 0.689000 0.23150
#> s42        8              4              1 0.695300 0.22100
#> s43        8              4              1 0.701400 0.21090
#> s44        9              4              1 0.707200 0.20130
#> s45        8              6              1 0.728900 0.19220
#> s46        8              6              1 0.733700 0.18350
#> s47        8              6              1 0.738200 0.17510
#> s48        8              7              1 0.742400 0.16720
#> s49        9              7              1 0.747600 0.15960
#> s50       10              7              1 0.752100 0.15230
#> s51       10              7              1 0.756500 0.14540
#> s52       10              7              1 0.760900 0.13880
#> s53       11              7              1 0.765200 0.13250
#> s54       11              7              1 0.769900 0.12640
#> s55       11              7              1 0.773900 0.12070
#> s56       11              7              1 0.778100 0.11520
#> s57       12              9              1 0.794000 0.11000
#> s58       12              9              1 0.798500 0.10500
#> s59       12              9              1 0.802700 0.10020
#> s60       12              9              1 0.806600 0.09565
#> s61       13              9              1 0.810400 0.09131
#> s62       13              9              1 0.814100 0.08716
#> s63       13              9              1 0.817200 0.08319
#> s64       16              9              1 0.820000 0.07941
#> s65       16              9              1 0.822900 0.07580
#> s66       16              9              1 0.825600 0.07236
#> s67       16              9              1 0.828200 0.06907
#> s68       16              9              1 0.830700 0.06593
#> s69       17             10              1 0.833500 0.06293
#> s70       17             10              1 0.840000 0.06007
#> s71       16             12              1 0.849000 0.05734
#> s72       16             12              1 0.851400 0.05474
#> s73       18             12              1 0.853900 0.05225
#> s74       19             12              1 0.856700 0.04987
#> s75       19             12              1 0.859600 0.04761
#> s76       19             12              1 0.862600 0.04544
#> s77       19             15              1 0.897700 0.04338
#> s78       20             18              1 0.907600 0.04141
#> s79       20             18              1 0.909800 0.03952
#> s80       20             19              1 0.925800 0.03773
#> s81       20             20              1 0.927700 0.03601
#> s82       20             20              1 0.929700 0.03438
#> s83       20             20              1 0.931800 0.03281
#> s84       20             20              1 0.934500 0.03132
#> s85       20             20              1 0.936100 0.02990
#> s86       20             20              1 0.937700 0.02854
#> s87       20             20              1 0.939300 0.02724
#> s88       20             20              1 0.943900 0.02600
#> s89       20             20              1 0.944700 0.02482
#> s90       20             20              1 0.945600 0.02369
#> s91       20             20              1 0.946500 0.02262
#> s92       20             20              1 0.947100 0.02159
#> s93       20             20              1 0.948500 0.02061
#> s94       20             20              1 0.949200 0.01967
#> s95       20             20              1 0.950100 0.01878
#> s96       20             20              1 0.950700 0.01792
#> s97       20             20              1 0.951400 0.01711
#> s98       20             20              1 0.952000 0.01633
#> s99       20             20              1 0.952600 0.01559
#> s100      20             20              1 0.954900 0.01488

When expand = TRUE (i.e. the user did not provide their own design matrix), the df_main and df_interaction columns correspond to the number of non-zero predictors present in the model before basis expansion. This does not correspond to the number of non-zero coefficients in the model, but rather the number of unique variables. In this example we expanded each column of $$\mathbf{X}$$ to five columns. If df_main=4, df_interaction=2 and df_environment=1, then the total number of non-zero coefficients would be $$5 \times (4+2) + 1$$.

The entire solution path can be plotted via the plot method for objects of class sail. The y-axis is the value of the coefficient and the x-axis is the $$\log(\lambda)$$. Each line represents a coefficient in the model, and each color represents a variable (i.e. in this example a given variable will have 5 lines when it is non-zero). The numbers at the top of the plot represent the number of non-zero variables in the model: top panel (df_main + df_environment), bottom panel (df_interaction). The black line is the coefficient path for the environment variable.

plot(fit)

The estimated coefficients at each value of lambda is given by (matrix partially printed here for brevity)

coef(fit)[1:6,50:55]
#> 6 x 6 sparse Matrix of class "dgCMatrix"
#>                    s50        s51        s52        s53       s54
#> (Intercept)  5.3445152  5.3350735  5.3260684  5.3209183  5.314509
#> X1_1         0.7668023  0.8407632  0.9134418  0.9963138  1.085707
#> X1_2         1.4682908  1.5072192  1.5402298  1.5855723  1.652733
#> X1_3         3.1982020  3.2553440  3.3051339  3.3837769  3.485491
#> X2_1        -3.5192313 -3.6285818 -3.7307130 -3.8183660 -3.881222
#> X2_2        -1.8958170 -1.8899979 -1.8853574 -1.8738510 -1.860779
#>                   s55
#> (Intercept)  5.310267
#> X1_1         1.173776
#> X1_2         1.705634
#> X1_3         3.572614
#> X2_1        -3.949365
#> X2_2        -1.845185

The predicted response at each value of lambda:

predict(fit)[1:5,50:55]
#>             s50        s51        s52        s53        s54        s55
#> [1,]  5.7445034  5.7179456  5.6497326  5.6215581  5.5483312  5.5167354
#> [2,]  3.5886152  3.6608123  3.6673009  3.7788863  3.8397710  3.9364845
#> [3,]  0.7525327  0.7083256  0.6460716  0.6605192  0.6352286  0.6510435
#> [4,] 12.5038372 12.4852941 12.5806330 12.5278481 12.5857507 12.5421780
#> [5,]  1.3865576  1.3339420  1.3466244  1.3138336  1.3409284  1.3203384

The predicted response at a specific value of lambda can be specified by the s argument:

predict(fit, s = 0.8)
#>               1
#>   [1,] 5.565188
#>   [2,] 5.245648
#>   [3,] 4.256588
#>   [4,] 6.314703
#>   [5,] 3.884374
#>   [6,] 4.446973
#>   [7,] 6.112132
#>   [8,] 5.360375
#>   [9,] 5.972536
#>  [10,] 5.558947
#>  [11,] 5.252652
#>  [12,] 6.394977
#>  [13,] 6.304268
#>  [14,] 4.993944
#>  [15,] 6.673554
#>  [16,] 4.852025
#>  [17,] 5.011305
#>  [18,] 4.855807
#>  [19,] 5.182772
#>  [20,] 5.292666
#>  [21,] 5.939055
#>  [22,] 5.624398
#>  [23,] 4.496055
#>  [24,] 6.156093
#>  [25,] 4.839130
#>  [26,] 6.202291
#>  [27,] 6.240929
#>  [28,] 4.440300
#>  [29,] 6.173744
#>  [30,] 5.779888
#>  [31,] 5.060847
#>  [32,] 5.034286
#>  [33,] 6.319719
#>  [34,] 4.387120
#>  [35,] 6.716587
#>  [36,] 5.668114
#>  [37,] 5.065923
#>  [38,] 4.961400
#>  [39,] 5.008489
#>  [40,] 5.146974
#>  [41,] 3.696416
#>  [42,] 4.303783
#>  [43,] 5.580174
#>  [44,] 6.591266
#>  [45,] 4.633462
#>  [46,] 4.522579
#>  [47,] 5.633387
#>  [48,] 6.633019
#>  [49,] 5.013153
#>  [50,] 5.267268
#>  [51,] 5.035807
#>  [52,] 4.611586
#>  [53,] 5.341352
#>  [54,] 5.233311
#>  [55,] 4.733031
#>  [56,] 5.022145
#>  [57,] 5.299347
#>  [58,] 5.187987
#>  [59,] 6.093533
#>  [60,] 5.332161
#>  [61,] 4.536252
#>  [62,] 3.800441
#>  [63,] 6.222930
#>  [64,] 4.917357
#>  [65,] 5.080531
#>  [66,] 5.868890
#>  [67,] 4.541408
#>  [68,] 5.701353
#>  [69,] 5.271430
#>  [70,] 6.208581
#>  [71,] 4.813133
#>  [72,] 4.031251
#>  [73,] 5.693444
#>  [74,] 6.269703
#>  [75,] 4.328094
#>  [76,] 5.015667
#>  [77,] 4.140977
#>  [78,] 5.788631
#>  [79,] 5.137175
#>  [80,] 5.144183
#>  [81,] 5.533654
#>  [82,] 5.638968
#>  [83,] 5.349115
#>  [84,] 5.995233
#>  [85,] 4.787946
#>  [86,] 4.485989
#>  [87,] 4.589191
#>  [88,] 5.084970
#>  [89,] 4.414470
#>  [90,] 3.896057
#>  [91,] 5.675552
#>  [92,] 6.268628
#>  [93,] 5.593670
#>  [94,] 5.971994
#>  [95,] 5.096703
#>  [96,] 4.168302
#>  [97,] 5.017025
#>  [98,] 5.368094
#>  [99,] 4.576291
#> [100,] 5.764786

You can specify more than one value for s:

predict(fit, s = c(0.8, 0.2))
#>               1          2
#>   [1,] 5.565188  6.4563490
#>   [2,] 5.245648  3.5762830
#>   [3,] 4.256588  1.2541443
#>   [4,] 6.314703 12.3815143
#>   [5,] 3.884374  1.5612304
#>   [6,] 4.446973  1.5503816
#>   [7,] 6.112132 12.6330145
#>   [8,] 5.360375  6.4671028
#>   [9,] 5.972536  7.0190070
#>  [10,] 5.558947  5.2948898
#>  [11,] 5.252652  4.3677887
#>  [12,] 6.394977 11.2278283
#>  [13,] 6.304268 11.6189806
#>  [14,] 4.993944  4.0124434
#>  [15,] 6.673554 14.4290841
#>  [16,] 4.852025  5.0443558
#>  [17,] 5.011305  0.8168762
#>  [18,] 4.855807  4.5902225
#>  [19,] 5.182772  3.1477565
#>  [20,] 5.292666  3.4902000
#>  [21,] 5.939055  8.4361272
#>  [22,] 5.624398  4.6555593
#>  [23,] 4.496055  1.7045694
#>  [24,] 6.156093 10.5558726
#>  [25,] 4.839130  1.2444600
#>  [26,] 6.202291  8.6260313
#>  [27,] 6.240929  7.7126054
#>  [28,] 4.440300 -0.7778888
#>  [29,] 6.173744 12.0720146
#>  [30,] 5.779888  1.8831854
#>  [31,] 5.060847  4.9276303
#>  [32,] 5.034286  8.3934198
#>  [33,] 6.319719  8.9647247
#>  [34,] 4.387120  3.6730133
#>  [35,] 6.716587 15.4640443
#>  [36,] 5.668114  1.1145380
#>  [37,] 5.065923  5.0030880
#>  [38,] 4.961400  3.0886490
#>  [39,] 5.008489  3.5325687
#>  [40,] 5.146974  4.7369669
#>  [41,] 3.696416  1.7665100
#>  [42,] 4.303783  0.7109199
#>  [43,] 5.580174  6.8465242
#>  [44,] 6.591266 14.7008154
#>  [45,] 4.633462  2.1878324
#>  [46,] 4.522579  3.8488986
#>  [47,] 5.633387  6.2435977
#>  [48,] 6.633019 16.8729068
#>  [49,] 5.013153  3.0090785
#>  [50,] 5.267268  7.7524439
#>  [51,] 5.035807  5.7762293
#>  [52,] 4.611586  1.7242234
#>  [53,] 5.341352  7.2133769
#>  [54,] 5.233311  8.9233017
#>  [55,] 4.733031  2.0904075
#>  [56,] 5.022145  1.2321963
#>  [57,] 5.299347  5.5841592
#>  [58,] 5.187987  8.1850179
#>  [59,] 6.093533  9.1272205
#>  [60,] 5.332161  2.6762385
#>  [61,] 4.536252  1.2714320
#>  [62,] 3.800441 -0.7821244
#>  [63,] 6.222930  9.0399619
#>  [64,] 4.917357  1.4590598
#>  [65,] 5.080531  3.3498113
#>  [66,] 5.868890  3.2462364
#>  [67,] 4.541408  3.8775236
#>  [68,] 5.701353  5.9176470
#>  [69,] 5.271430  9.4635363
#>  [70,] 6.208581  8.5531857
#>  [71,] 4.813133  3.1399498
#>  [72,] 4.031251  0.8587915
#>  [73,] 5.693444  7.2551243
#>  [74,] 6.269703  4.7373189
#>  [75,] 4.328094  2.7418860
#>  [76,] 5.015667  1.4436768
#>  [77,] 4.140977  2.3070947
#>  [78,] 5.788631 16.4559530
#>  [79,] 5.137175  7.0246294
#>  [80,] 5.144183  2.3912821
#>  [81,] 5.533654  4.2128178
#>  [82,] 5.638968  4.5853076
#>  [83,] 5.349115  5.3680719
#>  [84,] 5.995233  5.6151668
#>  [85,] 4.787946  3.5272371
#>  [86,] 4.485989  2.9988064
#>  [87,] 4.589191  3.5070799
#>  [88,] 5.084970  1.7410672
#>  [89,] 4.414470  4.7618966
#>  [90,] 3.896057  5.6814850
#>  [91,] 5.675552  8.0216272
#>  [92,] 6.268628  9.1200249
#>  [93,] 5.593670  4.7429260
#>  [94,] 5.971994  7.6268458
#>  [95,] 5.096703  5.7827835
#>  [96,] 4.168302  2.7426953
#>  [97,] 5.017025  9.8201852
#>  [98,] 5.368094  6.1535859
#>  [99,] 4.576291  3.9789271
#> [100,] 5.764786  4.7680511

You can also extract a list of active variables (i.e. variables with a non-zero estimated coefficient) for each value of lambda:

fit[["active"]]
#> [[1]]
#> character(0)
#>
#> [[2]]
#> [1] "E"
#>
#> [[3]]
#> [1] "E"
#>
#> [[4]]
#> [1] "E"
#>
#> [[5]]
#> [1] "E"
#>
#> [[6]]
#> [1] "E"
#>
#> [[7]]
#> [1] "E"
#>
#> [[8]]
#> [1] "E"
#>
#> [[9]]
#> [1] "X3" "E"
#>
#> [[10]]
#> [1] "X3" "X4" "E"
#>
#> [[11]]
#> [1] "X3" "X4" "E"
#>
#> [[12]]
#> [1] "X3" "X4" "E"
#>
#> [[13]]
#> [1] "X3" "X4" "E"
#>
#> [[14]]
#> [1] "X3" "X4" "E"
#>
#> [[15]]
#> [1] "X1" "X3" "X4" "E"
#>
#> [[16]]
#> [1] "X1" "X3" "X4" "X8" "E"
#>
#> [[17]]
#> [1] "X1" "X3" "X4" "X8" "E"
#>
#> [[18]]
#> [1] "X1"  "X3"  "X4"  "X8"  "X11" "E"
#>
#> [[19]]
#> [1] "X1"  "X3"  "X4"  "X8"  "X11" "E"
#>
#> [[20]]
#> [1] "X1"   "X3"   "X4"   "X4:E" "E"
#>
#> [[21]]
#> [1] "X1"   "X3"   "X4"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[22]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[23]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[24]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[25]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[26]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[27]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[28]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[29]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[30]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[31]]
#> [1] "X1"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[32]]
#> [1] "X1"   "X2"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[33]]
#> [1] "X1"   "X2"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[34]]
#> [1] "X1"   "X2"   "X3"   "X4"   "X8"   "X11"  "X3:E" "X4:E" "E"
#>
#> [[35]]
#>  [1] "X1"   "X2"   "X3"   "X4"   "X8"   "X11"  "X14"  "X1:E" "X3:E" "X4:E"
#> [11] "E"
#>
#> [[36]]
#>  [1] "X1"   "X2"   "X3"   "X4"   "X8"   "X11"  "X14"  "X1:E" "X3:E" "X4:E"
#> [11] "E"
#>
#> [[37]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X14"   "X16"
#>  [9] "X1:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[38]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X14"   "X16"
#>  [9] "X1:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[39]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X14"   "X16"
#>  [9] "X20"   "X1:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[40]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X14"   "X16"
#>  [9] "X20"   "X1:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[41]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X2:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[42]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X2:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[43]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X2:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[44]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X14"   "X16"
#>  [9] "X20"   "X2:E"  "X3:E"  "X4:E"  "X11:E" "E"
#>
#> [[45]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X11:E" "X16:E" "E"
#>
#> [[46]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X11:E" "X16:E" "E"
#>
#> [[47]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X11:E" "X16:E" "E"
#>
#> [[48]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X8"    "X11"   "X16"   "X20"
#>  [9] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"  "X11:E" "X16:E" "E"
#>
#> [[49]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X16"
#>  [9] "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"  "X11:E" "X16:E"
#> [17] "E"
#>
#> [[50]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"  "X11:E"
#> [17] "X16:E" "E"
#>
#> [[51]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"  "X11:E"
#> [17] "X16:E" "E"
#>
#> [[52]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"  "X11:E"
#> [17] "X16:E" "E"
#>
#> [[53]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"
#> [17] "X11:E" "X16:E" "E"
#>
#> [[54]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"
#> [17] "X11:E" "X16:E" "E"
#>
#> [[55]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"
#> [17] "X11:E" "X16:E" "E"
#>
#> [[56]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X11"   "X14"
#>  [9] "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X8:E"
#> [17] "X11:E" "X16:E" "E"
#>
#> [[57]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X10"   "X11"
#>  [9] "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [17] "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[58]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X10"   "X11"
#>  [9] "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [17] "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[59]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X10"   "X11"
#>  [9] "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [17] "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[60]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X6"    "X8"    "X10"   "X11"
#>  [9] "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [17] "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[61]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X10"
#>  [9] "X11"   "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"
#> [17] "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[62]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X10"
#>  [9] "X11"   "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"
#> [17] "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[63]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X10"
#>  [9] "X11"   "X14"   "X16"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"
#> [17] "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E" "X20:E" "E"
#>
#> [[64]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E"
#> [25] "X20:E" "E"
#>
#> [[65]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E"
#> [25] "X20:E" "E"
#>
#> [[66]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E"
#> [25] "X20:E" "E"
#>
#> [[67]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E"
#> [25] "X20:E" "E"
#>
#> [[68]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X11:E" "X16:E"
#> [25] "X20:E" "E"
#>
#> [[69]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X18"   "X19"
#> [17] "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X9:E"
#> [25] "X11:E" "X16:E" "X20:E" "E"
#>
#> [[70]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X12"   "X14"   "X15"   "X16"   "X18"   "X19"
#> [17] "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X6:E"  "X8:E"  "X9:E"
#> [25] "X11:E" "X16:E" "X20:E" "E"
#>
#> [[71]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X14"   "X15"   "X16"   "X18"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"  "X6:E"  "X8:E"  "X9:E"
#> [25] "X10:E" "X11:E" "X16:E" "X20:E" "E"
#>
#> [[72]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X8"    "X9"
#>  [9] "X10"   "X11"   "X14"   "X15"   "X16"   "X18"   "X19"   "X20"
#> [17] "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"  "X6:E"  "X8:E"  "X9:E"
#> [25] "X10:E" "X11:E" "X16:E" "X20:E" "E"
#>
#> [[73]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X13"   "X14"   "X15"   "X16"   "X18"
#> [17] "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"  "X6:E"
#> [25] "X8:E"  "X9:E"  "X10:E" "X11:E" "X16:E" "X20:E" "E"
#>
#> [[74]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"
#> [25] "X6:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X16:E" "X20:E" "E"
#>
#> [[75]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"
#> [25] "X6:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X16:E" "X20:E" "E"
#>
#> [[76]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"
#> [25] "X6:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X16:E" "X20:E" "E"
#>
#> [[77]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X15"   "X16"   "X17"
#> [17] "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"  "X5:E"
#> [25] "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X12:E" "X13:E" "X16:E"
#> [33] "X19:E" "X20:E" "E"
#>
#> [[78]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E" "E"
#>
#> [[79]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E" "E"
#>
#> [[80]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X19:E" "X20:E" "E"
#>
#> [[81]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[82]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[83]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[84]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[85]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[86]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[87]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[88]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[89]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[90]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[91]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[92]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[93]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[94]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[95]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[96]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[97]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[98]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[99]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"
#>
#> [[100]]
#>  [1] "X1"    "X2"    "X3"    "X4"    "X5"    "X6"    "X7"    "X8"
#>  [9] "X9"    "X10"   "X11"   "X12"   "X13"   "X14"   "X15"   "X16"
#> [17] "X17"   "X18"   "X19"   "X20"   "X1:E"  "X2:E"  "X3:E"  "X4:E"
#> [25] "X5:E"  "X6:E"  "X7:E"  "X8:E"  "X9:E"  "X10:E" "X11:E" "X12:E"
#> [33] "X13:E" "X14:E" "X15:E" "X16:E" "X17:E" "X18:E" "X19:E" "X20:E"
#> [41] "E"

## Cross-Validation

cv.sail is the main function to do cross-validation along with plot, predict, and coef methods for objects of class cv.sail. We can also run it in parallel:

set.seed(432) # to reproduce results (randomness due to CV folds)
library(doParallel)
#> Loading required package: foreach
#> Loading required package: iterators
#> Loading required package: parallel
registerDoParallel(cores = 2)
cvfit <- cv.sail(x = sailsim$x, y = sailsim$y, e = sailsim\$e, basis = f.basis,
dfmax = 10, # to speed up vignette build time
nfolds = 5, parallel = TRUE, nlambda = 50)

We plot the cross-validated error curve which has the mean-squared error on the y-axis and $$\log(\lambda)$$ on the x-axis. It includes the cross-validation curve (red dotted line), and upper and lower standard deviation curves along the $$\lambda$$ sequence (error bars). Two selected $$\lambda$$’s are indicated by the vertical dotted lines (see below). The numbers at the top of the plot represent the total number of non-zero variables at that value of $$\lambda$$ (df_main + df_environment + df_interaction):

plot(cvfit)