Determinants of Sleep Duration in the American Time Use Survey

Author

Dennis Baidoo

Published

June 21, 2025

Abstract

This study investigates the factors influencing sleep duration using data from the American Time Use Survey (ATUS) between 2003 and 2021. Employing linear regression with stepwise selection based on Akaike Information Criterion (AIC), we analyzed demographic, socioeconomic, and behavioral predictors of sleep duration. The initial model incorporated main effects, with subsequent refinement through stepwise selection. Key findings reveal significant associations between sleep duration and age, sex, education level, work hours, household composition, and an interaction between time spent alone and time spent with family members. Diagnostic procedures included outlier removal and variable transformations to ensure model validity. The results demonstrate how analytical choices—including sample selection, starting model specification, and selection criteria—affect model outcomes, highlighting the importance of methodological transparency in observational studies of human behavior.

1. Introduction

Sleep constitutes a fundamental biological process with profound implications for physical health, cognitive function, and overall quality of life. Understanding the determinants of sleep duration remains an important area of research in public health and social science. The American Time Use Survey (ATUS), conducted by the U.S. Bureau of Labor Statistics, provides comprehensive data on how Americans allocate their time across various activities, including sleep. This rich dataset enables researchers to examine how demographic characteristics, socioeconomic factors, and daily behaviors relate to sleep patterns.

The current analysis examines sleep duration using a subset of ATUS data from 2003 to 2021, focusing specifically on employed individuals who reported sleep durations within a biologically plausible range. Beyond identifying significant predictors of sleep duration, this study emphasizes how methodological decisions throughout the analytical process—including sample selection criteria, choice of starting model, and model selection approach—can influence research findings. This focus on analytical transparency contributes to ongoing discussions about reproducibility and best practices in statistical modeling of behavioral data.

2. Methods

2.1 Data Source and Sample Selection

The analysis utilized data from the ATUS 2003–2021 Multi-Year Microdata Files, accessed through the erikdata R package. The initial dataset included information on time use, demographic characteristics, and employment metrics for a nationally representative sample of U.S. residents. The analytical sample was restricted to 500 randomly selected observations of employed individuals who reported positive sleep durations between 5 and 12 hours per day, representing biologically plausible values for adult sleep. Additional exclusions removed influential observations (case IDs: 87, 250, 371, 436) identified through diagnostic procedures.

2.2 Variables and Transformations

The response variable was daily sleep duration in hours (t0101), derived from original minute values divided by 60. Predictor variables included demographic characteristics (sex, age, metropolitan residence status), socioeconomic factors (educational attainment, hourly earnings), and behavioral measures (weekly work hours, household composition, time allocation).

Notable data transformations included converting the hourly earnings variable (TRERNHLY) into a binary indicator (≤ $5,000 vs. > $5,000) to address right-skewness in the distribution. Educational attainment (PEEDUCA) was converted from categorical to numerical values representing approximate years of schooling. All continuous predictors were examined for outliers and extreme values that might violate model assumptions.

2.3 Analytical Approach

The modeling strategy followed a structured process informed by personalized analysis conditions derived from researcher characteristics. The analysis began with a main effects model (specified by birth date conditions), which included all candidate predictors without interaction terms. Model selection proceeded via stepwise regression using AIC (Akaike Information Criterion) as the selection metric, as determined by birth month conditions.

The stepwise procedure evaluated both forward and backward steps, allowing terms to enter or leave the model based on their contribution to model fit as measured by AIC. This approach balanced model complexity with explanatory power, following the principle of parsimony. Final model selection considered both statistical criteria and substantive interpretability of the predictors.

Diagnostic procedures included examination of residual plots, tests for heteroscedasticity, variance inflation factors for multicollinearity assessment, and leverage statistics to identify influential observations. The Box-Cox transformation procedure confirmed that no power transformation of the response variable was necessary (λ ≈ 1), supporting the use of untransformed sleep hours in the linear model.

3. Results

3.1 Final Model Specification

The selected model explained approximately 9.5% of the variance in sleep duration (R² = 0.095, adjusted R² = 0.078). This moderate explanatory power suggests that while the identified predictors have statistically significant associations with sleep duration, substantial variability remains unexplained—a common finding in behavioral research where numerous unmeasured factors may influence outcomes.

 remotes::install_github("erikerhardt/erikdata")
Skipping install of 'erikdata' from a github remote, the SHA1 (4933d345) has not changed since last install.
  Use `force = TRUE` to force installation
# example: EE and 14th becomes 050514, where each E = 05th letter of the alphabet
condition_1_seed <- 040217
# example: 14th becomes "Main effects", that's the 2nd index
condition_2_init_model <- c("Mean", "Main effects", "Two-way interaction")[2]
# example: December is 12th month, giving "BIC", that's the 2nd index
condition_3_criterion <- c("AIC", "BIC")[1]
n_analysis <- 500
library(erikmisc)
library(tidyverse)
ggplot2::theme_set(ggplot2::theme_bw())  # set theme_bw for all plots
library(erikdata)   # ATUS data, install with devtools::install_github("erikerhardt/erikdata")
library(labelled)   # for variabel labels, use: var_label(dat_atus$TUCASEID)
set.seed(condition_1_seed)  # must run prior to dplyr::slice_sample() to draw the same sample

dat_atus <-
  erikdata::dat_atus |>
  dplyr::select(
    TUCASEID
  , t0101, TESEX, TEAGE, GTMETSTA, PEEDUCA, TRERNHLY, TEHRUSL1, TEHRUSL2, TRHHCHILD, TRTALONE, TRTHHFAMILY
  )

# list of variables with their labels
labels_dat_atus |>
  dplyr::filter(
    Var %in% names(dat_atus)
  )
