Last updated: 2026-04-29 09:00:24 using pinned data version from: 2026-04-28 20:48:02
Users can load data by running (requires one-time google drive authentication):
Code
library(tidyverse)
library(pins)
library(nanoparquet)
library(googledrive)
ds <- board_gdrive(path = as_id("1OZlphhu6vYm1A2Bm2-zD7a4luS5nGWgS")) %>%
  pin_read("imu_raw_samples")

Usable data

Code
usable_data <- ds %>% count(id, session) %>% mutate(usable_hours = n/3600)
recording_duration <- ds %>% group_by(id, session) %>% 
  mutate(recording_hours = as.numeric(time_leg_off - time_leg_on)) %>% 
  slice_head(n = 1) %>% ungroup
  
usable_data %>% left_join(recording_duration) %>% 
  get_summary_stats(usable_hours, recording_hours, show = c("mean", "sd","min","max")) %>% 
  flextable() %>% autofit()

Usable data and total recording length in hours

variable

n

mean

sd

min

max

usable_hours

23

6.605

1.526

4.432

9.466

recording_hours

23

10.605

1.426

7.533

12.400

Code
usable_data  %>% 
  ggplot(aes(x = usable_hours)) + 
  geom_histogram() + 
  scale_x_binned(name = "Hours", limits = c(2,14))
recording_duration  %>% 
  ggplot(aes(x = recording_hours)) + 
  geom_histogram() + 
  scale_x_binned(name = "Hours", limits = c(2,14))

Usable hours after exclusions

Usable hours after exclusions

Recording length in hours

Recording length in hours

Infant Position Frequency by Age (Overall)

Code
ds_sum <- ds %>% group_by(id, session) %>% 
  mutate(total_samples = n()) %>% group_by(id, session, pos) %>% 
  summarize(pos_n  = n(), total_samples = mean(total_samples)) %>% ungroup
ds_sum <- ds_sum %>% complete(nesting(id, session), pos, fill = list(pos_n = 0, total_samples = 1))
ds_sum$pos_prop = ds_sum$pos_n/ds_sum$total_samples*100
ds_sum$session = as.numeric(ds_sum$session)

ds_sum %>% group_by(pos, session) %>% 
  get_summary_stats(pos_prop, show = c("mean", "sd","min","max")) %>% 
  select(-variable) %>% flextable() %>% autofit()

Position summary statistics

session

pos

n

mean

sd

min

max

1

Supine

12

24.645

16.808

8.322

58.046

2

Supine

7

12.872

8.251

3.956

26.262

3

Supine

4

12.305

11.304

1.922

25.343

1

Prone

12

21.262

13.823

2.168

53.195

2

Prone

7

9.581

4.239

3.257

15.002

3

Prone

4

12.236

2.590

10.127

15.904

1

Sitting

12

32.451

13.768

12.819

53.703

2

Sitting

7

45.813

11.220

32.400

60.394

3

Sitting

4

35.892

8.042

25.139

44.118

1

Standing

12

10.361

8.775

1.326

33.114

2

Standing

7

20.350

7.713

8.784

31.995

3

Standing

4

30.361

7.806

20.757

38.755

1

Held

12

11.282

4.832

3.704

20.746

2

Held

7

11.383

5.555

3.105

19.508

3

Held

4

9.206

5.645

3.273

15.978

Code
ggplot(ds_sum, aes(x = session, y = pos_prop, color = pos)) + 
  stat_summary(position = position_dodge(.1)) + 
  stat_summary(geom = "line", position = position_dodge(.1)) + 
  ylim(0,101) + ylab("% of time") + xlab("Session") +
  scale_x_continuous(breaks = 1:3, labels = c("7 mo","9 mo","11 mo"), limits = c(0.5,3.5)) + 
  scale_color_manual(values = pal, name ="") + 
  theme(legend.position = "bottom")
ggplot(ds_sum, aes(x = session, y = pos_prop, fill = pos)) + 
  stat_summary(geom = "bar", position = "stack") + 
  ylim(0,101) + ylab("% of time") + xlab("Session") +
  scale_x_continuous(breaks = 1:3, labels = c("7 mo","9 mo","11 mo"), limits = c(0.5,3.5)) + 
  scale_fill_manual(values = pal, name ="") + 
  theme(legend.position = "bottom")

Position means and SE

Position means and SE

Position distribution

Position distribution

Infant Position Frequency by Age (Individual)

Code
ggplot(ds_sum, aes(x = session, y = pos_prop, color = pos, group = id)) + 
  facet_wrap(~ pos) + 
  geom_point() + geom_line() +  
  ylim(0,100) + ylab("% of time") + xlab("Session") +
  scale_x_continuous(breaks = 1:3, labels = c("7 mo","9 mo","11 mo"), limits = c(0.5,3.5)) + 
  scale_color_manual(values = pal, name ="") + 
  theme(legend.position = "none")