5  Study 3: Genres and wellbeing

Note

TODOs:

The following to-dos are suggestions for how to improve the analysis in this notebook after data collection:

- Include iOS and android data.

- Potentially upgrade the data aggregation logic to merge Steam game sessions if they are consecutive and for the same game (can’t be done now because of how the titles are always generated to be different).

5.1 Load libraries and data

Show code (load libraries)
if (!require("pacman")) install.packages("pacman")
library(pacman)

p_load(knitr, tidyverse, dplyr, lme4, marginaleffects, interactions, data.table, readr, datawizard, kableExtra, R.utils, modelsummary, 
       multcomp, emmeans, car)

set.seed(8675309)

clean_string <- function(text) {
  text <- tolower(text)
  text <- gsub("[^a-z0-9 ]", "", text)
  text <- gsub("[ /]+", "_", text)
  text <- gsub("^_|_$", "", text)
  return(text)
}
Show code (load data)
panel <- fread("data/data-synthetic-clean/synPanelClean.csv.gz") |> 
  mutate(
    start_date = case_when(
      wave == 1 ~ as.Date("2024-05-01"),
      wave == 2 ~ as.Date("2024-05-15"),
      wave == 3 ~ as.Date("2024-05-29"),
      wave == 4 ~ as.Date("2024-06-12"),
      wave == 5 ~ as.Date("2024-06-26"),
      wave == 6 ~ as.Date("2024-07-10")
    ),
    end_date = start_date + 13  # Each wave covers a 14-day period
  )

diary <- read_csv("data/data-synthetic-clean/synDiaryClean.csv.gz")
intake <- read_csv("data/data-synthetic-clean/synIntakeClean.csv.gz")
ninRaw <- read_csv("data/data-synthetic-clean/synNintendoClean.csv.gz")
xboxRaw <- read_csv("data/data-synthetic-clean/synXboxClean.csv.gz") 
steamRaw <- read_csv("data/data-synthetic-clean/synSteamClean.csv.gz")
iOSRaw <- read_csv("data/data-synthetic-raw/syniOS.csv.gz")
androidRaw <- read_csv("data/data-synthetic-raw/synAndroid.csv.gz")

5.2 Merge data

We also perform some simple preprocessing here:

- We create a start_date and end_date column in the panel data to represent the start and end of each wave.

- We separate the genre column in the Nintendo, Xbox, and Steam data into five separate columns.

- Xbox and Nintendo have roughly 4000 unique genres, which is too many to work with. We recode these into a smaller number of genres by separating the primary genres from the sub genres.

In contrast to Xbox and Nintendo data, Steam data is not session-level; rather, it is a total amount of time spent playing each game during the previous hour. So to calculate how much time each player spent playing each genre each day and create a variable for how many sessions, we need to recode the data to match the format of the other two datasets.

Show code (merge data)
nin <- ninRaw |> 
  mutate(sessionEnd = sessionStart + minutes(round(duration)), .after = sessionStart) |> 
  separate(genre, into = c("genre1", "genre2", "genre3", "genre4", "genre5"), sep = ",", fill = "right")

xbox <- xboxRaw |> 
  mutate(sessionEnd = sessionStart + minutes(round(duration)), .after = sessionStart) |> 
  separate(genre, into = c("genre1", "genre2", "genre3", "genre4", "genre5"), sep = ",", fill = "right")

steam <- steamRaw |>
  rename(
    duration = minutes,
    titleID = Name,
  ) |> 
  mutate(sessionStart = date + hours(hour)) |> 
  separate(genre, into = c("genre1", "genre2", "genre3", "genre4", "genre5"), sep = ",", fill = "right") |> 
  group_by(pid, date) |>                    # Group by player ID and date
  mutate(session = row_number()) |>         # Create a sequential session number
  ungroup()       

telemetry <- bind_rows(nin, xbox, steam) |> 
  group_by(pid, genre1) |>
  mutate(previous_day_duration = lag(duration, 1)) |>
  ungroup()