# A tibble: 12 × 2
   Var         Label                                                            
   <chr>       <chr>                                                            
 1 TUCASEID    ATUS Case ID (14-digit identifier)                               
 2 TESEX       Edited: sex                                                      
 3 TEAGE       Edited: age                                                      
 4 GTMETSTA    Metropolitan status (2000 or 2010 definitions, see note)         
 5 PEEDUCA     Edited: what is the highest level of school you have completed o…
 6 TRERNHLY    Hourly earnings (2 implied decimals)                             
 7 TRHHCHILD   Presence of household children < 18                              
 8 TRTALONE    Total time respondent spent alone (in minutes)                   
 9 TRTHHFAMILY Total time respondent spent with household family members (in mi…
10 TEHRUSL1    Edited: how many hours per week do you usually work at your main…
11 TEHRUSL2    Edited: how many hours per week do you usually work at your othe…
12 t0101       Sleeping                                                         
dat_atus <-
  dat_atus |>
  dplyr::filter(
    TRERNHLY > 0    # only people who work and earn an hourly wage
  , t0101 > 0       # only people who went to sleep
  ) |>
  dplyr::mutate(
    t0101 = t0101 / 60  # convert minutes to hours
  , PEEDUCA_num =
      case_when(
        PEEDUCA == "Less than 1st grade"                                ~  0   #  1
      , PEEDUCA == "1st, 2nd, 3rd, or 4th grade"                        ~  2.5 #  2
      , PEEDUCA == "5th or 6th grade"                                   ~  5.5 #  3
      , PEEDUCA == "7th or 8th grade"                                   ~  7.5 #  4
      , PEEDUCA == "9th grade"                                          ~  9   #  5
      , PEEDUCA == "10th grade"                                         ~ 10   #  6
      , PEEDUCA == "11th grade"                                         ~ 11   #  7
      , PEEDUCA == "12th grade - no diploma"                            ~ 12   #  8
      , PEEDUCA == "High school graduate - diploma or equivalent (GED)" ~ 12   #  9
      , PEEDUCA == "Some college but no degree"                         ~ 13   # 10
      , PEEDUCA == "Associate degree - occupational/vocational"         ~ 14   # 11
      , PEEDUCA == "Associate degree - academic program"                ~ 14   # 12
      , PEEDUCA == "Bachelor's degree (BA, AB, BS, etc.)"               ~ 16   # 13
      , PEEDUCA == "Master's degree (MA, MS, MEng, MEd, MSW, etc.)"     ~ 18   # 14
      , PEEDUCA == "Professional school degree (MD, DDS, DVM, etc.)"    ~ 21   # 15
      , PEEDUCA == "Doctoral degree (PhD, EdD, etc.)"                   ~ 21   # 16
      , TRUE ~ NA |> as.numeric()
      )
    # set the "Not identified" Metropolitan areas to NA
  , GTMETSTA =
      GTMETSTA |>
      factor(
        levels =
          # keep the levels that are not "Not identified"
          stringr::str_subset(
            string  = levels(dat_atus$GTMETSTA)
          , pattern = "Not identified"
          , negate  = TRUE
          )
      )
    # hours worked at all jobs
  , TEHRUSL_all = TEHRUSL1 + TEHRUSL2
  ) |>
  dplyr::select(
    -PEEDUCA
  , -TEHRUSL1
  , -TEHRUSL2
  ) |>
  # drop rows with any missing values
  tidyr::drop_na() |>
  # select your sample of rows for analysis
  dplyr::slice_sample(
    n = n_analysis
  )

# label new variables
labelled::var_label(dat_atus[[ "PEEDUCA_num" ]]) <-
  labelled::var_label(dat_atus[[ "PEEDUCA" ]])
# relabel variables that were modified in a way that removes the label attribute
labelled::var_label(dat_atus[[ "GTMETSTA" ]]) <-
  labels_dat_atus |> filter(Var == "GTMETSTA") |> pull(Label)
labelled::var_label(dat_atus[[ "TEHRUSL_all" ]]) <-
  labels_dat_atus |> filter(Var == "TEHRUSL1") |> pull(Label)


# wrap all labels for plots
for (i_var in seq_len(ncol(dat_atus))) {
  labelled::var_label(dat_atus[, i_var]) <-
    labelled::var_label(dat_atus[, i_var]) |>
    str_wrap(width = 30)
}
Warning in stri_split_lines(str): argument is not an atomic vector; coercing
str(dat_atus)
tibble [500 × 11] (S3: tbl_df/tbl/data.frame)
 $ TUCASEID   : num [1:500] 2.00e+13 2.02e+13 2.01e+13 2.02e+13 2.02e+13 ...
  ..- attr(*, "label")= chr "ATUS Case ID (14-digit\nidentifier)"
 $ t0101      : num [1:500] 6.42 7.95 9.8 9 7 ...
  ..- attr(*, "label")= chr "Sleeping"
 $ TESEX      : Factor w/ 2 levels "Male","Female": 1 2 2 2 1 1 1 2 1 1 ...
  ..- attr(*, "label")= chr "Edited: sex"
 $ TEAGE      : num [1:500] 39 24 41 38 43 49 34 39 25 34 ...
  ..- attr(*, "label")= chr "Edited: age"
 $ GTMETSTA   : Factor w/ 2 levels "Metropolitan",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "label")= chr "Metropolitan status (2000 or\n2010 definitions, see note)"
 $ TRERNHLY   : num [1:500] 2157 1400 1258 735 4719 ...
  ..- attr(*, "label")= chr "Hourly earnings (2 implied\ndecimals)"
 $ TRHHCHILD  : Factor w/ 2 levels "Yes","No": 1 2 2 2 1 2 1 1 1 2 ...
  ..- attr(*, "label")= chr "Presence of household children\n< 18"
 $ TRTALONE   : num [1:500] 90 260 330 0 540 0 180 150 15 290 ...
  ..- attr(*, "label")= chr "Total time respondent spent\nalone (in minutes)"
 $ TRTHHFAMILY: num [1:500] 360 145 0 825 0 645 0 685 195 0 ...
  ..- attr(*, "label")= chr "Total time respondent spent\nwith household family members\n(in minutes)"
 $ PEEDUCA_num: num [1:500] 12 13 13 12 13 12 12 16 12 12 ...
  ..- attr(*, "label")= chr "NULL"
 $ TEHRUSL_all: num [1:500] 39 31 11 49 39 42 59 24 44 14 ...
  ..- attr(*, "label")= chr "Edited: how many hours per\nweek do you usually work at\nyour main job?"
