Importing data from DSI Ponemah software

Andrew Stiegler

2020-03-02

This vignette will show an example of importing data collected with a DSI telemetry system running Ponemah software into R. The first step is to export data from the DSI telemetry system.

Importing DSI data

First data must be exported from DSI’s Ponemah software.

To export data: with an experiment open, navigate to Experiment > Export Data. In this pop-up, select subjects to export, a timerange to export, and make sure to un-check “Pivot Compatible Sheets”

Screenshot of DSI Ponemah export screen

Screenshot of DSI Ponemah export screen

Select “Export” and an Excel file will be generated. To import that Excel file into R, utilize the DSI_export_to_dataframe function:

exported_data <- DSI_export_to_dataframe('path_to_DSI_export')

A progress message will be displayed showing the current import status.

The output of the file is a dataframe:

# Sample dataframe is included as sample_BP_data:
head(sample_BP_data)
#>       .id                Time TimesOnly ElapsedTime ElapsedTimeMin ElapsedTimeH
#> 1 1024071 2019-12-11 06:00:00  06:00:00           0              0   0.00000000
#> 2 1024071 2019-12-11 06:02:00  06:02:00         120              2   0.03333333
#> 3 1024071 2019-12-11 06:04:00  06:04:00         240              4   0.06666667
#> 4 1024071 2019-12-11 06:06:00  06:06:00         360              6   0.10000000
#> 5 1024071 2019-12-11 06:08:00  06:08:00         480              8   0.13333333
#> 6 1024071 2019-12-11 06:10:00  06:10:00         600             10   0.16666667
#>   ElapsedTimeD      SBP      DBP      MAP       HR     Temp     Activity
#> 1  0.000000000 110.6964 79.31778 89.77731 462.3699 34.33864 0.0009920789
#> 2  0.001388889 113.8884 82.62399 93.04547 524.8341 34.47567 0.0009920789
#> 3  0.002777778 107.9296 75.63431 86.39940 524.5176 34.66993 0.0009920789
#> 4  0.004166667 114.6534 81.35150 92.45214 484.7397 34.71082 0.0009920789
#> 5  0.005555556 109.3143 77.12240 87.85303 465.4864 34.67818 0.0009920789
#> 6  0.006944444 107.8810 75.94124 86.58783 474.8547 34.66138 0.0009920789

Where the .id column indicates the subject serial number, and the Time column is the real time of data acquisition. Several useful time columns are generated, including a column for time-of-day only, and elapsed time since acquisition started in several units. The rest of the telemetry parameters are named.

After importing data

Several functions are available for data processing after import. The functions typical_day and circadian_avg both take the newly created dataframe as input.

To calculate a typical day:

# In our sample dataset, room lights turn on at 6AM
sample_typical_day <- typical_day(data = sample_BP_data, lights_on = 6, 
                                  progressbar = FALSE)
