Meta-Data

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

Data prepping

Read in data

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

Simulate correlation

#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)

Data analysis

#compute sampling sampling variances `vi`
data <- escalc(measure = "COR",
               ri = Corr,
               ni = N, 
               data = data,
               slab = ID) %>% select(-yi)

Neuroticism and variability in Emotions

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)

Neuroticism and variability in Well-being

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)

Moderator: ESM vs. LD

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

Moderator: Positive vs. Negative affect

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