## filter and mutate data here to satisfy model assumptions
dat_atus <-
  dat_atus |>
  dplyr::filter(
    t0101 >= 5
  , t0101 <= 12
  , !(TUCASEID %in% c(87,250,371, 436))   # Can use this to exclude observations by ID number
  ) |>
  dplyr::mutate(
    TRERNHLY = TRERNHLY <= 5000
  )

str(dat_atus)
tibble [443 × 11] (S3: tbl_df/tbl/data.frame)
 $ TUCASEID   : num [1:443] 2.00e+13 2.02e+13 2.01e+13 2.02e+13 2.02e+13 ...
  ..- attr(*, "label")= chr "ATUS Case ID (14-digit\nidentifier)"
 $ t0101      : num [1:443] 6.42 7.95 9.8 9 7 ...
  ..- attr(*, "label")= chr "Sleeping"
 $ TESEX      : Factor w/ 2 levels "Male","Female": 1 2 2 2 1 1 2 1 1 2 ...
  ..- attr(*, "label")= chr "Edited: sex"
 $ TEAGE      : num [1:443] 39 24 41 38 43 34 39 25 34 52 ...
  ..- attr(*, "label")= chr "Edited: age"
 $ GTMETSTA   : Factor w/ 2 levels "Metropolitan",..: 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "label")= chr "Metropolitan status (2000 or\n2010 definitions, see note)"
 $ TRERNHLY   : logi [1:443] TRUE TRUE TRUE TRUE TRUE TRUE ...
 $ TRHHCHILD  : Factor w/ 2 levels "Yes","No": 1 2 2 2 1 1 1 1 2 2 ...
  ..- attr(*, "label")= chr "Presence of household children\n< 18"
 $ TRTALONE   : num [1:443] 90 260 330 0 540 180 150 15 290 510 ...
  ..- attr(*, "label")= chr "Total time respondent spent\nalone (in minutes)"
 $ TRTHHFAMILY: num [1:443] 360 145 0 825 0 0 685 195 0 270 ...
  ..- attr(*, "label")= chr "Total time respondent spent\nwith household family members\n(in minutes)"
 $ PEEDUCA_num: num [1:443] 12 13 13 12 13 12 16 12 12 2.5 ...
  ..- attr(*, "label")= chr "NULL"
 $ TEHRUSL_all: num [1:443] 39 31 11 49 39 59 24 44 14 27 ...
  ..- attr(*, "label")= chr "Edited: how many hours per\nweek do you usually work at\nyour main job?"
## Scatterplot matrix
library(ggplot2)
library(GGally)
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
p <-
  ggpairs(
    dat_atus |> dplyr::select(-TUCASEID)
  , title = "ATUS Sleeping"
  , mapping = ggplot2::aes(colour = TESEX, alpha = 0.5)
  , diag  = list(
              continuous =
                wrap(
                  c("densityDiag", "barDiag", "blankDiag")[1]
                , alpha = 1/2
                )
            , discrete =
                c("barDiag", "blankDiag")[1]
            )
  # scatterplots on top so response as first variable has y on vertical axis
  , upper = list(
              continuous =
                wrap(
                  c("points", "smooth", "smooth_loess", "density", "cor", "blank")[2]
                , se = FALSE
                , alpha = 1/2
                , size = 1
                )
            , discrete =
                c("ratio", "facetbar", "blank")[2]
            , combo =
                wrap(
                  c("box", "box_no_facet", "dot", "dot_no_facet", "facethist", "facetdensity", "denstrip", "blank")[2]
                #, bins = 10  # for facethist
                )
            )
  , lower = list(
              continuous =
                wrap(
                  c("points", "smooth", "smooth_loess", "density", "cor", "blank")[5]
                #, se = FALSE
                #, alpha = 1/2
                #, size = 1
                )
            , discrete =
                c("ratio", "facetbar", "blank")[2]
            , combo =
                wrap(
                  c("box", "box_no_facet", "dot", "dot_no_facet", "facethist", "facetdensity", "denstrip", "blank")[5]
                , bins = 10  # for facethist
                )
            )
  , progress = FALSE
  , legend = 1        # create legend
  )
p <- p + theme_bw()
p <- p + theme(legend.position = "bottom")
print(p)

# Mean model
if (condition_2_init_model == "Mean") {
  lm_fit_init <-
    lm(
      t0101 ~ 1
    , data = dat_atus
    )
}

# Main-effects model
if (condition_2_init_model == "Main effects") {
  lm_fit_init <-
    lm(
      t0101 ~ TESEX + TEAGE + GTMETSTA + PEEDUCA_num + TRERNHLY + TEHRUSL_all + TRHHCHILD + TRTALONE + TRTHHFAMILY
    , data = dat_atus
    )
}

# Two-way interaction model
if (condition_2_init_model == "Two-way interaction") {
  lm_fit_init <-
    lm(
      t0101 ~ (TESEX + TEAGE + GTMETSTA + PEEDUCA_num + TRERNHLY + TEHRUSL_all + TRHHCHILD + TRTALONE + TRTHHFAMILY)^2
    , data = dat_atus
    )
  # If the two-way interaction model has NA coefficients,
  #   then there were probably pairs of categories that had no observations so could not be estimated.
  # In this case, set the argument "singular.ok = TRUE" in the car::Anova() function below.
}

lm_fit_init

Call:
lm(formula = t0101 ~ TESEX + TEAGE + GTMETSTA + PEEDUCA_num + 
    TRERNHLY + TEHRUSL_all + TRHHCHILD + TRTALONE + TRTHHFAMILY, 
    data = dat_atus)

Coefficients:
             (Intercept)               TESEXFemale                     TEAGE  
              10.5095457                 0.3561339                -0.0189987  
GTMETSTANon-metropolitan               PEEDUCA_num              TRERNHLYTRUE  
              -0.1583661                -0.0780764                -0.6534587  
             TEHRUSL_all               TRHHCHILDNo                  TRTALONE  
              -0.0122357                 0.6050579                -0.0000117  
             TRTHHFAMILY  
               0.0009898  