5.3 Aggregate telemetry data

Aggregate playtime by genre within each wave for each participant, in wide format.

Show code (aggregate playtime)
aggregated_playtime <- telemetry |>
  mutate(wave = case_when(
    date >= as.Date("2024-05-01") & date <= as.Date("2024-05-14") ~ 1,
    date >= as.Date("2024-05-15") & date <= as.Date("2024-05-28") ~ 2,
    date >= as.Date("2024-05-29") & date <= as.Date("2024-06-11") ~ 3,
    date >= as.Date("2024-06-12") & date <= as.Date("2024-06-25") ~ 4,
    date >= as.Date("2024-06-26") & date <= as.Date("2024-07-09") ~ 5,
    date >= as.Date("2024-07-10") & date <= as.Date("2024-07-23") ~ 6
  )) %>%
  mutate(across(starts_with("genre"), ~clean_string(.))) |> 
  group_by(pid, wave, genre1) |>
  filter(duration < 720) |> 
  summarise(time = sum(duration/14/60, na.rm = TRUE), .groups = "drop") |> # Calculate total time per genre as hours per day 
  pivot_wider(
    names_from = genre1, 
    values_from = time, 
    values_fill = 0, # Fill missing values with 0
    names_prefix = "time_"
  ) %>%
  mutate(
    total_time_all_genres = rowSums(dplyr::select(., starts_with("time_")), na.rm = TRUE), # Calculate total time as hours per day 
    across(starts_with("time_"), ~ . / total_time_all_genres, .names = "prop_{.col}"), # Calculate proportion of time for each genre
  )

# get the variable names
genre_vars <- aggregated_playtime |> 
  dplyr::select(starts_with("time_")) |> 
  colnames()

# demean
aggregated_playtime <- aggregated_playtime |> 
  bind_cols(
    datawizard::demean(aggregated_playtime, select = c(genre_vars, "total_time_all_genres"), by = "pid")
  ) |> 
  left_join(panel, by = c("pid", "wave"))

5.4 Analysis

Data is analyzed using a multilevel model to account for the nested structure of the data, where repeated measurements (6 bi-weekly waves) are nested within participants. In this analysis, we examine the relationship between playtime and well-being, as well as how this relationship is moderated by genre. We test two hypotheses: H1. The overall effect of playtime on well-being H2. Genre moderates the relationship between playtime and well-being.

5.5 H1. The overall effect of playtime on wellbeing

To test the hypothesis that playtime is associated with well-being, we fit a random effects model with random intercepts and slopes for total playtime within and between genres. We then conduct an equivalence test to determine if the effect of playtime on well-being is within a predefined equivalence margin.

Show code (h1_model)
h1_total_time <- lmer(
  wemwbs ~ total_time_all_genres_within + total_time_all_genres_between + (1 + total_time_all_genres_within | pid), 
  data = aggregated_playtime
)

# Custom formatting function for scientific notation
scientific_fmt <- function(x) {
  formatC(x, format = "e", digits = 3)}  # Show numbers in scientific notation with 3 significant digits

# Summarize the model using modelsummary
modelsummary(
  list(`Model H1` = h1_total_time),
  fmt = scientific_fmt,
  estimate  = "{estimate} [{conf.low}, {conf.high}]{stars}", 
  statistic = NULL
)
Model H1
(Intercept) 2.992e+00 [2.970e+00, 3.014e+00]***
total_time_all_genres_within -5.747e-03 [-3.739e-02, 2.590e-02]
total_time_all_genres_between 2.548e-03 [-1.706e-02, 2.215e-02]
SD (Intercept pid) 1.051e-02 [ NA, NA]
SD (total_time_all_genres_within pid) 2.826e-02 [ NA, NA]
Cor (Intercept~total_time_all_genres_within pid) -1.000e+00 [ NA, NA]
SD (Observations) 5.360e-01 [ NA, NA]
Num.Obs. 7411
R2 Marg. 0.000
R2 Cond. 0.001
AIC 11827.5
BIC 11875.9
ICC 0.0
RMSE 0.54

