High MVPA values using Roscoe et al. intensity thresholds

154 views
Skip to first unread message

Sarah Burkart

unread,
Apr 1, 2022, 6:36:23 PM4/1/22
to R package GGIR
Hi all,

I'm processing 24-hour data collected with the Axivity AX3 worn on the non-dominant wrist in children ages 3-5 using the Roscoe et al. intensity thresholds. Our data show very high values (~11 hours MVPA/day). Has anyone else experienced this? The code is listed below:

library(GGIR)
g.shell.GGIR(
  mode=c(3:5),
  datadir=datadir",
  outputdir=outputdir,
  g.cwaread("D:/Axivity/Downloaded Files),

 
  do.report=c(2,4,5),
  do.enmoa = TRUE, 
  do.enmo = FALSE,  
  strategy = 2,              
  includedaycrit = 16,
  windowsizes = c(5,900,3600),
  winhr = c(5,10),
  qlevels = c(c(1380/1440),c(1410/1440)),
  qwindow=c(0,24),
  ilevels = c(seq(0,400,by=50),8000),
  mvpathreshold =c(104),
  bout.metric = 6,
  overwrite= TRUE,
  epochvalues2csv= TRUE,
  #=====================
  # Part 3 + 4
  #=====================
  timethreshold= c(5),        anglethreshold=5,
  acc.metric="ENMOa",
  ignorenonwear = TRUE,
  excludefirstlast = FALSE,
  includenightcrit = 4,
  def.noc.sleep = 1,
  outliers.only = TRUE,
  criterror = 4,
  relyonsleeplog = FALSE,
  do.visual = TRUE,

  #=====================
  # Part 5
  #=====================
  threshold.lig = c(61.8),
  threshold.mod = c(100.4),
  threshold.vig=(1004),
  boutcriter = 0.8,      boutcriter.in = 0.9,     boutcriter.lig = 0.8,
  boutcriter.mvpa = 0.8, boutdur.in = c(1), boutdur.lig = c(1),
  boutdur.mvpa = c(1), save_ms5rawlevels = TRUE,
  #=====================
  # Visual report
  #=====================
  timewindow = c("WW"),
  visualreport=TRUE)

Vincent van Hees

unread,
Apr 6, 2022, 5:45:26 AM4/6/22
to Sarah Burkart, R package GGIR
Hi Sarah,

  1. Do I understand correctly that you see this consistently across the devices used in your study. If it would be one recording then I suspect something is wrong with the sensor calibration. What is the calibration error reported in part2_summary.csv? If it is consistent across your dataset then one possibility may be that Actigraph's idle sleep mode with zero string imputation is causes problems, because if there are only zeros and GGIR subtracts 1 and then takes the absolute (as is the case in ENMOa) you will get a consistent acceleration with magnitude of gravity during idle.sleep.mode periods.
  2. Which form of raw data did you use?
    • .gt3x directly
    • .csv exported via Actilife
    • .csv exported in another way
  1. Did you use GGIR 2.6-0 or high to process the data?

The threshold of 100.4 you specify does not sound too radical to me.

So, one thing you could try is to reprocess a few files with .gt3x data as input and with latest GGIR version 2.6-0 or higher.

Thanks,
Vincent

------- Original Message -------
--
You received this message because you are subscribed to the Google Groups "R package GGIR" group.
To unsubscribe from this group and stop receiving emails from it, send an email to RpackageGGIR...@googlegroups.com.
To view this discussion on the web, visit https://groups.google.com/d/msgid/RpackageGGIR/9f0ba7b6-caca-46db-9011-ac74db9564c7n%40googlegroups.com.

Sarah Burkart

unread,
Apr 10, 2022, 8:56:36 PM4/10/22
to R package GGIR
Hi Vincent,

Yes, this is consistent across devices. The calibration error in part 2 summary csv is consistently 0, with the exception of 4 devices with values <0.009. These files are from Axivity AX3 devices, so idle sleep mode shouldn't be an issue. 
2. Raw cwa files were exported from Open Movement and read directly into GGIR with g.cwaread.
3.  GGIR 2.6-0 was used.

Thanks,
Sarah

Vincent van Hees

unread,
Apr 18, 2022, 5:22:55 AM4/18/22
to Sarah Burkart, R package GGIR
Hi Sarah,​

calibration error in part 2 summary csv is consistently 0

What does QC_message in the column next to it say? Zero may mean that autocalibration was not attempted. Auto-calibration is usually difficult when accelerometer is hardly worn. Maybe try turning of autocalibration?

Try using another acceleration thresholds, e.g. the once based ENMO, even if it is actually intended for a different age group.

If all of that does not work then maybe best to talk to manufacturer to get them to verify that accelerometers are working correctly.

Vincent

Dr. Vincent van Hees | Independent consultant | https://accelting.com/
image

------- Original Message -------

Vincent van Hees

unread,
May 3, 2022, 7:52:44 AM5/3/22
to Vincent van Hees, Sarah Burkart, R package GGIR
Hi Sarah,

Here are some additional reflections:

  • Compare the algorithm presented in the original paper with https://cran.r-project.org/web/packages/GGIR/vignettes/GGIR.html#235_Published_cut-points_and_how_to_use_them, and verify that you understand the difference, and agree that the output should be consistent. If anything is unclear or if you think that GGIR is inconsistent with the original paper then please let us know.
  • As I describe in the vignette, most cut-point studies are vague about their sensor calibration by which there is a chance that published cut-points may be affected by calibration error. Also the inconsistent use of idle sleep mode in ActiGraph may play a role.
  • Consider contacting the original authors of those studies to ask whether they know whether their cut-points have successfully been used in other studies including plausible MVPA estimates.

Thanks,
Vincent


Dr. Vincent van Hees | Independent consultant | https://accelting.com/
image

------- Original Message -------

Vincent van Hees

unread,
May 3, 2022, 8:03:04 AM5/3/22
to Vincent van Hees, Sarah Burkart, R package GGIR
... oh I see, I think the brackets are incorrect in the vignette:

threshold.lig = (LightCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000
threshold.mod = (ModerateCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000
threshold.vig = (VigorousCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000
mvpathreshold = (ModerateCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000

should be

threshold.lig = ((LightCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000
threshold.mod = ((ModerateCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000
threshold.vig = ((VigorousCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000
mvpathreshold = ((ModerateCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000


Vincent


------- Original Message -------

Vincent van Hees

unread,
May 3, 2022, 8:10:49 AM5/3/22
to Vincent van Hees, Sarah Burkart, R package GGIR
... oh I see, I think the brackets are incorrect in the vignette:

threshold.lig = (LightCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000
threshold.mod = (ModerateCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000
threshold.vig = (VigorousCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000
mvpathreshold = (ModerateCutPointFromPaper_in_gmins/(sampleRateInStudy*60)) * 1000

should be

threshold.lig = ((LightCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000
threshold.mod = ((ModerateCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000
threshold.vig = ((VigorousCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000
mvpathreshold = ((ModerateCutPointFromPaper_in_gmins/sampleRateInStudy)*60) * 1000

Vincent

Although. this is specific to Esliger 2011, Phillips 2013, Fraysse 2020, Dibben2020: and does not affect Roscoe.

------- Original Message -------
Reply all
Reply to author
Forward
0 new messages