car::Anova(lm_fit_init, type = 3, singular.ok = FALSE)
Anova Table (Type III tests)

Response: t0101
             Sum Sq  Df  F value    Pr(>F)    
(Intercept)  375.94   1 149.9192 < 2.2e-16 ***
TESEX         12.85   1   5.1247  0.024081 *  
TEAGE         24.76   1   9.8749  0.001791 ** 
GTMETSTA       1.84   1   0.7325  0.392543    
PEEDUCA_num   18.24   1   7.2723  0.007276 ** 
TRERNHLY       2.32   1   0.9249  0.336741    
TEHRUSL_all   11.56   1   4.6087  0.032364 *  
TRHHCHILD     26.03   1  10.3802  0.001370 ** 
TRTALONE       0.00   1   0.0007  0.979395    
TRTHHFAMILY   21.52   1   8.5813  0.003576 ** 
Residuals   1085.79 433                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# plot diagnostics
e_plot_lm_diagnostics(lm_fit_init)

Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 2.405248, Df = 1, p = 0.12093

Warning in e_plot_lm_diagnostics(lm_fit_init): Note: Collinearity plot
unreliable for predictors that also have interactions in the model.

# criterion
if (condition_3_criterion == "AIC") {
  AIC_k = 2
}
if (condition_3_criterion == "BIC") {
  AIC_k = log(nrow(dat_atus))
}

## AIC/BIC stepwise selection
# option: test="F" includes additional information
#           for parameter estimate tests that we're familiar with
# option: for BIC, include k=log(nrow( [data.frame name] ))
lm_fit_AIC <-
  step(
    lm_fit_init
  , scope =
      list(
        upper = t0101 ~ (TESEX + TEAGE + GTMETSTA + PEEDUCA_num + TRERNHLY + TEHRUSL_all + TRHHCHILD + TRTALONE + TRTHHFAMILY)^2
      , lower = t0101 ~ 1
      )
  , direction = "both"
  , test      = "F"
  , trace     = 1
  , k         = AIC_k     # condition_3_criterion takes effect here
  )
Start:  AIC=417.14
t0101 ~ TESEX + TEAGE + GTMETSTA + PEEDUCA_num + TRERNHLY + TEHRUSL_all + 
    TRHHCHILD + TRTALONE + TRTHHFAMILY

                          Df Sum of Sq    RSS    AIC F value   Pr(>F)   
+ TRTALONE:TRTHHFAMILY     1   11.7644 1074.0 414.32  4.7320 0.030149 * 
- TRTALONE                 1    0.0017 1085.8 415.15  0.0007 0.979395   
- GTMETSTA                 1    1.8368 1087.6 415.89  0.7325 0.392543   
- TRERNHLY                 1    2.3192 1088.1 416.09  0.9249 0.336741   
+ TESEX:TRERNHLY           1    6.3454 1079.4 416.55  2.5395 0.111764   
+ TRHHCHILD:TRTALONE       1    6.2360 1079.5 416.59  2.4955 0.114907   
+ TESEX:PEEDUCA_num        1    5.7756 1080.0 416.78  2.3102 0.129256   
+ GTMETSTA:TRTALONE        1    5.4941 1080.3 416.90  2.1971 0.139004   
<none>                                 1085.8 417.14                    
+ GTMETSTA:TRHHCHILD       1    4.5079 1081.3 417.30  1.8010 0.180295   
+ TRERNHLY:TRTHHFAMILY     1    4.3481 1081.4 417.37  1.7369 0.188229   
+ TRERNHLY:TRTALONE        1    4.1343 1081.7 417.45  1.6512 0.199486   
+ PEEDUCA_num:TRTALONE     1    3.6030 1082.2 417.67  1.4383 0.231075   
+ TESEX:TEAGE              1    3.5563 1082.2 417.69  1.4196 0.234123   
+ TRERNHLY:TRHHCHILD       1    3.3617 1082.4 417.77  1.3417 0.247377   
+ TEAGE:GTMETSTA           1    3.3573 1082.4 417.77  1.3399 0.247688   
+ TESEX:TRHHCHILD          1    3.2507 1082.5 417.82  1.2972 0.255349   
+ PEEDUCA_num:TRERNHLY     1    2.8968 1082.9 417.96  1.1556 0.282972   
+ TEAGE:TRHHCHILD          1    2.8695 1082.9 417.97  1.1447 0.285258   
+ GTMETSTA:TEHRUSL_all     1    2.4891 1083.3 418.13  0.9926 0.319666   
+ TESEX:GTMETSTA           1    2.0520 1083.7 418.31  0.8180 0.366279   
+ TEAGE:TRERNHLY           1    1.5084 1084.3 418.53  0.6010 0.438635   
+ TEAGE:TRTALONE           1    1.1993 1084.6 418.66  0.4777 0.489843   
+ TEHRUSL_all:TRTHHFAMILY  1    0.8149 1085.0 418.81  0.3244 0.569243   
+ PEEDUCA_num:TEHRUSL_all  1    0.8039 1085.0 418.82  0.3201 0.571863   
+ TRHHCHILD:TRTHHFAMILY    1    0.7257 1085.1 418.85  0.2889 0.591188   
+ TRERNHLY:TEHRUSL_all     1    0.7052 1085.1 418.86  0.2807 0.596484   
+ PEEDUCA_num:TRHHCHILD    1    0.4268 1085.4 418.97  0.1699 0.680422   
+ TEAGE:PEEDUCA_num        1    0.3889 1085.4 418.99  0.1548 0.694215   
+ TESEX:TRTALONE           1    0.3484 1085.4 419.00  0.1387 0.709788   
+ TESEX:TRTHHFAMILY        1    0.2976 1085.5 419.02  0.1184 0.730923   
+ GTMETSTA:PEEDUCA_num     1    0.2706 1085.5 419.03  0.1077 0.742956   
+ TEAGE:TEHRUSL_all        1    0.1861 1085.6 419.07  0.0741 0.785625   
+ GTMETSTA:TRTHHFAMILY     1    0.0793 1085.7 419.11  0.0316 0.859061   
+ TEHRUSL_all:TRHHCHILD    1    0.0785 1085.7 419.11  0.0312 0.859788   
+ TEAGE:TRTHHFAMILY        1    0.0229 1085.8 419.14  0.0091 0.924080   
+ TESEX:TEHRUSL_all        1    0.0195 1085.8 419.14  0.0078 0.929813   
+ PEEDUCA_num:TRTHHFAMILY  1    0.0049 1085.8 419.14  0.0020 0.964788   
+ TEHRUSL_all:TRTALONE     1    0.0002 1085.8 419.14  0.0001 0.992349   
- TEHRUSL_all              1   11.5568 1097.3 419.84  4.6087 0.032364 * 
- TESEX                    1   12.8507 1098.6 420.36  5.1247 0.024081 * 
- PEEDUCA_num              1   18.2360 1104.0 422.52  7.2723 0.007276 **
- TRTHHFAMILY              1   21.5184 1107.3 423.84  8.5813 0.003576 **
- TEAGE                    1   24.7623 1110.5 425.13  9.8749 0.001791 **
- TRHHCHILD                1   26.0293 1111.8 425.64 10.3802 0.001370 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step:  AIC=414.32
t0101 ~ TESEX + TEAGE + GTMETSTA + PEEDUCA_num + TRERNHLY + TEHRUSL_all + 
    TRHHCHILD + TRTALONE + TRTHHFAMILY + TRTALONE:TRTHHFAMILY

                          Df Sum of Sq    RSS    AIC F value   Pr(>F)   