This equivalence test is a way to formally test if the within-person effect of total playtime is small enough to be considered equivalent to zero, within a predefined practical margin. If the test confirms equivalence, it strengthens the argument that the effect of playtime on the outcome is negligible or irrelevant.

5.5.1 Equivalence test

Show code (h1_equivalence)
hypotheses(h1_total_time, "total_time_all_genres_within = 0", equivalence = c(-.06, .06))

                             Term Estimate Std. Error      z Pr(>|z|)   S
 total_time_all_genres_within = 0 -0.00575     0.0161 -0.356    0.722 0.5
   2.5 % 97.5 % p (NonSup) p (NonInf) p (Equiv)
 -0.0374 0.0259     <0.001     <0.001    <0.001

Columns: term, estimate, std.error, statistic, p.value, s.value, conf.low, conf.high, statistic.noninf, statistic.nonsup, p.value.noninf, p.value.nonsup, p.value.equiv 

5.6 H2. Genres differ in how playtime relates to fluctuations in general mental wellbeing over a 2-week period (H2a, “within-person”) and to average wellbeing over the full study period (H2b, “between-person”).

Multilevel within-between linear regression whereby playtime per genre (within- and between-centered) during the previous 2 weeks predicts wellbeing (WEMWBS), with a random intercept and random slopes for within-person variables. Due to identifiability issues with the high number of coefficients, we will fix the correlation between random intercept and random slope to 0.

5.6.1 REWB model

For H2 and H3, we fit a single model with random slopes for each genre within and between genres. This model allows us to estimate the effect of each genre on well-being, while accounting for the nested structure of the data. We can then conduct pairwise comparisons to determine which genres have a significant effect on well-being.

Interpretations:

  • time_*_between: “Group-level effect”: People who play x + 1 units more of genre_* report higher/lower wemwbs scores
  • time_*_within: “Within-person effect”: During a period when people play x + 1 units more of genre_* they report higher/lower wemwbs scores
Show code (h2_rewb_model)
# get the variable names
genre_within_vars <- aggregated_playtime |>
  dplyr::select(ends_with(c("_within"))) |>
  dplyr::select(-total_time_all_genres_within) |> 
  colnames() |>
  sort()

genre_between_vars <- aggregated_playtime |>
  dplyr::select(ends_with(c("_between"))) |>
  dplyr::select(-total_time_all_genres_between) |> 
  colnames() |>
  sort()

genre_vars_demean <- c(genre_within_vars, genre_between_vars)

## rewb
fit_h2_rewb <- lmer(
  paste(
      "wemwbs ~", paste(genre_vars_demean, collapse = "+"),
      "+ (1 | pid)"
    ),
  aggregated_playtime
)