head(sample_typical_day)
#> # A tibble: 6 x 93
#>   Time  `1024071SBP` `1024071DBP` `1024071MAP` `1024071HR` `1024071Temp`
#>   <ITi>        <dbl>        <dbl>        <dbl>       <dbl>         <dbl>
#> 1 06:0~         122.         88.8         99.9        483.          34.6
#> 2 06:0~         118.         86.0         96.7        486.          34.6
#> 3 06:0~         113.         80.9         91.7        469.          34.7
#> 4 06:0~         117.         85.5         96.0        487.          34.8
#> 5 06:0~         123.         90.6        101.         505.          34.8
#> 6 06:1~         114.         80.2         91.5        458.          34.9
#> # ... with 87 more variables: `1024071Activity` <dbl>, `1024084SBP` <dbl>,
#> #   `1024084DBP` <dbl>, `1024084MAP` <dbl>, `1024084HR` <dbl>,
#> #   `1024084Temp` <dbl>, `1024084Activity` <dbl>, `1033468SBP` <dbl>,
#> #   `1033468DBP` <dbl>, `1033468MAP` <dbl>, `1033468HR` <dbl>,
#> #   `1033468Temp` <dbl>, `1033468Activity` <dbl>, `1033470SBP` <dbl>,
#> #   `1033470DBP` <dbl>, `1033470MAP` <dbl>, `1033470HR` <dbl>,
#> #   `1033470Temp` <dbl>, `1033470Activity` <dbl>, `1033478SBP` <dbl>,
#> #   `1033478DBP` <dbl>, `1033478MAP` <dbl>, `1033478HR` <dbl>,
#> #   `1033478Temp` <dbl>, `1033478Activity` <dbl>, `1033480SBP` <dbl>,
#> #   `1033480DBP` <dbl>, `1033480MAP` <dbl>, `1033480HR` <dbl>,
#> #   `1033480Temp` <dbl>, `1033480Activity` <dbl>, `1037725SBP` <dbl>,
#> #   `1037725DBP` <dbl>, `1037725MAP` <dbl>, `1037725HR` <dbl>,
#> #   `1037725Temp` <dbl>, `1037725Activity` <dbl>, `1037726SBP` <dbl>,
#> #   `1037726DBP` <dbl>, `1037726MAP` <dbl>, `1037726HR` <dbl>,
#> #   `1037726Temp` <dbl>, `1037726Activity` <dbl>, `1037727SBP` <dbl>,
#> #   `1037727DBP` <dbl>, `1037727MAP` <dbl>, `1037727HR` <dbl>,
#> #   `1037727Temp` <dbl>, `1037727Activity` <dbl>, `1037728SBP` <dbl>,
#> #   `1037728DBP` <dbl>, `1037728MAP` <dbl>, `1037728HR` <dbl>,
#> #   `1037728Temp` <dbl>, `1037728Activity` <dbl>, `1080808SBP` <dbl>,
#> #   `1080808DBP` <dbl>, `1080808MAP` <dbl>, `1080808HR` <dbl>,
#> #   `1080808Temp` <dbl>, `1080808Activity` <dbl>, `814438SBP` <dbl>,
#> #   `814438DBP` <dbl>, `814438MAP` <dbl>, `814438HR` <dbl>, `814438Temp` <dbl>,
#> #   `814438Activity` <dbl>, `848072SBP` <dbl>, `848072DBP` <dbl>,
#> #   `848072MAP` <dbl>, `848072HR` <dbl>, `848072Temp` <dbl>,
#> #   `848072Activity` <dbl>, `865262SBP` <dbl>, `865262DBP` <dbl>,
#> #   `865262MAP` <dbl>, `865262HR` <dbl>, `865262Temp` <dbl>,
#> #   `865262Activity` <dbl>, `967522SBP` <dbl>, `967522DBP` <dbl>,
#> #   `967522MAP` <dbl>, `967522HR` <dbl>, `967522Temp` <dbl>,
#> #   `967522Activity` <dbl>, LightsTime <dbl>, LightsOn <chr>

To calculate circadian averages:

# In our sample dataset, room lights turn on at 6AM
sample_circadian_avg <- circadian_avg(data = sample_BP_data, lights_on = 6)
head(sample_circadian_avg[[1]])
#> # A tibble: 4 x 91
#>    Time `1024071SBP` `1024071DBP` `1024071MAP` `1024071Temp` `1024071HR`
#>   <int>        <dbl>        <dbl>        <dbl>         <dbl>       <dbl>
#> 1     1         128.         96.0         107.          536.        35.4
#> 2     2         129.         97.0         108.          556.        35.3
#> 3     3         128.         95.0         106.          521.        35.2
#> 4     4         129.         97.5         108.          539.        35.4
#> # ... with 85 more variables: `1024071Activity` <dbl>, `1024084SBP` <dbl>,
#> #   `1024084DBP` <dbl>, `1024084MAP` <dbl>, `1024084Temp` <dbl>,
#> #   `1024084HR` <dbl>, `1024084Activity` <dbl>, `1033468SBP` <dbl>,
#> #   `1033468DBP` <dbl>, `1033468MAP` <dbl>, `1033468Temp` <dbl>,
#> #   `1033468HR` <dbl>, `1033468Activity` <dbl>, `1033470SBP` <dbl>,
#> #   `1033470DBP` <dbl>, `1033470MAP` <dbl>, `1033470Temp` <dbl>,
#> #   `1033470HR` <dbl>, `1033470Activity` <dbl>, `1033478SBP` <dbl>,
#> #   `1033478DBP` <dbl>, `1033478MAP` <dbl>, `1033478Temp` <dbl>,
#> #   `1033478HR` <dbl>, `1033478Activity` <dbl>, `1033480SBP` <dbl>,
#> #   `1033480DBP` <dbl>, `1033480MAP` <dbl>, `1033480Temp` <dbl>,
#> #   `1033480HR` <dbl>, `1033480Activity` <dbl>, `1037725SBP` <dbl>,
#> #   `1037725DBP` <dbl>, `1037725MAP` <dbl>, `1037725Temp` <dbl>,
#> #   `1037725HR` <dbl>, `1037725Activity` <dbl>, `1037726SBP` <dbl>,
#> #   `1037726DBP` <dbl>, `1037726MAP` <dbl>, `1037726Temp` <dbl>,
#> #   `1037726HR` <dbl>, `1037726Activity` <dbl>, `1037727SBP` <dbl>,
#> #   `1037727DBP` <dbl>, `1037727MAP` <dbl>, `1037727Temp` <dbl>,
#> #   `1037727HR` <dbl>, `1037727Activity` <dbl>, `1037728SBP` <dbl>,
#> #   `1037728DBP` <dbl>, `1037728MAP` <dbl>, `1037728Temp` <dbl>,
#> #   `1037728HR` <dbl>, `1037728Activity` <dbl>, `1080808SBP` <dbl>,
#> #   `1080808DBP` <dbl>, `1080808MAP` <dbl>, `1080808Temp` <dbl>,
#> #   `1080808HR` <dbl>, `1080808Activity` <dbl>, `814438SBP` <dbl>,
#> #   `814438DBP` <dbl>, `814438MAP` <dbl>, `814438Temp` <dbl>, `814438HR` <dbl>,
#> #   `814438Activity` <dbl>, `848072SBP` <dbl>, `848072DBP` <dbl>,
#> #   `848072MAP` <dbl>, `848072Temp` <dbl>, `848072HR` <dbl>,
#> #   `848072Activity` <dbl>, `865262SBP` <dbl>, `865262DBP` <dbl>,
#> #   `865262MAP` <dbl>, `865262Temp` <dbl>, `865262HR` <dbl>,
#> #   `865262Activity` <dbl>, `967522SBP` <dbl>, `967522DBP` <dbl>,
#> #   `967522MAP` <dbl>, `967522Temp` <dbl>, `967522HR` <dbl>,
#> #   `967522Activity` <dbl>

Output from typical_day or circadian_avg can be plotted using ggplot:

# To plot typical SBP. first isolate SBP
sample_typical_sbp <- isolate_typical(data = sample_typical_day, 
                                      parameter = "SBP")
# Create a column for mean SBP
sample_typical_sbp$mean <- sample_typical_sbp %>% dplyr::select(-Time) %>% 
  rowMeans()

# Plot the mean against time in hours
ggplot(data = sample_typical_sbp)+
  geom_point(aes(x=Time/3600, y=mean))+
  ylab("Mean SBP (mmHg)")+
  xlab("Time (h)")+
  theme_classic()
#> Don't know how to automatically pick scale for object of type ITime. Defaulting to continuous.


# The second list element contains values when room is dark
sample_circadian_dark <- sample_circadian_avg[[2]]
# Isolate SBP
sample_circadian_dark_sbp <- isolate_typical(data = sample_circadian_dark, 
                                             parameter = "SBP")
# Create a column for mean SBP
sample_circadian_dark_sbp$mean <- sample_circadian_dark %>% 
  dplyr::select(-Time) %>% rowMeans()

# Plot the mean against time in days
ggplot(data = sample_circadian_dark_sbp)+
  geom_line(aes(x=Time, y=mean))+
  ylab("Mean SBP 12H-Dark (mmHg)")+
  xlab("Time (d)")+
  theme_classic()