long2lstmarray

The goal of long2lstmarray is to transform 2D longitudinal data into 3D arrays suitable for neural networks training that require longitudinal data (e.g. Long short-term memory). The array output can be used by the R ‘keras’ or other similar packages as a X/label set.

Installation

You can install the long2lstmarray from GitHub with:

# install.packages("devtools")
devtools::install_github("luisgarcez11/long2lstmarray")

Guide

We will follow a step-by-step approach, starting with the most basic function and advancing to the most advanced function. Note that the most advanced functions rely on the most basic ones to function properly.

Data

The alsfrs_data dataset will be used to guide you through the package functionality. This data is invented.

library(long2lstmarray)
head(alsfrs_data, n = 10)
#> # A tibble: 10 × 15
#>    subjid visdy    p1    p2    p3    p4    p5    p6    p7    p8    p9   p10
#>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1      1     0     3     3     0     0     2     3     3     4     0     4
#>  2      1   151     0     0     2     4     3     0     3     1     3     3
#>  3      1   223     3     4     0     3     2     3     0     2     2     0
#>  4      1   372     1     3     1     3     3     3     4     3     1     1
#>  5      1   459     0     4     0     1     1     4     0     0     4     2
#>  6      1   535     2     2     4     1     1     0     2     3     0     1
#>  7      1   644     4     2     2     3     2     1     0     2     0     0
#>  8      1   759     4     0     4     1     2     3     0     2     1     3
#>  9      2     0     4     0     3     3     0     0     1     2     3     1
#> 10      2   244     3     4     0     4     0     2     1     4     2     4
#> # ℹ 3 more variables: x1r <dbl>, x2r <dbl>, x3r <dbl>

get_var_sequence function

The most basic function has the goal to retrieve the variable values from a subject/variable name pair, like this:

get_var_sequence(data = alsfrs_data, subj_var = "subjid", subj = 1, var = "p1")
#> [1] 3 0 3 1 0 2 4 4

slice_var_sequence function

Then, the package has the ability to generate a matrix with various lags from a sequence. For example, take a simple numeric sequence:

slice_var_sequence(sequence = 1:10, lags = 3, 
                   label_length = 1, label_output = TRUE)
#> $x
#>      [,1] [,2] [,3]
#> [1,]    1    2    3
#> [2,]    2    3    4
#> [3,]    3    4    5
#> [4,]    4    5    6
#> [5,]    5    6    7
#> [6,]    6    7    8
#> [7,]    7    8    9
#> 
#> $y
#> [1]  4  5  6  7  8  9 10

The result is a list with x representing the lags from the sequence, and y represents the value that follows each lag, and that will be used as label. If label_output = FALSE, only x is returned. The lags argument represents the number of columns of x, and label_length represents how many values after the lag is considered to be the label. If label_length = 1, the label value is always the value following the sliced sequence.

get_var_array function

This function has the ability to generate a matrix with various lags from a variable in a dataframe. This function is analogous to slice_var_sequence but its scope is larger, because it takes an data.frame as an argument, and so the var to be sequenced has to stated. The time_var is the time variable which is important to be stated because it orders the lags correctly.

get_var_array(data = alsfrs_data, subj_var = "subjid",
              var = "p3", time_var = "visdy",
              lags = 5, label_length = 1,
              label_output = TRUE)
#> $x
#>       time1 time2 time3 time4 time5
#> seq1      0     2     0     1     0
#> seq2      2     0     1     0     4
#> seq3      0     1     0     4     2
#> seq4      3     0     2     3     4
#> seq5      0     2     3     4     3
#> seq6      2     3     4     3     1
#> seq7      3     4     3     1     3
#> seq8      4     3     1     3     3
#> seq9      3     1     3     3     0
#> seq10     1     3     3     0     2
#> seq11     3     3     0     2     4
#> seq12     3     0     2     4     1
#> seq13     0     2     4     1     0
#> seq14     2     4     1     0     1
#> seq15     0     1     1     3     2
#> seq16     1     1     3     2     4
#> seq17     1     3     2     4     1
#> seq18     3     2     4     1     0
#> seq19     2     4     1     0     3
#> seq20     1     0     3     0     2
#> seq21     0     3     0     2     1
#> seq22     3     0     2     1     4
#> seq23     0     2     1     4     4
#> seq24     2     1     4     4     4
#> seq25     1     4     4     4     2
#> seq26     4     4     4     2     4
#> seq27     4     4     2     4     4
#> seq28     4     2     1     3     0
#> seq29     2     1     3     0     1
#> seq30     1     3     0     1     0
#> seq31     3     0     1     0     4
#> seq32     0     1     0     4     1
#> seq33     4     4     4     1     0
#> seq34     4     4     1     0     2
#> seq35     4     1     0     2     2
#> seq36     1     0     2     2     3
#> seq37     0     2     2     3     0
#> 
#> $y
#>  [1] 4 2 4 3 1 3 3 0 2 4 1 0 1 2 4 1 0 3 4 1 4 4 4 2 4 4 0 1 0 4 1 0 2 2 3 0 2