- GTMETSTA                 1    1.4854 1075.5 412.93  0.5975 0.439970   
- TRERNHLY                 1    2.9403 1077.0 413.53  1.1827 0.277421   
+ TESEX:TRERNHLY           1    6.1226 1067.9 413.79  2.4710 0.116694   
+ TRERNHLY:TRTALONE        1    5.4531 1068.6 414.06  2.1995 0.138789   
<none>                                 1074.0 414.32                    
+ TESEX:PEEDUCA_num        1    4.6849 1069.3 414.38  1.8883 0.170110   
+ TRERNHLY:TRHHCHILD       1    3.9161 1070.1 414.70  1.5773 0.209834   
+ PEEDUCA_num:TRERNHLY     1    3.7654 1070.3 414.76  1.5164 0.218843   
+ GTMETSTA:TRHHCHILD       1    3.7279 1070.3 414.78  1.5012 0.221156   
+ TRERNHLY:TRTHHFAMILY     1    3.7161 1070.3 414.78  1.4964 0.221889   
+ GTMETSTA:TRTALONE        1    3.6601 1070.4 414.81  1.4738 0.225411   
+ TESEX:TRHHCHILD          1    3.4170 1070.6 414.91  1.3756 0.241496   
+ PEEDUCA_num:TRTALONE     1    3.0824 1070.9 415.05  1.2405 0.265995   
+ TESEX:TEAGE              1    2.9227 1071.1 415.11  1.1760 0.278768   
+ TESEX:GTMETSTA           1    2.8743 1071.2 415.13  1.1565 0.282787   
+ GTMETSTA:TEHRUSL_all     1    2.5521 1071.5 415.26  1.0266 0.311528   
+ TEAGE:GTMETSTA           1    2.4918 1071.5 415.29  1.0023 0.317325   
+ TEHRUSL_all:TRTHHFAMILY  1    2.2389 1071.8 415.39  0.9003 0.343227   
+ TRHHCHILD:TRTALONE       1    1.6308 1072.4 415.65  0.6554 0.418630   
+ TEAGE:TRERNHLY           1    1.6034 1072.4 415.66  0.6444 0.422568   
+ TEAGE:TRHHCHILD          1    1.4304 1072.6 415.73  0.5748 0.448776   
+ TEAGE:TRTHHFAMILY        1    0.7871 1073.2 415.99  0.3161 0.574263   
+ TESEX:TRTALONE           1    0.7224 1073.3 416.02  0.2901 0.590450   
+ GTMETSTA:PEEDUCA_num     1    0.5947 1073.4 416.07  0.2388 0.625326   
+ PEEDUCA_num:TRHHCHILD    1    0.5220 1073.5 416.10  0.2096 0.647328   
+ PEEDUCA_num:TEHRUSL_all  1    0.3882 1073.6 416.16  0.1559 0.693201   
+ TEAGE:TEHRUSL_all        1    0.3625 1073.7 416.17  0.1455 0.703055   
+ TEAGE:PEEDUCA_num        1    0.3341 1073.7 416.18  0.1341 0.714382   
+ TRERNHLY:TEHRUSL_all     1    0.2768 1073.7 416.20  0.1111 0.739028   
+ TESEX:TRTHHFAMILY        1    0.0820 1073.9 416.28  0.0329 0.856138   
+ TRHHCHILD:TRTHHFAMILY    1    0.0629 1074.0 416.29  0.0253 0.873789   
+ TEHRUSL_all:TRHHCHILD    1    0.0484 1074.0 416.30  0.0194 0.889260   
+ TEHRUSL_all:TRTALONE     1    0.0252 1074.0 416.31  0.0101 0.920015   
+ GTMETSTA:TRTHHFAMILY     1    0.0105 1074.0 416.31  0.0042 0.948330   
+ PEEDUCA_num:TRTHHFAMILY  1    0.0083 1074.0 416.32  0.0033 0.954135   
+ TEAGE:TRTALONE           1    0.0056 1074.0 416.32  0.0023 0.962117   
+ TESEX:TEHRUSL_all        1    0.0037 1074.0 416.32  0.0015 0.969138   
- TESEX                    1   10.8002 1084.8 416.75  4.3441 0.037724 * 
- TRTALONE:TRTHHFAMILY     1   11.7644 1085.8 417.14  4.7320 0.030149 * 
- TEHRUSL_all              1   14.2041 1088.2 418.14  5.7133 0.017265 * 
- PEEDUCA_num              1   17.0251 1091.0 419.29  6.8480 0.009185 **
- TRHHCHILD                1   20.9503 1095.0 420.88  8.4268 0.003887 **
- TEAGE                    1   24.8660 1098.9 422.46 10.0018 0.001674 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step:  AIC=412.93
t0101 ~ TESEX + TEAGE + PEEDUCA_num + TRERNHLY + TEHRUSL_all + 
    TRHHCHILD + TRTALONE + TRTHHFAMILY + TRTALONE:TRTHHFAMILY

                          Df Sum of Sq    RSS    AIC F value   Pr(>F)   