# Summarize the model using modelsummary
modelsummary(
  list(`Model H2` = fit_h2_rewb),
  fmt = scientific_fmt,
  estimate  = "{estimate} [{conf.low}, {conf.high}]{stars}", 
  statistic = NULL
)
Model H2
(Intercept) 2.987e+00 [2.963e+00, 3.011e+00]***
time_action_within -3.853e-02 [-1.371e-01, 6.007e-02]
time_adventure_within -6.869e-02 [-1.892e-01, 5.184e-02]
time_arcade_within -9.326e-03 [-1.663e-01, 1.476e-01]
time_card_board_game_within -1.536e-03 [-1.526e-01, 1.495e-01]
time_casual_within -2.672e-01 [-6.950e-01, 1.606e-01]
time_fighting_within -7.379e-02 [-2.286e-01, 8.105e-02]
time_hack_and_slashbeat_em_up_within 5.607e-02 [-1.075e-01, 2.197e-01]
time_indie_within -3.125e-01 [-9.225e-01, 2.975e-01]
time_moba_within -4.532e-02 [-1.991e-01, 1.084e-01]
time_music_within 2.338e-01 [7.528e-02, 3.922e-01]**
time_platform_within 1.012e-01 [-5.509e-02, 2.576e-01]
time_puzzle_within -6.681e-02 [-2.344e-01, 1.008e-01]
time_racing_within -6.856e-03 [-1.652e-01, 1.515e-01]
time_real_time_strategy_rts_within 1.428e-02 [-1.397e-01, 1.683e-01]
time_roleplaying_rpg_within -1.309e-03 [-1.542e-01, 1.516e-01]
time_shooter_within 4.741e-02 [-1.091e-01, 2.039e-01]
time_simulator_within -5.865e-02 [-2.123e-01, 9.503e-02]
time_sport_within -5.587e-02 [-2.166e-01, 1.048e-01]
time_strategy_within -1.123e-01 [-2.658e-01, 4.115e-02]
time_tactical_within -4.489e-02 [-1.957e-01, 1.059e-01]
time_turnbased_strategy_tbs_within 5.993e-02 [-9.384e-02, 2.137e-01]
time_visual_novel_within 6.599e-02 [-9.045e-02, 2.224e-01]
time_action_between -9.239e-04 [-8.611e-02, 8.426e-02]
time_adventure_between 1.422e-01 [-1.130e-01, 3.974e-01]
time_arcade_between -3.321e-02 [-3.746e-01, 3.082e-01]
time_card_board_game_between -3.027e-01 [-6.151e-01, 9.573e-03]+
time_casual_between -1.045e-01 [-1.060e+00, 8.515e-01]
time_fighting_between 3.661e-01 [2.111e-02, 7.111e-01]*
time_hack_and_slashbeat_em_up_between 1.035e-01 [-2.736e-01, 4.806e-01]
time_indie_between 5.497e-01 [-7.194e-01, 1.819e+00]
time_moba_between 7.722e-02 [-2.687e-01, 4.232e-01]
time_music_between 2.227e-01 [-1.165e-01, 5.620e-01]
time_platform_between -3.897e-02 [-3.873e-01, 3.094e-01]
time_puzzle_between -1.758e-01 [-5.439e-01, 1.924e-01]
time_racing_between 2.282e-01 [-1.294e-01, 5.858e-01]
time_real_time_strategy_rts_between -3.111e-01 [-6.528e-01, 3.056e-02]+
time_roleplaying_rpg_between 1.995e-03 [-3.482e-01, 3.522e-01]
time_shooter_between -1.979e-01 [-5.477e-01, 1.519e-01]
time_simulator_between 1.838e-01 [-1.814e-01, 5.489e-01]
time_sport_between -1.335e-01 [-4.927e-01, 2.256e-01]
time_strategy_between -2.206e-01 [-5.606e-01, 1.194e-01]
time_tactical_between 2.097e-01 [-1.393e-01, 5.586e-01]
time_turnbased_strategy_tbs_between -3.492e-02 [-3.701e-01, 3.003e-01]
time_visual_novel_between -5.597e-02 [-3.870e-01, 2.751e-01]
SD (Intercept pid) 0.000e+00 [ NA, NA]
SD (Observations) 5.362e-01 [ NA, NA]
Num.Obs. 7411
R2 Marg. 0.006
AIC 11955.5
BIC 12280.3
RMSE 0.53
Note
  • Not possible to model all genre_*_within as random. Unidentifiable model.

Ideally, the demeaned variables should be included as random slopes. However, this will likely lead to identifiability issues. This code shows how we can fit a model with random slopes, but without a correlation between slopes and intercepts; as this takes a long time to run, we do not execute it here.

Show code (h2_rewb_re_slopes)
# fit model
fit_h2_rewb_re_slopes <- lmer(
  paste(
      "wemwbs ~", paste(genre_vars_demean, collapse = "+"),
      "+ (1 +",
      paste(genre_within_vars, collapse = "+"),
      "|| pid)"
    ),
  aggregated_playtime
)

