require(tidyverse)
require(rio)
require(summarytools)
require(psych)
require(metafor)
set.seed(202104)
sessionInfo()
## R version 4.0.4 (2021-02-15)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19041)
##
## Matrix products: default
##
## locale:
## [1] LC_COLLATE=English_United States.1252
## [2] LC_CTYPE=English_United States.1252
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.1252
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] metafor_2.4-0 Matrix_1.3-2 psych_2.0.12 summarytools_0.9.8
## [5] rio_0.5.16 forcats_0.5.1 stringr_1.4.0 dplyr_1.0.4
## [9] purrr_0.3.4 readr_1.4.0 tidyr_1.1.2 tibble_3.0.6
## [13] ggplot2_3.3.3 tidyverse_1.3.0
##
## loaded via a namespace (and not attached):
## [1] httr_1.4.2 sass_0.3.1 jsonlite_1.7.2 tmvnsim_1.0-2
## [5] modelr_0.1.8 bslib_0.2.4 assertthat_0.2.1 pander_0.6.3
## [9] cellranger_1.1.0 yaml_2.2.1 pillar_1.4.7 backports_1.2.1
## [13] lattice_0.20-41 glue_1.4.2 digest_0.6.27 pryr_0.1.4
## [17] checkmate_2.0.0 rvest_0.3.6 colorspace_2.0-0 htmltools_0.5.1.1
## [21] plyr_1.8.6 pkgconfig_2.0.3 broom_0.7.5 haven_2.3.1
## [25] magick_2.6.0 scales_1.1.1 openxlsx_4.2.3 generics_0.1.0
## [29] ellipsis_0.3.1 withr_2.4.1 cli_2.3.0 mnormt_2.0.2
## [33] magrittr_2.0.1 crayon_1.4.1 readxl_1.3.1 evaluate_0.14
## [37] fs_1.5.0 nlme_3.1-152 xml2_1.3.2 foreign_0.8-81
## [41] rapportools_1.0 tools_4.0.4 data.table_1.14.0 hms_1.0.0
## [45] lifecycle_1.0.0 matrixStats_0.58.0 munsell_0.5.0 reprex_1.0.0
## [49] zip_2.1.1 compiler_4.0.4 jquerylib_0.1.3 rlang_0.4.10
## [53] grid_4.0.4 rstudioapi_0.13 tcltk_4.0.4 base64enc_0.1-3
## [57] rmarkdown_2.7 gtable_0.3.0 codetools_0.2-18 DBI_1.1.1
## [61] curl_4.3 R6_2.5.0 lubridate_1.7.9.2 knitr_1.31
## [65] stringi_1.5.3 parallel_4.0.4 Rcpp_1.0.6 vctrs_0.3.6
## [69] dbplyr_2.1.0 tidyselect_1.1.0 xfun_0.21
This dataset includes the full-text coding of the first 30 eligible articles during the pilot stage with 34 samples. None of these articles reported the needed statistics, so these values will be simulated in the next section. Only personality at the Big Five level (OCEAN traits) are included. Some descriptive statistics of study characteristics are presented below:
#read in the needed columns
data <- rio::import("Coding-2021-04-23.xlsx") %>%
select(-c(PDF, Year, Author, Title, Journal, Vol, Issue, Pages, Location, Notes, Archival))
#number of samples
data <- data %>%
mutate(ID = ifelse(is.na(Study), ID,
paste0(ID, "_", Study)))
#reasons for ineligibility
data %>% group_by(Eligible) %>%
summarise(n = n())%>%
knitr::kable()
| Eligible | n |
|---|---|
| No | 8 |
| Pending | 358 |
data %>% filter(Eligible == "No") %>%
group_by(Why_ineligible) %>%
summarise(reason = n()) %>%
knitr::kable()
| Why_ineligible | reason |
|---|---|
| No personality | 4 |
| Not longitudinal | 4 |
#remove ineligible studies
data <- data %>%
filter(Eligible != "No")
#clean-up descriptives
data$N <- as.numeric(data$N)
data[which(data$MAge == "49.8 (M) and 45.5 (F)"),]$MAge <- (49.8+45.5)/2
data[which(data$SDAge == "17.3 (M) and 14.1 (F)"),]$SDAge <- (17.3+14.1)/2
data$MAge <- round(as.numeric(data$MAge), digits = 3)
data$SDAge <- round(as.numeric(data$SDAge), digits = 3)
data[which(as.numeric(data$White) > 1),]$White <- as.numeric(data[which(as.numeric(data$White) > 1),]$White)/100
data$Fem <- round(as.numeric(data$Fem), digits = 3)
data$White <- round(as.numeric(data$White), digits = 3)
data$num = 1
for (i in 1:(length(data$ID)-1)){
data[i,]$num <- ifelse(data[i,]$ID != data[i+1,]$ID, 1, NA)
}
descr <- data %>% filter(num == 1) %>% select(N,MAge, SDAge, Fem, White)
descr(descr, stats = "common", order = "p")
Descriptive Statistics
descr
N: 26
| N | MAge | SDAge | Fem | White | |
|---|---|---|---|---|---|
| Mean | 3993.15 | 33.15 | 7.50 | 0.58 | 0.70 |
| Std.Dev | 8786.94 | 14.80 | 6.13 | 0.17 | 0.19 |
| Min | 63.00 | 13.10 | 0.65 | 0.21 | 0.44 |
| Median | 492.50 | 34.19 | 6.35 | 0.59 | 0.76 |
| Max | 34548.00 | 62.97 | 17.94 | 1.00 | 0.93 |
| N.Valid | 26.00 | 24.00 | 23.00 | 25.00 | 6.00 |
| Pct.Valid | 100.00 | 92.31 | 88.46 | 96.15 | 23.08 |
#pool ESM + DD = ESM
data <- data %>%
mutate(Design = ifelse(Design == "DD", "ESM", Design))
#emotion variable with two levels (positive and negative)
data <- data %>%
mutate(EmoPN = ifelse(str_detect(Emo, "Positive") | str_detect(Emo, "Happ") |
str_detect(Emo, "Authenticity"), "Positive",
ifelse(str_detect(Emo, "Negative") | str_detect(Emo, "stress") |
str_detect(Emo, "distress") | str_detect(Emo, "boredom")|
str_detect(Emo, "sadness") | str_detect(Emo, "strain") |
str_detect(Emo, "Anxiety") | str_detect(Emo, "Stress") |
str_detect(Emo, "Depression") | str_detect(Emo, "Burnout") |
str_detect(Emo, "Powerlessness"), "Negative", NA)))
#only select big five domains (OCEAN)
pers <- c("Agreeableness", "Conscientiousness", "Extraversion", "Neuroticism", "Openness")
data <- data %>%
filter(Pers %in% pers)
data %>%
group_by(Pers) %>%
summarise(n = n())%>%
knitr::kable()
| Pers | n |
|---|---|
| Agreeableness | 49 |
| Conscientiousness | 53 |
| Extraversion | 68 |
| Neuroticism | 67 |
| Openness | 49 |
freq(data$Pers)
Frequencies
data$Pers
Type: Character
| Freq | % Valid | % Valid Cum. | % Total | % Total Cum. | |
|---|---|---|---|---|---|
| Agreeableness | 49 | 17.13 | 17.13 | 17.13 | 17.13 |
| Conscientiousness | 53 | 18.53 | 35.66 | 18.53 | 35.66 |
| Extraversion | 68 | 23.78 | 59.44 | 23.78 | 59.44 |
| Neuroticism | 67 | 23.43 | 82.87 | 23.43 | 82.87 |
| Openness | 49 | 17.13 | 100.00 | 17.13 | 100.00 |
| 0 | 0.00 | 100.00 | |||
| Total | 286 | 100.00 | 100.00 | 100.00 | 100.00 |
freq(data$ID)
Frequencies
data$ID
Type: Character
| Freq | % Valid | % Valid Cum. | % Total | % Total Cum. | |
|---|---|---|---|---|---|
| ID-001 | 10 | 3.50 | 3.50 | 3.50 | 3.50 |
| ID-002 | 3 | 1.05 | 4.55 | 1.05 | 4.55 |
| ID-005 | 5 | 1.75 | 6.29 | 1.75 | 6.29 |
| ID-006 | 20 | 6.99 | 13.29 | 6.99 | 13.29 |
| ID-007 | 1 | 0.35 | 13.64 | 0.35 | 13.64 |
| ID-008 | 8 | 2.80 | 16.43 | 2.80 | 16.43 |
| ID-010_2 | 10 | 3.50 | 19.93 | 3.50 | 19.93 |
| ID-011 | 10 | 3.50 | 23.43 | 3.50 | 23.43 |
| ID-012 | 6 | 2.10 | 25.52 | 2.10 | 25.52 |
| ID-013 | 4 | 1.40 | 26.92 | 1.40 | 26.92 |
| ID-014 | 10 | 3.50 | 30.42 | 3.50 | 30.42 |
| ID-015 | 10 | 3.50 | 33.92 | 3.50 | 33.92 |
| ID-016 | 10 | 3.50 | 37.41 | 3.50 | 37.41 |
| ID-018 | 5 | 1.75 | 39.16 | 1.75 | 39.16 |
| ID-019 | 15 | 5.24 | 44.41 | 5.24 | 44.41 |
| ID-020 | 5 | 1.75 | 46.15 | 1.75 | 46.15 |
| ID-021 | 10 | 3.50 | 49.65 | 3.50 | 49.65 |
| ID-022 | 15 | 5.24 | 54.90 | 5.24 | 54.90 |
| ID-025_1 | 12 | 4.20 | 59.09 | 4.20 | 59.09 |
| ID-025_2 | 16 | 5.59 | 64.69 | 5.59 | 64.69 |
| ID-026_2 | 8 | 2.80 | 67.48 | 2.80 | 67.48 |
| ID-028_1 | 30 | 10.49 | 77.97 | 10.49 | 77.97 |
| ID-028_2 | 30 | 10.49 | 88.46 | 10.49 | 88.46 |
| ID-029 | 5 | 1.75 | 90.21 | 1.75 | 90.21 |
| ID-030 | 28 | 9.79 | 100.00 | 9.79 | 100.00 |
| 0 | 0.00 | 100.00 | |||
| Total | 286 | 100.00 | 100.00 | 100.00 | 100.00 |
freq(data$Design)
Frequencies
data$Design
Type: Character
| Freq | % Valid | % Valid Cum. | % Total | % Total Cum. | |
|---|---|---|---|---|---|
| ESM | 75 | 26.22 | 26.22 | 26.22 | 26.22 |
| LD | 211 | 73.78 | 100.00 | 73.78 | 100.00 |
| 0 | 0.00 | 100.00 | |||
| Total | 286 | 100.00 | 100.00 | 100.00 | 100.00 |
#sample from normal distribution (fisher's z, mean = 0.1, sd = 0.2)
data$Corr <- rnorm(n = nrow(data), mean = 0.1, sd = 0.2)
#transformed to pearson's correlation
data$Corr <- fisherz2r(data$Corr)
hist(data$Corr)
#compute sampling sampling variances `vi`
data <- escalc(measure = "COR",
ri = Corr,
ni = N,
data = data,
slab = ID) %>% select(-yi)
Analyses are run separately for each personality trait. For ease of presentation, only the model for Neuroticism is shown here:
neuroticism <- rma.mv(yi = Corr,
V = vi,
data = data[which(data$Pers == "Neuroticism" & !is.na(data$EmoPN)),],
method = "REML",
level = 95,
digits = 4,
slab = ID,
random = ~1 | ID)
neuroticism
##
## Multivariate Meta-Analysis Model (k = 35; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor
## sigma^2 0.0229 0.1515 17 no ID
##
## Test for Heterogeneity:
## Q(df = 34) = 2260.0762, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.0767 0.0381 2.0127 0.0441 0.0020 0.1514 *
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mar=c(2.5,4,1,2.5), cex = .9, font = 1)
forest(neuroticism,
xlim = c(-2,2),
order = "obs",
addfit = T,
annotate = T,
width = 0,
efac = .5,
pch = 19,
clim = c(-1,1),
cex.lab = 1,
cex.axis = 1,
cex = .85,
lty = c("solid", "solid", "solid"),
xlab = "",
mlab = "Neuroticism - Emotion variability \n RE: k = 35, p = 0.044",
showweights = F,
steps = 5)
Analyses are run separately for each personality trait. For ease of presentation, only the model for Neuroticism is shown here:
neuroticism <- rma.mv(yi = Corr,
V = vi,
data = data[which(data$Pers == "Neuroticism" & !is.na(data$WB)),],
method = "REML",
level = 95,
digits = 4,
slab = ID,
random = ~1 | ID)
neuroticism
##
## Multivariate Meta-Analysis Model (k = 31; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor
## sigma^2 0.0298 0.1725 12 no ID
##
## Test for Heterogeneity:
## Q(df = 30) = 6851.7066, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## 0.1853 0.0510 3.6359 0.0003 0.0854 0.2851 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
par(mar=c(2.5,4,1,2.5), cex = .9, font = 1)
forest(neuroticism,
xlim = c(-2,2),
order = "obs",
addfit = T,
annotate = T,
width = 0,
efac = .5,
pch = 19,
clim = c(-1,1),
cex.lab = 1,
cex.axis = 1,
cex = .85,
lty = c("solid", "solid", "solid"),
xlab = "",
mlab = "Neuroticism - Well-being variability \n RE: k = 31, p < 0.001",
showweights = F,
steps = 5)
The first moderator is the repeated-measure design. A study is considered ESM if it uses rapid assessments with frequency from daily to multiple times a day. Examples include experience sampling methods and daily diary studies. A study is considered LD if it uses traditional longitudinal design with assessments ranging from weeks, months, to years apart. For ease of presentation, only models for trait Neuroticism are tested for moderators. Because all studies with well-being are traditional longitudinal design, only models with emotional variability are tested for this moderator
designEmo <- rma.mv(yi = Corr,
V = vi,
mods = ~factor(Design),
data = data[which(data$Pers == "Neuroticism"& !is.na(data$EmoPN)),],
random = ~1 | ID)
designEmo
##
## Multivariate Meta-Analysis Model (k = 35; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor
## sigma^2 0.0245 0.1565 17 no ID
##
## Test for Residual Heterogeneity:
## QE(df = 33) = 2224.8173, p-val < .0001
##
## Test of Moderators (coefficient 2):
## QM(df = 1) = 0.0273, p-val = 0.8687
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## intrcpt 0.0845 0.0621 1.3602 0.1738 -0.0372 0.2062
## factor(Design)LD -0.0133 0.0802 -0.1653 0.8687 -0.1704 0.1439
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
EmoPN <- rma.mv(yi = Corr,
V = vi,
mods = ~factor(EmoPN),
data = data[which(data$Pers == "Neuroticism"& !is.na(data$EmoPN)),],
random = ~1 | ID)
EmoPN
##
## Multivariate Meta-Analysis Model (k = 35; method: REML)
##
## Variance Components:
##
## estim sqrt nlvls fixed factor
## sigma^2 0.0261 0.1615 17 no ID
##
## Test for Residual Heterogeneity:
## QE(df = 33) = 2023.2887, p-val < .0001
##
## Test of Moderators (coefficient 2):
## QM(df = 1) = 30.6283, p-val < .0001
##
## Model Results:
##
## estimate se zval pval ci.lb ci.ub
## intrcpt 0.0933 0.0406 2.2994 0.0215 0.0138 0.1729 *
## factor(EmoPN)Positive -0.0611 0.0110 -5.5343 <.0001 -0.0828 -0.0395 ***
##
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1