- TRERNHLY                 1    3.1968 1078.7 412.25  1.2870 0.257221   
+ TESEX:TRERNHLY           1    6.0829 1069.4 412.42  2.4572 0.117717   
+ TRERNHLY:TRTALONE        1    5.4090 1070.1 412.70  2.1836 0.140216   
<none>                                 1075.5 412.93                    
+ TESEX:PEEDUCA_num        1    4.3644 1071.1 413.13  1.7602 0.185299   
+ TRERNHLY:TRHHCHILD       1    3.8718 1071.6 413.33  1.5608 0.212225   
+ PEEDUCA_num:TRERNHLY     1    3.7212 1071.8 413.40  1.4999 0.221356   
+ TRERNHLY:TRTHHFAMILY     1    3.6988 1071.8 413.40  1.4908 0.222751   
+ TESEX:TRHHCHILD          1    3.5055 1072.0 413.48  1.4127 0.235268   
+ TESEX:TEAGE              1    2.8437 1072.7 413.76  1.1453 0.285142   
+ PEEDUCA_num:TRTALONE     1    2.7660 1072.7 413.79  1.1139 0.291829   
+ TEHRUSL_all:TRTHHFAMILY  1    2.2031 1073.3 414.02  0.8867 0.346890   
+ TEAGE:TRERNHLY           1    1.5842 1073.9 414.28  0.6373 0.425137   
+ GTMETSTA                 1    1.4854 1074.0 414.32  0.5975 0.439970   
+ TRHHCHILD:TRTALONE       1    1.4051 1074.1 414.35  0.5651 0.452608   
+ TEAGE:TRHHCHILD          1    1.2807 1074.2 414.40  0.5150 0.473351   
+ TEAGE:TRTHHFAMILY        1    0.9805 1074.5 414.53  0.3942 0.530428   
+ TESEX:TRTALONE           1    0.8178 1074.7 414.59  0.3287 0.566702   
+ PEEDUCA_num:TRHHCHILD    1    0.4583 1075.0 414.74  0.1842 0.668034   
+ TEAGE:TEHRUSL_all        1    0.4402 1075.1 414.75  0.1769 0.674285   
+ TEAGE:PEEDUCA_num        1    0.4311 1075.1 414.75  0.1732 0.677451   
+ PEEDUCA_num:TEHRUSL_all  1    0.4094 1075.1 414.76  0.1645 0.685251   
+ TRERNHLY:TEHRUSL_all     1    0.2828 1075.2 414.81  0.1136 0.736230   
+ TESEX:TRTHHFAMILY        1    0.0959 1075.4 414.89  0.0385 0.844514   
+ TEHRUSL_all:TRHHCHILD    1    0.0396 1075.5 414.91  0.0159 0.899695   
+ TEHRUSL_all:TRTALONE     1    0.0166 1075.5 414.92  0.0067 0.935023   
+ TRHHCHILD:TRTHHFAMILY    1    0.0151 1075.5 414.92  0.0061 0.937954   
+ PEEDUCA_num:TRTHHFAMILY  1    0.0060 1075.5 414.93  0.0024 0.960982   
+ TEAGE:TRTALONE           1    0.0002 1075.5 414.93  0.0001 0.992522   
+ TESEX:TEHRUSL_all        1    0.0001 1075.5 414.93  0.0001 0.994120   
- TESEX                    1   10.6213 1086.1 415.28  4.2762 0.039244 * 
- TRTALONE:TRTHHFAMILY     1   12.1158 1087.6 415.89  4.8778 0.027727 * 
- TEHRUSL_all              1   15.0257 1090.5 417.08  6.0494 0.014301 * 
- PEEDUCA_num              1   16.9098 1092.4 417.84  6.8079 0.009390 **
- TRHHCHILD                1   21.4656 1097.0 419.69  8.6421 0.003461 **
- TEAGE                    1   25.3963 1100.9 421.27 10.2246 0.001487 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Step:  AIC=412.25
t0101 ~ TESEX + TEAGE + PEEDUCA_num + TEHRUSL_all + TRHHCHILD + 
    TRTALONE + TRTHHFAMILY + TRTALONE:TRTHHFAMILY

                          Df Sum of Sq    RSS    AIC F value   Pr(>F)   