# Summarize the model using modelsummary
modelsummary(
  list(`Model H2` = fit_h2_rewb_re_slopes),
  fmt = scientific_fmt,
  estimate  = "{estimate} [{conf.low}, {conf.high}]{stars}", 
  statistic = NULL
)

5.6.2 Joint hypothesis test

We will conduct a joint Wald test on the coefficients in the above model. A joint test simultaneously assesses multiple related hypotheses, allowing us to determine whether the playtime effects for any of the 23 genres differ significantly from each other (H3). The joint test the estimated coefficients and their covariance matrix to determine if a set of parameters jointly equals specified value; this test follows the chi-squared distribution (Wald, 1943). The error rate is controlled in a similar manner as would be achieved by correcting the alpha level for all 23 surrogate hypotheses (García-Pérez, 2023).

Show code (joint hypotheses H2)
# test against null of all coefficients being equal
linearHypothesis(fit_h2_rewb, paste0(genre_within_vars[1], " = ", genre_within_vars[2:length(genre_within_vars)]))

Linear hypothesis test:
time_action_within - time_adventure_within = 0
time_action_within - time_arcade_within = 0
time_action_within - time_card_board_game_within = 0
time_action_within - time_casual_within = 0
time_action_within - time_fighting_within = 0
time_action_within - time_hack_and_slashbeat_em_up_within = 0
time_action_within - time_indie_within = 0
time_action_within - time_moba_within = 0
time_action_within - time_music_within = 0
time_action_within - time_platform_within = 0
time_action_within - time_puzzle_within = 0
time_action_within - time_racing_within = 0
time_action_within - time_real_time_strategy_rts_within = 0
time_action_within - time_roleplaying_rpg_within = 0
time_action_within - time_shooter_within = 0
time_action_within - time_simulator_within = 0
time_action_within - time_sport_within = 0
time_action_within - time_strategy_within = 0
time_action_within - time_tactical_within = 0
time_action_within - time_turnbased_strategy_tbs_within = 0
time_action_within - time_visual_novel_within = 0

Model 1: restricted model
Model 2: wemwbs ~ time_action_within + time_adventure_within + time_arcade_within + 
    time_card_board_game_within + time_casual_within + time_fighting_within + 
    time_hack_and_slashbeat_em_up_within + time_indie_within + 
    time_moba_within + time_music_within + time_platform_within + 
    time_puzzle_within + time_racing_within + time_real_time_strategy_rts_within + 
    time_roleplaying_rpg_within + time_shooter_within + time_simulator_within + 
    time_sport_within + time_strategy_within + time_tactical_within + 
    time_turnbased_strategy_tbs_within + time_visual_novel_within + 
    time_action_between + time_adventure_between + time_arcade_between + 
    time_card_board_game_between + time_casual_between + time_fighting_between + 
    time_hack_and_slashbeat_em_up_between + time_indie_between + 
    time_moba_between + time_music_between + time_platform_between + 
    time_puzzle_between + time_racing_between + time_real_time_strategy_rts_between + 
    time_roleplaying_rpg_between + time_shooter_between + time_simulator_between + 
    time_sport_between + time_strategy_between + time_tactical_between + 
    time_turnbased_strategy_tbs_between + time_visual_novel_between + 
    (1 | pid)

  Df  Chisq Pr(>Chisq)
1                     
2 21 20.385      0.497
Show code (joint hypotheses H2)
linearHypothesis(fit_h2_rewb, paste0(genre_between_vars[1], " = ", genre_between_vars[2:length(genre_between_vars)]))

