Computing the DFC/HP and manipulating the functions returned objects

Hassan-Roland Nasser and Marie Schneider

2024-07-31

library(digiRhythm)
data <- digiRhythm::df691b_1
data <- resample_dgm(data, 15)
data <- remove_activity_outliers(data)
activity <- names(data)[3]
head(activity)
#> [1] "Steps"

Degree of Functional Coupling (DFC) and Harmonic Power (HP)

The degree of functional coupling and the harmonic power could be computed using the dfc function as shown below.

The DFC algorithm is a bit complicated. It’s, therefore, needed that we clarify few points about some computing considerations and also about the arguments of the function itself:

The user does not need to worry about looping over days or extracting the Lomb Scargle periodogram for every X (rolling window) days and then compile the results to obtain the degree of functional coupling. This is done in loop inside the dfc function. However, there is also a function call lomb_scargle_periodogram where the user can investigate the activity a little bit deeper. We preview the lomb_scargle_periodogram function and its output, then we go to the dfc function.

df <- data[1:672, c("datetime", activity)]
my_lsp <- lomb_scargle_periodogram(df, alpha = 0.01, plot = TRUE)
#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 8 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

In the above plot, we see plenty of information. First, we have the whole periodogram for the dataframe df visualized. Second, we can distinguish between harmonic and non harmonic frequencies. Harmonic frequencies are plotted in blue and tagged with the time period they correspond to. For instance, we can check the power of the 24h cycles, 12h cycles, 6h cycles and so on. Third, we have a dotted horizontal line that makes it easy to visually check which frequencies are considered to originated from noise rather than from a actual signal. Frequency bars that make it above this line are considered to be originated from a real activity. The probability of this event is calculated using the method of Baluev (2008). The plot also shows, as title, the activity time span used for the computation. Warning: At the moment, function only computes the LSP the first 7 days of the data. A loop, to calculate LSP for the whole data, will be included in a later version. However, at the moment user can see the LSP-diagrams of the whole data, if running the dfc function. Before the complete DFC and HP diagram, each LSP diagram of the sliding 7-day periods were computed.

Now, to the DFC. The below plot shows the DFC and HP in the same graph. Both variables are percentages.

my_dfc <- dfc(data, # The dataset
  activity = activity, # the name of the activity column
  sampling = 15, # the sampling frequency of my dataset is 15
  alpha = 0, 5, # significance level
  harm_cutoff = 12, # up till the harmonic 24/12 which is two hours
  plot = FALSE, verbose = FALSE
)
#> [1] "Sampling DFC85 :  15"
#>              datetime Motion.Index Steps
#> 1 2020-08-25 00:00:00           20     8
#> 2 2020-08-25 00:15:00           52    46
#> 3 2020-08-25 00:30:00           61    39
#> 4 2020-08-25 00:45:00           29    18
#> 5 2020-08-25 01:00:00           83    26
#> 6 2020-08-25 01:15:00           50    23
#> [1] 42
#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly

#> v Correct time format: First column has a POSIXct Format 
#> v Number of days good for DFC: 6 days >= 2 days 
#> v Correct numeric format - Column 2 ==> Steps 
#> The data is digiRhythm friendly