<none>                                 1078.7 412.25                    
+ TESEX:PEEDUCA_num        1    4.2789 1074.4 412.49  1.7244 0.189819   
+ TESEX:TRHHCHILD          1    3.7455 1075.0 412.70  1.5087 0.220005   
+ TRERNHLY                 1    3.1968 1075.5 412.93  1.2870 0.257221   
+ TEHRUSL_all:TRTHHFAMILY  1    3.0402 1075.7 413.00  1.2238 0.269229   
+ PEEDUCA_num:TRTALONE     1    2.7766 1075.9 413.10  1.1174 0.291066   
+ TESEX:TEAGE              1    2.6500 1076.0 413.16  1.0663 0.302349   
+ GTMETSTA                 1    1.7419 1077.0 413.53  0.7004 0.403127   
+ TRHHCHILD:TRTALONE       1    1.5759 1077.1 413.60  0.6335 0.426512   
+ TEAGE:TRHHCHILD          1    1.1605 1077.5 413.77  0.4663 0.495051   
+ TEAGE:TRTHHFAMILY        1    1.0267 1077.7 413.82  0.4125 0.521030   
+ PEEDUCA_num:TRHHCHILD    1    0.7415 1078.0 413.94  0.2978 0.585528   
+ TESEX:TRTALONE           1    0.7212 1078.0 413.95  0.2897 0.590687   
+ TEAGE:PEEDUCA_num        1    0.4432 1078.3 414.06  0.1780 0.673319   
+ TEAGE:TEHRUSL_all        1    0.3831 1078.3 414.09  0.1538 0.695077   
+ TESEX:TRTHHFAMILY        1    0.2342 1078.5 414.15  0.0940 0.759287   
+ TRHHCHILD:TRTHHFAMILY    1    0.0536 1078.7 414.22  0.0215 0.883412   
+ PEEDUCA_num:TEHRUSL_all  1    0.0349 1078.7 414.23  0.0140 0.905902   
+ PEEDUCA_num:TRTHHFAMILY  1    0.0148 1078.7 414.24  0.0059 0.938633   
+ TESEX:TEHRUSL_all        1    0.0058 1078.7 414.24  0.0023 0.961425   
+ TEHRUSL_all:TRTALONE     1    0.0026 1078.7 414.24  0.0011 0.974069   
+ TEHRUSL_all:TRHHCHILD    1    0.0016 1078.7 414.25  0.0006 0.980105   
+ TEAGE:TRTALONE           1    0.0000 1078.7 414.25  0.0000 0.996532   
- TESEX                    1   10.2347 1088.9 414.43  4.1178 0.043045 * 
- TRTALONE:TRTHHFAMILY     1   11.4810 1090.2 414.94  4.6192 0.032168 * 
- PEEDUCA_num              1   14.5785 1093.3 416.19  5.8654 0.015850 * 
- TEHRUSL_all              1   17.3679 1096.1 417.32  6.9877 0.008504 **
- TRHHCHILD                1   20.2907 1099.0 418.50  8.1637 0.004479 **
- TEAGE                    1   24.2289 1102.9 420.09  9.7481 0.001915 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
lm_fit_final <- lm_fit_AIC

car::Anova(lm_fit_final, type = 3)
Anova Table (Type III tests)

Response: t0101
                      Sum Sq  Df  F value    Pr(>F)    
(Intercept)          1160.80   1 467.0299 < 2.2e-16 ***
TESEX                  10.23   1   4.1178  0.043045 *  
TEAGE                  24.23   1   9.7481  0.001915 ** 
PEEDUCA_num            14.58   1   5.8654  0.015850 *  
TEHRUSL_all            17.37   1   6.9877  0.008504 ** 
TRHHCHILD              20.29   1   8.1637  0.004479 ** 
TRTALONE                3.20   1   1.2861  0.257388    
TRTHHFAMILY            33.37   1  13.4251  0.000279 ***
TRTALONE:TRTHHFAMILY   11.48   1   4.6192  0.032168 *  
Residuals            1078.70 434                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# plot diagnostics
e_plot_lm_diagnostics(lm_fit_final)

Non-constant Variance Score Test 
Variance formula: ~ fitted.values 
Chisquare = 1.160953, Df = 1, p = 0.28127

there are higher-order terms (interactions) in this model
consider setting type = 'predictor'; see ?vif
Warning in e_plot_lm_diagnostics(lm_fit_final): Note: Collinearity plot
unreliable for predictors that also have interactions in the model.

summary(lm_fit_final)

Call:
lm(formula = t0101 ~ TESEX + TEAGE + PEEDUCA_num + TEHRUSL_all + 
    TRHHCHILD + TRTALONE + TRTHHFAMILY + TRTALONE:TRTHHFAMILY, 
    data = dat_atus)

Residuals:
    Min      1Q  Median      3Q     Max 
-4.3030 -1.1801 -0.0403  1.1003  4.0443 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           9.715e+00  4.495e-01  21.611  < 2e-16 ***
TESEXFemale           3.187e-01  1.570e-01   2.029 0.043045 *  
TEAGE                -1.873e-02  5.998e-03  -3.122 0.001915 ** 
PEEDUCA_num          -6.825e-02  2.818e-02  -2.422 0.015850 *  
TEHRUSL_all          -1.490e-02  5.638e-03  -2.643 0.008504 ** 
TRHHCHILDNo           5.372e-01  1.880e-01   2.857 0.004479 ** 
TRTALONE              6.010e-04  5.300e-04   1.134 0.257388    
TRTHHFAMILY           1.476e-03  4.028e-04   3.664 0.000279 ***
TRTALONE:TRTHHFAMILY -4.008e-06  1.865e-06  -2.149 0.032168 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.577 on 434 degrees of freedom
Multiple R-squared:  0.09498,   Adjusted R-squared:  0.0783 
F-statistic: 5.694 on 8 and 434 DF,  p-value: 6.74e-07
lm_fit_criteria <-
  e_lm_model_criteria(
    lm_fit  = lm_fit_final
  , dat_fit = dat_atus
  )
p_cont <-
  e_plot_model_contrasts(
    fit = lm_fit_final
  , dat_cont = dat_atus
  , choose_contrasts = NULL
  , sw_table_in_plot = TRUE
  , adjust_method = c("none", "tukey", "scheffe", "sidak", "bonferroni", "dunnettx", "mvt")[2]
  , CI_level = 0.95
  , sw_glm_scale = c("link", "response")[1]
  , sw_print = FALSE
  , sw_marginal_even_if_interaction = FALSE
  , sw_TWI_plots_keep = c("singles", "both", "all")[1]
  , sw_TWI_both_orientation = c("wide", "tall")[1]
  , sw_plot_quantiles_values = c("quantiles", "values")[1]
  , plot_quantiles = c(0.05, 0.25, 0.5, 0.75, 0.95)
  , sw_quantile_type = 7
  , plot_values = NULL
  , emmip_rg.limit = 1000
  )
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
Note: adjust = "tukey" was changed to "sidak"
because "tukey" is only appropriate for one set of pairwise comparisons
e_plot_model_contrasts: Skipping "TRTALONE" since involved in interactions.
e_plot_model_contrasts: Skipping "TRTHHFAMILY" since involved in interactions.
# Since plot interactions have sublists of plots, we want to pull those out
#   into a one-level plot list.
# The code here works for sw_TWI_plots_keep = "singles"
#   which will make each plot the same size in the plot_grid() below.
# For a publications, you'll want to manually choose which plots to show.

