347 lines
8.9 KiB
Python
347 lines
8.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# ---
|
|
# jupyter:
|
|
# jupytext:
|
|
# formats: ipynb,py:percent
|
|
# text_representation:
|
|
# extension: .py
|
|
# format_name: percent
|
|
# format_version: '1.3'
|
|
# jupytext_version: 1.14.5
|
|
# kernelspec:
|
|
# display_name: straw2analysis
|
|
# language: python
|
|
# name: straw2analysis
|
|
# ---
|
|
|
|
# %%
|
|
import datetime
|
|
|
|
import seaborn as sns
|
|
|
|
import participants.query_db
|
|
from features.esm import clean_up_esm, get_esm_data, preprocess_esm
|
|
from features.esm_JCQ import reverse_jcq_demand_control_scoring
|
|
from features.esm_SAM import extract_stressful_events
|
|
|
|
# import os
|
|
# import sys
|
|
# nb_dir = os.path.split(os.getcwd())[0]
|
|
# if nb_dir not in sys.path:
|
|
# sys.path.append(nb_dir)
|
|
|
|
|
|
# %%
|
|
save_figs = False
|
|
|
|
# %%
|
|
participants_inactive_usernames = participants.query_db.get_usernames(
|
|
collection_start=datetime.date.fromisoformat("2020-08-01")
|
|
)
|
|
df_esm_inactive = get_esm_data(participants_inactive_usernames)
|
|
|
|
# %%
|
|
df_esm_preprocessed = preprocess_esm(df_esm_inactive)
|
|
|
|
# %% [markdown]
|
|
# # PANAS
|
|
|
|
# %%
|
|
df_esm_PANAS = df_esm_preprocessed[
|
|
(df_esm_preprocessed["questionnaire_id"] == 8)
|
|
| (df_esm_preprocessed["questionnaire_id"] == 9)
|
|
]
|
|
df_esm_PANAS_clean = clean_up_esm(df_esm_PANAS)
|
|
|
|
# %% [markdown]
|
|
# Group by participants, date, and subscale and calculate daily means.
|
|
|
|
# %%
|
|
df_esm_PANAS_daily_means = (
|
|
df_esm_PANAS_clean.groupby(["participant_id", "date_lj", "questionnaire_id"])
|
|
.esm_user_answer_numeric.agg("mean")
|
|
.reset_index()
|
|
.rename(columns={"esm_user_answer_numeric": "esm_numeric_mean"})
|
|
)
|
|
|
|
# %% [markdown]
|
|
# Next, calculate mean, median, and standard deviation across all days for each participant.
|
|
|
|
# %%
|
|
df_esm_PANAS_summary_participant = (
|
|
df_esm_PANAS_daily_means.groupby(["participant_id", "questionnaire_id"])
|
|
.esm_numeric_mean.agg(["mean", "median", "std"])
|
|
.reset_index(col_level=1)
|
|
)
|
|
df_esm_PANAS_summary_participant[
|
|
"PANAS subscale"
|
|
] = df_esm_PANAS_daily_means.questionnaire_id.astype("category").cat.rename_categories(
|
|
{8.0: "positive affect", 9.0: "negative affect"}
|
|
)
|
|
|
|
# %%
|
|
df_esm_PANAS_summary_participant.groupby("PANAS subscale").describe()["mean"]
|
|
|
|
# %%
|
|
df_esm_PANAS_summary_participant.groupby("PANAS subscale").describe()["std"]
|
|
|
|
# %%
|
|
df_esm_PANAS_summary_participant.query("std == 0")
|
|
|
|
# %%
|
|
fig1 = sns.displot(
|
|
data=df_esm_PANAS_summary_participant, x="mean", hue="PANAS subscale", binwidth=0.2
|
|
)
|
|
fig1.set_axis_labels(x_var="participant mean", y_var="frequency")
|
|
if save_figs:
|
|
fig1.figure.savefig("PANAS_mean_participant.pdf", dpi=300)
|
|
|
|
# %%
|
|
sns.displot(
|
|
data=df_esm_PANAS_summary_participant,
|
|
x="median",
|
|
hue="PANAS subscale",
|
|
binwidth=0.2,
|
|
)
|
|
|
|
# %%
|
|
fig2 = sns.displot(
|
|
data=df_esm_PANAS_summary_participant, x="std", hue="PANAS subscale", binwidth=0.05
|
|
)
|
|
fig2.set_axis_labels(x_var="participant standard deviation", y_var="frequency")
|
|
if save_figs:
|
|
fig2.figure.savefig("PANAS_std_participant.pdf", dpi=300)
|
|
|
|
# %%
|
|
df_esm_PANAS_summary_participant[df_esm_PANAS_summary_participant["std"] < 0.1]
|
|
|
|
# %% [markdown]
|
|
# # Stress appraisal measure
|
|
|
|
# %%
|
|
df_SAM_all = extract_stressful_events(df_esm_inactive)
|
|
|
|
# %%
|
|
df_SAM_all.head()
|
|
|
|
# %%
|
|
df_esm_SAM = df_esm_preprocessed[
|
|
(df_esm_preprocessed["questionnaire_id"] >= 87)
|
|
& (df_esm_preprocessed["questionnaire_id"] <= 93)
|
|
]
|
|
df_esm_SAM_clean = clean_up_esm(df_esm_SAM)
|
|
|
|
# %% [markdown]
|
|
# ## Stressful events
|
|
|
|
# %%
|
|
df_esm_SAM_event = df_esm_SAM_clean[df_esm_SAM_clean["questionnaire_id"] == 87].assign(
|
|
stressful_event=lambda x: (x.esm_user_answer_numeric > 0)
|
|
)
|
|
|
|
# %%
|
|
df_esm_SAM_daily_events = (
|
|
df_esm_SAM_event.groupby(["participant_id", "date_lj"])
|
|
.stressful_event.agg("mean")
|
|
.reset_index()
|
|
.rename(columns={"stressful_event": "SAM_event_ratio"})
|
|
)
|
|
|
|
# %% [markdown]
|
|
# Calculate the daily mean of YES (1) or NO (0) answers to the question about stressful events. This is then the daily ratio of EMA sessions that included a stressful event.
|
|
|
|
# %%
|
|
df_esm_SAM_event_summary_participant = (
|
|
df_esm_SAM_daily_events.groupby(["participant_id"])
|
|
.SAM_event_ratio.agg(["mean", "median", "std"])
|
|
.reset_index(col_level=1)
|
|
)
|
|
|
|
# %%
|
|
fig6 = sns.displot(data=df_esm_SAM_event_summary_participant, x="mean", binwidth=0.1)
|
|
fig6.set_axis_labels(
|
|
x_var="participant proportion of stressful events", y_var="frequency"
|
|
)
|
|
if save_figs:
|
|
fig6.figure.savefig("SAM_events_mean_participant.pdf", dpi=300)
|
|
|
|
# %%
|
|
sns.displot(data=df_esm_SAM_event_summary_participant, x="std", binwidth=0.05)
|
|
|
|
# %% [markdown]
|
|
# ### Threat and challenge
|
|
|
|
# %% [markdown]
|
|
# * Example of threat: "Did this event make you feel anxious?"
|
|
# * Example of challenge: "How eager are you to tackle this event?"
|
|
# * Possible answers:
|
|
# 0 - Not at all,
|
|
# 1 - Slightly,
|
|
# 2 - Moderately,
|
|
# 3 - Considerably,
|
|
# 4 - Extremely
|
|
|
|
# %%
|
|
df_esm_SAM_daily = (
|
|
df_esm_SAM_clean.groupby(["participant_id", "date_lj", "questionnaire_id"])
|
|
.esm_user_answer_numeric.agg("mean")
|
|
.reset_index()
|
|
.rename(columns={"esm_user_answer_numeric": "esm_numeric_mean"})
|
|
)
|
|
|
|
# %%
|
|
df_esm_SAM_daily_threat_challenge = df_esm_SAM_daily[
|
|
(df_esm_SAM_daily["questionnaire_id"] == 88)
|
|
| (df_esm_SAM_daily["questionnaire_id"] == 89)
|
|
]
|
|
|
|
# %%
|
|
df_esm_SAM_summary_participant = (
|
|
df_esm_SAM_daily.groupby(["participant_id", "questionnaire_id"])
|
|
.esm_numeric_mean.agg(["mean", "median", "std"])
|
|
.reset_index(col_level=1)
|
|
)
|
|
|
|
# %%
|
|
df_esm_SAM_event_stressfulness_summary_participant = df_esm_SAM_summary_participant[
|
|
df_esm_SAM_summary_participant["questionnaire_id"] == 87
|
|
]
|
|
df_esm_SAM_event_stressfulness_summary_participant.describe()["mean"]
|
|
|
|
# %%
|
|
df_esm_SAM_event_stressfulness_summary_participant.describe()["std"]
|
|
|
|
# %%
|
|
sns.displot(
|
|
data=df_esm_SAM_event_stressfulness_summary_participant, x="mean", binwidth=0.2
|
|
)
|
|
|
|
# %%
|
|
df_esm_SAM_threat_challenge_summary_participant = df_esm_SAM_summary_participant[
|
|
(df_esm_SAM_summary_participant["questionnaire_id"] == 88)
|
|
| (df_esm_SAM_summary_participant["questionnaire_id"] == 89)
|
|
]
|
|
df_esm_SAM_threat_challenge_summary_participant[
|
|
"event subscale"
|
|
] = df_esm_SAM_threat_challenge_summary_participant.questionnaire_id.astype(
|
|
"category"
|
|
).cat.rename_categories(
|
|
{88: "threat", 89: "challenge"}
|
|
)
|
|
|
|
# %%
|
|
sns.displot(
|
|
data=df_esm_SAM_threat_challenge_summary_participant,
|
|
x="mean",
|
|
hue="event subscale",
|
|
binwidth=0.2,
|
|
)
|
|
|
|
# %%
|
|
fig3 = sns.displot(
|
|
data=df_esm_SAM_threat_challenge_summary_participant,
|
|
x="std",
|
|
hue="event subscale",
|
|
binwidth=0.1,
|
|
)
|
|
fig3.set_axis_labels(x_var="participant standard deviation", y_var="frequency")
|
|
if save_figs:
|
|
fig3.figure.savefig("SAM_std_participant.pdf", dpi=300)
|
|
|
|
# %%
|
|
df_esm_SAM_threat_challenge_summary_participant.groupby("event subscale").describe()[
|
|
"mean"
|
|
]
|
|
|
|
# %%
|
|
df_esm_SAM_threat_challenge_summary_participant.groupby("event subscale").describe()[
|
|
"std"
|
|
]
|
|
|
|
# %% [markdown]
|
|
# ## Stressfulness of period
|
|
|
|
# %%
|
|
df_esm_SAM_period_summary_participant = df_esm_SAM_summary_participant[
|
|
df_esm_SAM_summary_participant["questionnaire_id"] == 93
|
|
]
|
|
|
|
# %%
|
|
df_esm_SAM_period_summary_participant.describe()["mean"]
|
|
|
|
# %%
|
|
df_esm_SAM_period_summary_participant.describe()["std"]
|
|
|
|
# %%
|
|
sns.displot(data=df_esm_SAM_period_summary_participant, x="mean", binwidth=0.2)
|
|
|
|
# %%
|
|
sns.displot(data=df_esm_SAM_period_summary_participant, x="std", binwidth=0.1)
|
|
|
|
# %% [markdown]
|
|
# # Job demand and control
|
|
|
|
# %%
|
|
df_esm_JCQ_demand_control = df_esm_preprocessed[
|
|
(df_esm_preprocessed["questionnaire_id"] >= 10)
|
|
& (df_esm_preprocessed["questionnaire_id"] <= 11)
|
|
]
|
|
df_esm_JCQ_demand_control_clean = clean_up_esm(df_esm_JCQ_demand_control)
|
|
|
|
# %%
|
|
df_esm_JCQ_demand_control_reversed = reverse_jcq_demand_control_scoring(
|
|
df_esm_JCQ_demand_control_clean
|
|
)
|
|
|
|
# %%
|
|
df_esm_JCQ_daily = (
|
|
df_esm_JCQ_demand_control_reversed.groupby(
|
|
["participant_id", "date_lj", "questionnaire_id"]
|
|
)
|
|
.esm_user_score.agg("mean")
|
|
.reset_index()
|
|
.rename(columns={"esm_user_score": "esm_score_mean"})
|
|
)
|
|
df_esm_JCQ_summary_participant = (
|
|
df_esm_JCQ_daily.groupby(["participant_id", "questionnaire_id"])
|
|
.esm_score_mean.agg(["mean", "median", "std"])
|
|
.reset_index(col_level=1)
|
|
)
|
|
df_esm_JCQ_summary_participant[
|
|
"JCQ subscale"
|
|
] = df_esm_JCQ_summary_participant.questionnaire_id.astype(
|
|
"category"
|
|
).cat.rename_categories(
|
|
{10: "job demand", 11: "job control"}
|
|
)
|
|
|
|
# %%
|
|
df_esm_JCQ_summary_participant.groupby("JCQ subscale").describe()["mean"]
|
|
|
|
# %%
|
|
df_esm_JCQ_summary_participant.groupby("JCQ subscale").describe()["std"]
|
|
|
|
# %%
|
|
fig4 = sns.displot(
|
|
data=df_esm_JCQ_summary_participant,
|
|
x="mean",
|
|
hue="JCQ subscale",
|
|
binwidth=0.1,
|
|
)
|
|
fig4.set_axis_labels(x_var="participant mean", y_var="frequency")
|
|
if save_figs:
|
|
fig4.figure.savefig("JCQ_mean_participant.pdf", dpi=300)
|
|
|
|
# %%
|
|
fig5 = sns.displot(
|
|
data=df_esm_JCQ_summary_participant,
|
|
x="std",
|
|
hue="JCQ subscale",
|
|
binwidth=0.05,
|
|
)
|
|
fig6.set_axis_labels(x_var="participant standard deviation", y_var="frequency")
|
|
if save_figs:
|
|
fig5.figure.savefig("JCQ_std_participant.pdf", dpi=300)
|
|
|
|
# %%
|