Linear hypothesis test:
time_action_between - time_adventure_between = 0
time_action_between - time_arcade_between = 0
time_action_between - time_card_board_game_between = 0
time_action_between - time_casual_between = 0
time_action_between - time_fighting_between = 0
time_action_between - time_hack_and_slashbeat_em_up_between = 0
time_action_between - time_indie_between = 0
time_action_between - time_moba_between = 0
time_action_between - time_music_between = 0
time_action_between - time_platform_between = 0
time_action_between - time_puzzle_between = 0
time_action_between - time_racing_between = 0
time_action_between - time_real_time_strategy_rts_between = 0
time_action_between - time_roleplaying_rpg_between = 0
time_action_between - time_shooter_between = 0
time_action_between - time_simulator_between = 0
time_action_between - time_sport_between = 0
time_action_between - time_strategy_between = 0
time_action_between - time_tactical_between = 0
time_action_between - time_turnbased_strategy_tbs_between = 0
time_action_between - time_visual_novel_between = 0

Model 1: restricted model
Model 2: wemwbs ~ time_action_within + time_adventure_within + time_arcade_within + 
    time_card_board_game_within + time_casual_within + time_fighting_within + 
    time_hack_and_slashbeat_em_up_within + time_indie_within + 
    time_moba_within + time_music_within + time_platform_within + 
    time_puzzle_within + time_racing_within + time_real_time_strategy_rts_within + 
    time_roleplaying_rpg_within + time_shooter_within + time_simulator_within + 
    time_sport_within + time_strategy_within + time_tactical_within + 
    time_turnbased_strategy_tbs_within + time_visual_novel_within + 
    time_action_between + time_adventure_between + time_arcade_between + 
    time_card_board_game_between + time_casual_between + time_fighting_between + 
    time_hack_and_slashbeat_em_up_between + time_indie_between + 
    time_moba_between + time_music_between + time_platform_between + 
    time_puzzle_between + time_racing_between + time_real_time_strategy_rts_between + 
    time_roleplaying_rpg_between + time_shooter_between + time_simulator_between + 
    time_sport_between + time_strategy_between + time_tactical_between + 
    time_turnbased_strategy_tbs_between + time_visual_novel_between + 
    (1 | pid)

  Df  Chisq Pr(>Chisq)
1                     
2 21 23.343      0.326

5.6.3 Plot all estimates

Here we plot the estimates for the genre effects on well-being, along with both uncorrected (95%) confidence intervals, and the corrected confidence intervals from multcomp::glht.

The confidence intervals are particularly wide because there is no true covariation in the data, and the model is trying to estimate the effect of each genre on well-being while accounting for the nested structure of the data. We anticipate smaller CIs in the true data.

Show code (plot estimates)
corrected_cis <- confint(multcomp::glht(fit_h2_rewb, linfct = paste0(genre_within_vars, " = -.06")),
                         adjusted(type = .)) |> 
  tidy()

tests <- tidy(fit_h2_rewb, conf.int = TRUE) |> 
  filter(grepl("within", term)) |> 
  rename(conf.low.uncorrected = conf.low, conf.high.uncorrected = conf.high) |>
  left_join(corrected_cis, by = c("term" = "contrast"))

# we can also calculate CIs for marginal effects; for mean+1 contrasts these are functionally identical in our models.
# ests_fit_h2_rewb <- avg_comparisons(fit_h2_rewb) |>
#   as.data.frame()

tests |> 
  ggplot(aes(estimate.x, term)) +
  geom_linerange(
    aes(xmin = conf.low, xmax = conf.high),
    linewidth = .5
  ) +
  geom_linerange(
    aes(xmin = conf.low.uncorrected, xmax = conf.high.uncorrected),
    linewidth = 1
  ) +
  geom_point() +
  geom_vline(xintercept = -.06, linetype = "dashed") +
  geom_vline(xintercept = .06, linetype = "dashed")

5.7 Precision Analysis

In the above examples, we use the simulated data, which mirrors the structure of the true data, but lacks control over the distribution and relationships between the particular variables used in this study. To provide rough indications of the estimated precision of our tests, here we simulate a dataset with a known relationship between playtime and wellbeing, and then fit the models as above.