# index for plot list,
#   needed since interactions add 2 plots to the list, so the number of terms
#   is not necessarily the same as the number of plots.
i_list <- 0
# initialize a list of plots
p_list <- list()

for (i_term in 1:length(p_cont$plots)) {
  ## i_term = 1

  if ( length(p_cont$plots) == 0 ) {
    print("Skip printing contrasts if intercept-only model")
    next
  }

  # extract the name of the plot
  n_list <- names(p_cont$plots)[i_term]

  # test whether the name has a colon ":"; if so, it's an interaction
  if (stringr::str_detect(string = n_list, pattern = stringr::fixed(":"))) {
    # an two-way interaction has two plots

    # first plot
    i_list <- i_list + 1
    p_list[[ i_list ]] <- p_cont$plots[[ i_term ]][[ 1 ]]

    # second plot
    i_list <- i_list + 1
    p_list[[ i_list ]] <- p_cont$plots[[ i_term ]][[ 2 ]]

  } else {
    # not an interaction, only one plot

    i_list <- i_list + 1
    p_list[[ i_list ]] <- p_cont$plots[[ i_term ]]

  } # if

  # Every 4 plots, print them
  if (i_list >= 4) {
    p_arranged <-
      cowplot::plot_grid(
        plotlist  = p_list
      , nrow      = NULL
      , ncol      = 2
      , labels    = "AUTO"
      )

    p_arranged |> print()

    i_list <- 0

    next
  }

  # if last term, print the plots
  if (i_term == length(p_cont$plots)) {
    p_arranged <-
      cowplot::plot_grid(
        plotlist  = p_list
      , nrow      = NULL
      , ncol      = 2
      , labels    = "AUTO"
      )

    p_arranged |> print()
  }

} # for

The final model included several main effects and one two-way interaction. Age showed a significant negative association with sleep duration (β = -0.0187, p = 0.0019), indicating that older individuals tended to report slightly shorter sleep durations after accounting for other factors. Sex differences emerged as statistically significant, with females sleeping approximately 0.32 hours more than males on average (p = 0.043). The presence of household children under 18 related to shorter sleep durations, with adults in childless households sleeping about 0.54 hours longer (p = 0.0045).

Educational attainment, measured in approximate years of schooling, showed a modest negative association with sleep duration (β = -0.068, p = 0.016). Weekly work hours similarly demonstrated a small but significant negative relationship (β = -0.0149, p = 0.0085), suggesting that individuals working longer hours tended to sleep slightly less.

The model identified one significant interaction between time spent alone (TRTALONE) and time spent with household family members (TRTHHFAMILY). This interaction (β = -4.01 × 10⁻⁶, p = 0.032) suggests that the relationship between solitude and sleep duration depends on the broader context of family time, though the small effect size warrants cautious interpretation.

3.2 Model Diagnostics and Assumption Checking

Comprehensive diagnostic procedures supported the validity of the final model. Residual plots showed no systematic patterns that would indicate violations of linearity assumptions. The distribution of residuals approximated normality, with no severe skewness or kurtosis evident in the quantile-quantile plot. Tests for heteroscedasticity (Breusch-Pagan test, p = 0.28) indicated no significant concerns about non-constant variance.

Examination of variance inflation factors (VIFs) revealed no problematic multicollinearity among predictors, with all VIF values below 2. Leverage statistics and Cook’s distance measures identified no remaining influential observations after the exclusion of specified cases. The Box-Cox procedure confirmed that no transformation of the response variable would substantially improve model fit beyond the linear specification.

4. Discussion

4.1 Interpretation of Key Findings

The negative association between age and sleep duration aligns with extensive literature documenting changes in sleep patterns across the lifespan. The observed sex difference, with women sleeping slightly longer than men, is consistent with epidemiological studies that frequently report similar gender disparities in sleep duration. The relationship between household composition and sleep duration may reflect the time demands of parenting, though the cross-sectional nature of the data limits causal interpretation.

The interaction between time spent alone and time with family members presents an intriguing finding that merits further investigation. While the effect size is small, this result suggests that the impact of solitude on sleep may depend on an individual’s broader social context—a hypothesis that could be explored in future research with more detailed measures of social interaction quality and timing.

4.2 Methodological Considerations

This analysis highlights several important methodological considerations for time use research. The moderate R² value underscores that sleep duration is influenced by numerous factors beyond those measured in the ATUS, including health status, stress levels, and environmental conditions not captured in the survey. The sensitivity of results to analytical decisions—particularly the choice of starting model and selection criteria—emphasizes the value of transparent reporting practices and consideration of alternative modeling approaches.

The transformation of the hourly earnings variable illustrates how recoding continuous predictors can sometimes improve model interpretability without sacrificing predictive power. Similarly, the exclusion of influential observations demonstrates how targeted case removal can address violations of model assumptions while preserving the majority of the dataset.

4.3 Limitations and Future Directions

Several limitations should be considered when interpreting these results. The cross-sectional design precludes causal inference, and self-reported time use data may be subject to recall biases. The ATUS does not include detailed health information that might mediate observed relationships between demographic factors and sleep duration. Future research could incorporate longitudinal designs, objective sleep measures, and more comprehensive covariate data to address these limitations.

5. Conclusion

This analysis of ATUS data identified several significant predictors of sleep duration among U.S. adults, including demographic characteristics, socioeconomic factors, and time use patterns. The results both confirm established relationships from the sleep literature and suggest new avenues for investigation, particularly regarding the interplay between different types of social time. Beyond substantive findings, the study demonstrates how analytical choices at each stage of the modeling process can influence results, reinforcing the importance of methodological transparency in social science research. Future work could build on these findings by incorporating additional predictors, exploring nonlinear relationships, and applying alternative modeling techniques to better understand the complex determinants of sleep behavior.

References

Erhardt, E. B., Bedrick, E. J., & Schrader, R. M. (2020). \(\textit{Lecture notes for Advanced Data Analysis 2 (ADA2) (Stat 428/528)}\). University of New Mexico.