## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 4.5, dpi = 110 ) ## ----libraries, message = FALSE, warning = FALSE------------------------------ library(actiRhythm) library(ggplot2) ## ----read--------------------------------------------------------------------- agd <- agd.counts(read.agd(example_agd(1), verbose = FALSE)) head(agd[, c("timestamp", "axis1")]) ## ----actogram, fig.height = 5, fig.cap = "Double-plotted actogram: each row is one day shown twice across 48 hours, so a stable rhythm forms a vertical band of activity at the same clock time each day; scattered fill marks a fragmented or shifting rhythm."---- plot_actogram(agd$axis1, agd$timestamp) ## ----rhythm------------------------------------------------------------------- rhythm <- circadian.rhythm(agd$axis1, agd$timestamp) rhythm ## ----cosinor------------------------------------------------------------------ cos <- cosinor.analysis(agd$axis1, agd$timestamp, period = 24) c(mesor = unname(cos$mesor), amplitude = unname(cos$amplitude), acrophase = unname(cos$acrophase)) ## ----rhythmicity-------------------------------------------------------------- rhythmicity.test(agd$axis1, agd$timestamp, cosinor_result = cos) ## ----cosinor-plot, fig.cap = "Hourly activity with the fitted 24-hour cosine overlaid; the peak of the curve is the acrophase and its height above the MESOR line is the amplitude. Systematic departures from the curve are where a single cosine is too smooth for real rest-activity data."---- plot_extended_cosinor(agd$axis1, agd$timestamp) ## ----period------------------------------------------------------------------- per <- circadian.period(agd$axis1, agd$timestamp) c(tau = per$tau, p_value = per$p_value) ## ----period-ci---------------------------------------------------------------- period.ci(agd$axis1, agd$timestamp, n_boot = 50, seed = 1) ## ----periodogram, fig.cap = "Lomb-Scargle spectral power across candidate periods; the tallest peak is the dominant rhythm, and a peak rising above the significance line rejects the no-rhythm null."---- plot_periodogram(agd$axis1, agd$timestamp) ## ----chisq, fig.cap = "Chi-square (Sokolove-Bushell) periodogram: the Qp statistic against trial period, with the significance threshold. The peak should fall at the period the Lomb-Scargle periodogram found."---- plot_chisq(agd$axis1, agd$timestamp) ## ----spectrogram, fig.height = 4, fig.cap = "Period (vertical) against time (horizontal), coloured by spectral power. A horizontal band of colour is a stable period; a band that bends upward or downward is a rhythm lengthening or shortening across the recording."---- circadian.spectrogram(agd$axis1, agd$timestamp, step_hours = 24)$plot ## ----dfa---------------------------------------------------------------------- fractal.dfa(agd$axis1)$alpha ## ----dfa-plot, fig.cap = "Detrended fluctuation on log-log axes; the slope is the DFA exponent alpha. One straight line is monofractal scaling, a visible kink is a crossover between short- and long-range dynamics."---- plot_dfa(agd$axis1) ## ----transitions-------------------------------------------------------------- st <- state.transitions(agd$axis1) c(kRA = st$kRA, kAR = st$kAR) ## ----changepoints------------------------------------------------------------- cp <- sleep.changepoints(agd$axis1, agd$timestamp) cp ## ----cp-plot, fig.height = 3.5, fig.cap = "Each detected sleep onset (blue) and wake onset (orange) by date and clock time. The detector reads the per-night sleep and wake timing directly from the counts."---- cps <- cp$changepoints cps$clock <- as.numeric(format(cps$time, "%H")) + as.numeric(format(cps$time, "%M")) / 60 ggplot(cps, aes(time, clock, colour = type)) + geom_point(size = 3) + scale_colour_manual(values = c("sleep onset" = "#236192", "wake onset" = "#E69F00")) + labs(x = "Date", y = "Clock hour", colour = NULL) + theme_actiRhythm() ## ----restperiods-------------------------------------------------------------- rp <- rest.periods(agd$axis1, agd$timestamp) rp ## ----restperiods-plot, fig.height = 3, fig.cap = "Each consolidated rest bout as a bar from onset to offset. Detecting more than one bout a day, including naps, is what separates this from the one-per-cycle change-point detector."---- ggplot(rp$rest_periods, aes(onset, bout, xend = offset, yend = bout, colour = type)) + geom_segment(linewidth = 3) + scale_colour_manual(values = c(main = "#236192", nap = "#E69F00")) + labs(x = "Time", y = "Rest bout", colour = NULL) + theme_actiRhythm() ## ----scoring------------------------------------------------------------------ state <- sleep.cole.kripke(agd$axis1) table(state) ## ----sri---------------------------------------------------------------------- sleep.regularity.index(state, agd$timestamp) ## ----consensus---------------------------------------------------------------- consensus.rhythmicity(agd$axis1, agd$timestamp) ## ----summary------------------------------------------------------------------ data.frame( IS = rhythm$IS, IV = rhythm$IV, RA = rhythm$RA, tau = per$tau, amplitude = cos$amplitude, acrophase = cos$acrophase, dfa_alpha = fractal.dfa(agd$axis1)$alpha ) ## ----batch-------------------------------------------------------------------- batch <- circadian.batch( system.file("extdata", package = "actiRhythm"), verbose = FALSE ) batch[, c("file", "IS", "IV", "RA", "period_tau", "rhythm_p_value")] ## ----workbook, eval = FALSE--------------------------------------------------- # circadian.workbook(agd$axis1, agd$timestamp, file = "subject01.xlsx")