We arbitrarily assume that the effect of an hour of daily play in each genre on wellbeing varies from -.2 to .2, consisting of both a within-person and between-person component; this would produce a roughly null relationship on average but significant for particular genres. We specify a within-person SD for the WEMWBS of .7 based on prior literature (Ballou et al. 2024). The distribution of playtime is realistic based on the parameters in 0_generateSyntheticData.qmd; although the distribution of genres is more even than likely in the true dataset.

Show the code (precision analysis)
genre_coefs <- runif(length(genre_vars), -.2, .2)
names(genre_coefs) <- genre_vars

sim_study3 <- aggregated_playtime |> 
  dplyr::select(pid, wave, contains("time"), wemwbs) %>%
  group_by(pid) |>
  mutate(
    random_intercept = rnorm(n(), mean = 0, sd = .6),
    random_slope = rnorm(n(), mean = 0, sd = .2)
  ) |> 
  ungroup() |> 
  mutate(wemwbs_mean = rowSums(across(time_action:time_indie, ~ .x * (random_slope + genre_coefs[[cur_column()]]))),
         wemwbs = rnorm(n(), mean = random_intercept + wemwbs_mean, sd = .7))

h1_total_time <- lmer(
  wemwbs ~ total_time_all_genres_within + total_time_all_genres_between + (1 + total_time_all_genres_within | pid), 
  data = sim_study3
)
summary(h1_total_time)
Linear mixed model fit by REML ['lmerMod']
Formula: 
wemwbs ~ total_time_all_genres_within + total_time_all_genres_between +  
    (1 + total_time_all_genres_within | pid)
   Data: sim_study3

REML criterion at convergence: 31826.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0485 -0.6727 -0.0069  0.6600  3.5846 

Random effects:
 Groups   Name                         Variance Std.Dev. Corr
 pid      (Intercept)                  0.01211  0.1101       
          total_time_all_genres_within 0.06807  0.2609   0.44
 Residual                              0.89086  0.9439       
Number of obs: 11586, groups:  pid, 1998

Fixed effects:
                              Estimate Std. Error t value
(Intercept)                    0.02403    0.01640   1.465
total_time_all_genres_within  -0.03413    0.02471  -1.381
total_time_all_genres_between -0.03760    0.01475  -2.549

Correlation of Fixed Effects:
                 (Intr) ttl_tm_ll_gnrs_w
ttl_tm_ll_gnrs_w -0.002                 
ttl_tm_ll_gnrs_b -0.831  0.021          
Show the code (precision analysis)
# fit model
fit_h2_rewb_sim <- lmer(
  paste(
      "wemwbs ~", paste(genre_vars_demean, collapse = "+"),
      "+ (1 | pid)"
    ),
  sim_study3
)
summary(fit_h2_rewb_sim)
Linear mixed model fit by REML ['lmerMod']
Formula: 
wemwbs ~ time_action_within + time_adventure_within + time_arcade_within +  
    time_card_board_game_within + time_casual_within + time_fighting_within +  
    time_hack_and_slashbeat_em_up_within + time_indie_within +  
    time_moba_within + time_music_within + time_platform_within +  
    time_puzzle_within + time_racing_within + time_real_time_strategy_rts_within +  
    time_roleplaying_rpg_within + time_shooter_within + time_simulator_within +  
    time_sport_within + time_strategy_within + time_tactical_within +  
    time_turnbased_strategy_tbs_within + time_visual_novel_within +  
    time_action_between + time_adventure_between + time_arcade_between +  
    time_card_board_game_between + time_casual_between + time_fighting_between +  
    time_hack_and_slashbeat_em_up_between + time_indie_between +  
    time_moba_between + time_music_between + time_platform_between +  
    time_puzzle_between + time_racing_between + time_real_time_strategy_rts_between +  
    time_roleplaying_rpg_between + time_shooter_between + time_simulator_between +  
    time_sport_between + time_strategy_between + time_tactical_between +  
    time_turnbased_strategy_tbs_between + time_visual_novel_between +  
    (1 | pid)
   Data: sim_study3

REML criterion at convergence: 31811.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.5229 -0.6698 -0.0036  0.6655  3.5212 