longitudinal_array function

This function is analogous to the previous get_var_array function. This function has the ability to generate a matrix with various lags from various variables in a dataframe. The returned object is a 3D array. The array dimensions are respectively, subject, time and variable. If label_output is TRUE, a list with the 3D array and vector with the labels is returned.

array3d <- longitudinal_array(alsfrs_data, "subjid",
                              vars =  c("p1", "p2", "p3"), 
                              time_var =  "visdy", lags = 3,
                              label_output = FALSE)

First dimension, representing the subjects (e.g. subjid = 1):

array3d[1,,]
#>       p1 p2 p3
#> time1  3  3  0
#> time2  0  0  2
#> time3  3  4  0

Second dimension, representing time (e.g. first visit):

array3d[,1,]
#>       p1 p2 p3
#> seq1   3  3  0
#> seq2   0  0  2
#> seq3   3  4  0
#> seq4   1  3  1
#> seq5   0  4  0
#> seq6   4  0  3
#> seq7   3  4  0
#> seq8   0  3  2
#> seq9   1  4  3
#> seq10  3  3  4
#> seq11  3  3  3
#> seq12  4  0  1
#> seq13  3  0  3
#> seq14  2  4  3
#> seq15  3  1  0
#> seq16  1  3  2
#> seq17  4  4  4
#> seq18  2  0  1
#> seq19  1  0  1
#> seq20  3  3  3
#> seq21  2  4  0
#> seq22  4  1  1
#> seq23  4  4  1
#> seq24  1  3  3
#> seq25  1  4  2
#> seq26  3  3  4
#> seq27  1  2  1
#> seq28  2  1  1
#> seq29  3  4  0
#> seq30  0  1  3
#> seq31  3  0  0
#> seq32  1  3  2
#> seq33  4  3  1
#> seq34  1  2  4
#> seq35  3  2  4
#> seq36  1  0  4
#> seq37  1  4  2
#> seq38  0  3  4
#> seq39  4  0  1
#> seq40  2  0  0
#> seq41  0  4  4
#> seq42  2  4  2
#> seq43  2  3  1
#> seq44  4  1  3
#> seq45  0  3  0
#> seq46  1  4  1
#> seq47  0  3  0
#> seq48  0  3  4
#> seq49  1  0  4
#> seq50  1  4  4
#> seq51  1  1  1
#> seq52  1  3  0
#> seq53  3  0  2
#> seq54  1  1  2
#> seq55  4  3  4

Third dimension, representing the variables (e.g. p1):

array3d[,,1] 
#>       time1 time2 time3
#> seq1      3     0     3
#> seq2      0     3     1
#> seq3      3     1     0
#> seq4      1     0     2
#> seq5      0     2     4
#> seq6      4     3     0
#> seq7      3     0     1
#> seq8      0     1     3
#> seq9      1     3     3
#> seq10     3     3     4
#> seq11     3     4     3
#> seq12     4     3     2
#> seq13     3     2     3
#> seq14     2     3     1
#> seq15     3     1     4
#> seq16     1     4     2
#> seq17     4     2     1
#> seq18     2     1     1
#> seq19     1     3     0
#> seq20     3     0     3
#> seq21     2     4     4
#> seq22     4     4     1
#> seq23     4     1     1
#> seq24     1     1     3
#> seq25     1     3     1
#> seq26     3     1     4
#> seq27     1     4     1
#> seq28     2     3     0
#> seq29     3     0     3
#> seq30     0     3     1
#> seq31     3     1     4
#> seq32     1     4     1
#> seq33     4     1     3
#> seq34     1     3     1
#> seq35     3     1     1
#> seq36     1     1     4
#> seq37     1     4     1
#> seq38     0     3     0
#> seq39     4     2     1
#> seq40     2     1     4
#> seq41     0     2     2
#> seq42     2     2     4
#> seq43     2     4     0
#> seq44     4     0     1
#> seq45     0     1     0
#> seq46     1     0     3
#> seq47     0     3     0
#> seq48     0     1     1
#> seq49     1     1     1
#> seq50     1     1     1
#> seq51     1     1     3
#> seq52     1     3     1
#> seq53     3     1     0
#> seq54     1     0     0
#> seq55     4     0     0