Random effects:
 Groups   Name        Variance Std.Dev.
 pid      (Intercept) 0.009712 0.09855 
 Residual             0.899672 0.94851 
Number of obs: 11586, groups:  pid, 1998

Fixed effects:
                                       Estimate Std. Error t value
(Intercept)                           -0.001396   0.017818  -0.078
time_action_within                    -0.082757   0.069967  -1.183
time_adventure_within                 -0.108455   0.087833  -1.235
time_arcade_within                     0.043556   0.111176   0.392
time_card_board_game_within            0.171394   0.112263   1.527
time_casual_within                    -0.503285   0.313612  -1.605
time_fighting_within                  -0.241463   0.114277  -2.113
time_hack_and_slashbeat_em_up_within   0.108317   0.118924   0.911
time_indie_within                      0.298340   0.444731   0.671
time_moba_within                      -0.429218   0.114411  -3.752
time_music_within                     -0.222963   0.115576  -1.929
time_platform_within                  -0.130481   0.113121  -1.153
time_puzzle_within                     0.102742   0.118092   0.870
time_racing_within                    -0.311464   0.114806  -2.713
time_real_time_strategy_rts_within     0.061902   0.109552   0.565
time_roleplaying_rpg_within            0.265514   0.113015   2.349
time_shooter_within                   -0.106992   0.115889  -0.923
time_simulator_within                  0.011983   0.111349   0.108
time_sport_within                      0.028992   0.116573   0.249
time_strategy_within                   0.306823   0.113099   2.713
time_tactical_within                   0.022961   0.110662   0.207
time_turnbased_strategy_tbs_within     0.015596   0.112384   0.139
time_visual_novel_within              -0.156799   0.113897  -1.377
time_action_between                    0.159638   0.063465   2.515
time_adventure_between                -0.211835   0.190982  -1.109
time_arcade_between                    0.316874   0.254176   1.247
time_card_board_game_between          -0.065721   0.235024  -0.280
time_casual_between                   -0.832767   0.709979  -1.173
time_fighting_between                 -0.415746   0.256483  -1.621
time_hack_and_slashbeat_em_up_between -0.235432   0.281112  -0.838
time_indie_between                    -0.112480   0.979453  -0.115
time_moba_between                     -0.068524   0.261991  -0.262
time_music_between                     0.067223   0.255790   0.263
time_platform_between                 -0.172413   0.257775  -0.669
time_puzzle_between                   -0.179568   0.273666  -0.656
time_racing_between                    0.097438   0.268186   0.363
time_real_time_strategy_rts_between   -0.043180   0.252649  -0.171
time_roleplaying_rpg_between           0.410954   0.264117   1.556
time_shooter_between                  -0.302373   0.264189  -1.145
time_simulator_between                -0.449777   0.260109  -1.729
time_sport_between                     0.160082   0.265361   0.603
time_strategy_between                  0.439197   0.260646   1.685
time_tactical_between                  0.191266   0.264628   0.723
time_turnbased_strategy_tbs_between   -0.272583   0.252251  -1.081
time_visual_novel_between             -0.007673   0.250439  -0.031
Show the code (precision analysis)
tidy(fit_h2_rewb_sim, conf.int = TRUE) |>
  ggplot(aes(estimate, term)) +
  geom_linerange(
    aes(xmin = conf.low, xmax = conf.high),
    linewidth = .5
  ) +
  geom_point() +
  geom_vline(xintercept = -.06, linetype = "dashed") +
  geom_vline(xintercept = .06, linetype = "dashed")

Ballou, Nick, Craig Jeffrey Robb Sewall, Jack Ratcliffe, David Zendle, Laurissa Tokarchuk, and Sebastian Deterding. 2024. “Registered Report Evidence Suggests No Relationship Between Objectively-Tracked Video Game Playtime and Wellbeing over 3 Months.” Technology, Mind, and Behavior 5 (1): 1–15. https://doi.org/10.1037/tmb0000124.