Group Project (Experimentation and Notes)

Code
#load in packages
library("tidyverse")
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.0     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.2     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Code
library("dplyr")
library("ggplot2")
library("plotly")

Attaching package: 'plotly'

The following object is masked from 'package:ggplot2':

    last_plot

The following object is masked from 'package:stats':

    filter

The following object is masked from 'package:graphics':

    layout
Code
library("rafalib")

#data cleaning
data = readxl::read_excel("DATA1901_group_project.xlsx")
New names:
• `` -> `...1`
Code
data = na.omit(data)
data = filter(data, gender != "other") #limited sample size for "other" gender catagory

#adding agase_total variable to pair along side bgase_total labelled "Baseline_gase" and symptom change labelled "tot"
cleaned_data = mutate(data, agase_total = agase_1 + agase_2 + agase_3 + agase_4 + agase_5 + agase_6 + agase_7 + agase_8 + agase_9 + agase_10)
#adding Side Effect Modelling boolean (SEM)
cleaned_data = mutate(cleaned_data, SEM = ifelse(social_mod != "NA", "SEM", "No SEM"))

#adding filtered data sets to focus on gendered-correlations/summaries
male_filtered = filter(cleaned_data, gender == "Male")
female_filtered = filter(cleaned_data, gender == "Female")

Symptom Change Analysis

Code
ggplot(cleaned_data, aes(x = tot, fill = gender)) +
  geom_histogram(aes(y = after_stat(density)), position = "dodge", bins = 25) +
  labs(y = "Density", x = "Aggregate Symptom Change", title = "Symptom Changes in Male vs Female", fill = "Gender")

Code
print("Male Numerical Summaries")
[1] "Male Numerical Summaries"
Code
mean(male_filtered$tot)
[1] 0.4680851
Code
sd(male_filtered$tot)
[1] 1.874904
Code
print("Female Numerical Summaries")
[1] "Female Numerical Summaries"
Code
mean(female_filtered$tot)
[1] 0.5818182
Code
sd(female_filtered$tot)
[1] 2.72394

Things to notice:

  • Bulk of data is surrounding the neutral point (x=0), meaning most of the participants didn’t experience much symptom change from the placebo (“cognitive enhancer”)

  • Female spread is much greater than men -> outliers tend to be female whereas the spread of men is much more condense around the neutral point

  • Means are both roughly the same around neutral point however both slightly positive -> agase>bgase => symptoms were more likely to develop than disappear -> could be due to placebo/nocebo effect or other things including stress of cognitive display etc

Code
ggplot(cleaned_data, aes(x = tot, y = gender)) +
  geom_boxplot() +
  labs(x = "Symptom Change", y = "Gender", title = "Symptom Changes in Male vs Female")

Code
print("Male Summary")
[1] "Male Summary"
Code
summary(male_filtered$tot)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-6.0000  0.0000  0.0000  0.4681  1.5000  5.0000 
Code
IQR(male_filtered$tot)
[1] 1.5
Code
range(male_filtered$tot)[2] - range(male_filtered$tot)[1]
[1] 11
Code
print("Female Summary")
[1] "Female Summary"
Code
summary(female_filtered$tot)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-13.0000   0.0000   0.0000   0.5818   2.0000  10.0000 
Code
IQR(female_filtered$tot)
[1] 2
Code
range(female_filtered$tot)[2] - range(female_filtered$tot)[1]
[1] 23

Things to notice

  • Females have higher IQR than males

  • Females have MUCH higher range (max - min) due to their outliers

    All this concludes that females have much higher spread – why? Why are females more susceptible to reporting symptom change? relate to placebo? Females are more susceptible to manipulation/believing a lie/trusting etc?

Things to consider:

  • Why may this be the case taking into account female sample size vs male sample size

  • Does central limit theorem apply here? – does the fact that a larger sample size converges more to a true value work in this case meaning that females should have a smaller IQR theoretically? they don’t meaning what? Or is that with a larger sample size, you have a higher chance of having outliers? Or should those outliers cancel themselves out with a higher sample size?

  • First quartile for both genders equals the median (25% of both males and females have no symptoms)

We’re also using density histograms opposed to frequency histograms due to disparities in sample sizes of data for both genders

Code
nrow(male_filtered)
[1] 47
Code
nrow(female_filtered)
[1] 110

Bgase & Agase Analysis

Code
ggplot(cleaned_data, aes(x = baseline_gase, fill = gender)) +
  geom_histogram(aes(y = after_stat(density)), position = "dodge", bins = 25) +
  labs(x = "Baseline Symptom Total", y = "Density", title = "Basline Symptom Total")

Code
ggplot(cleaned_data, aes(x = agase_total, fill = gender)) +
  geom_histogram(aes(y = after_stat(density)), position = "dodge", bins = 25) +
  labs(x = "Active/Post-Treatment Symptom Total", y = "Density", title = "Active/Post-Treatment Symptom Total")

Code
ggplot(cleaned_data, aes(x = baseline_gase, fill = gender)) +
  geom_boxplot() + 
  labs(x = "Basline Symptoms Total", title = "Basline Symptom Total between Genders")

Code
ggplot(cleaned_data, aes(x = agase_total, fill = gender)) +
  geom_boxplot() +
  labs(x = "Active/Post-Treatment Symptoms Total", title = "Active/Post-Treatment Symptom Total between Genders")

Code
print("bgase_total stats")
[1] "bgase_total stats"
Code
mean(cleaned_data$baseline_gase)
[1] 11.7707
Code
print("agase_total stats")
[1] "agase_total stats"
Code
mean(cleaned_data$agase_total)
[1] 12.31847
Code
print("Male Stats")
[1] "Male Stats"
Code
mean(male_filtered$baseline_gase)
[1] 11.61702
Code
mean(male_filtered$agase_total)
[1] 12.08511
Code
print("Female Stats")
[1] "Female Stats"
Code
mean(female_filtered$baseline_gase)
[1] 11.83636
Code
mean(female_filtered$agase_total)
[1] 12.41818

Observations:

  • Baseline_gase spread is much more than agase_total spread – bulked up towards 10-15 area. Since there’s 10 symptoms with a minimum input value of 1 (therefore min total value = 10). A more condense spread and slight shift towards 15 from bgase to agase (agase_total mean > bgase_total mean) means that more symptoms are being reported after placebo is being taken

  • mean stats for all, male, female suggest that on average, participants are reporting 1-2 points above minimum symptom reporting total for bgase and agase totals but with a slight increased mean for agase compared to bgase

  • Female vs males bgase means are pretty similar (female>male tho still); males below total mean and females above

  • Female vs males agase becomes much more separated by almost half a point (female > male)

  • From boxplots:

    • females have much more outliers

    • agase men IQR is greater than females – interesting?

    • 1st quartile = median for females bgase (25% of data = 10 = minimum symptom reporting total)

Code
#percentage of males and females whose bgase_total was above minimum symptom reporting total (meaning they had symptoms)
nrow(filter(male_filtered, baseline_gase - 10 > 0))/nrow(male_filtered)
[1] 0.5531915
Code
nrow(filter(female_filtered, baseline_gase - 10 > 0))/nrow(female_filtered)
[1] 0.4818182
Code
#percentage of males and females whose agase_total was above minimum symptom reporting total (meaning they have symptoms)
nrow(filter(male_filtered, agase_total - 10 > 0))/nrow(male_filtered)
[1] 0.6382979
Code
nrow(filter(female_filtered, agase_total - 10 > 0))/nrow(female_filtered)
[1] 0.6545455
Code
#percentage of males and females who reported differences in symptoms after taking placebo/nocebo
nrow(filter(male_filtered, abs(tot) > 0))/nrow(male_filtered)
[1] 0.5957447
Code
nrow(filter(female_filtered, abs(tot) > 0))/nrow(female_filtered)
[1] 0.6
Code
#percentage of participants who reported changes in symptoms after taking placebo/nocebo
nrow(filter(cleaned_data, abs(tot) > 0))/nrow(cleaned_data)
[1] 0.5987261
Code
#percentage of males and females who reported an increase in symptoms after taking placebo/nocebo
nrow(filter(male_filtered, tot > 0))/nrow(male_filtered)
[1] 0.3829787
Code
nrow(filter(female_filtered, tot > 0))/nrow(female_filtered)
[1] 0.4
Code
#percentage of males and females who reported a decrease in symptoms after taking placebo/nocebo
nrow(filter(male_filtered, tot < 0))/nrow(male_filtered)
[1] 0.212766
Code
nrow(filter(female_filtered, tot < 0))/nrow(female_filtered)
[1] 0.2

Summed notes:

  • 60% of females and males reported differences in symptoms after taking placebo/nocebo – possible confounder could be the time taken between reports (they could’ve taken panadol for a headache after undergoing data collection and panadol only just hits before second symptom collection/agase results, etc)

    • 40% reporting more symptoms (≈67% of participants who reported symptom changes, reported more symptoms)

    • 20% reporting less symptoms (≈33% of participants who reported symptom changes, reported less symptoms)

  • 55% of males experienced symptoms beforehand which increased to 64% afterwards (9% increase). 48% of females experienced symptoms beforehand which increased to 65% afterwards (17% increase). This shows that the placebo or other confounders had a greater effect on females resulting in an increase in symptom reporting/severity (IMPORTANT)

When saying reporting more/less symptoms, I mean severity. However, it’s important to note that when participants report a “1”, it means not present.

Also important to note that when bgase_total, agase_total are greater than 10, the participant is experiencing symptoms

Group Analysis (Positive Social Modelling & Side-Effect Modelling)

Code
#overall grouping boxplot
ggplot(cleaned_data, aes(x = tot, y = group, colour = intervention_bin)) +
  geom_boxplot() + 
  labs(x = "Symptom Change", y = "Group", title = "Symptom Change vs Group")

Code
#addresses gender in groupings
ggplot(cleaned_data, aes(y = group, x = tot, colour = gender)) +
  geom_boxplot() + 
  labs(x = "Symptom Change", y = "Group", title = "Symptom Change vs Group per Gender", colour = "Gender")

Code
#addressing confounder in bgase stats (intervention w/ or w/o positive social modelling)
ggplot(cleaned_data, aes(x = group, y = baseline_gase, colour = intervention_bin)) +
  geom_boxplot() + 
  labs(x = "Group", y = "bgase_total", title = "Before Symptom Measures vs Group vs Positive Social Modelling", colour = "Positive Social Modelling Status")

Code
ggplot(cleaned_data, aes(x = intervention_bin, y = baseline_gase, colour = gender)) +
  geom_boxplot() +
  labs(x = "Positive Social Modelling Status", y = "bgase_total", title = "Before Symptom Measures vs Positive Social Modelling Status between Genders", colour = "Gender")

Code
#addressing impact on interventions between groups for after symptom measures between genders
ggplot(cleaned_data, aes(x = group, y = agase_total, colour = gender)) +
  geom_boxplot() + 
  labs(x = "Group", y = "agase_total", colour = "Gender", title = "After Symptom Measures in Groups per Gender")

Code
#addressing positive social modelling in symptom change data between genders
ggplot(cleaned_data, aes(y = intervention_bin, x = tot, fill = gender)) +
  geom_boxplot() +
  labs(x = "Symptom Change", y = "Positive Social Modelling Status", fill = "Gender", title = "Symptom Change between Genders addressing PSM Intervention")

Code
#addressing side effect social modelling in symptom change data between genders
ggplot(cleaned_data, aes(x = tot, y = SEM, fill = gender)) +
  geom_boxplot() +
  labs(x = "Symptom Change", y = "Side-Effect Modelling Status", fill = "Gender", title =  "Symptom Change between Genders addressing SEM Intervention")

Key

  1. INSM = intervention/positive-social modelling + no side effect modelling
  2. ISM = intervention/positive-social modelling + side effect modelling
  3. NH = natural history (note: they knew they weren’t taking anything that would effect them after bgase measures and before agase measures so makes sense that they wouldn’t experience much measures)
  4. NINSM = no intervention/positive-social modelling + no side effect modelling
  5. NISM = no intervention/positive-social modelling + side effect modelling

WT and DN are counterbalanced measures with the initial being the authors. E.g. if a participant saw WT in the video, they would see DN in the live social modelling. Therefore not important. Having WT or DN indicates side effect modelling whilst NA means no side effect modelling

Things to consider:

  • Female data tends to have a much higher range than male, particularly due to the ton of outliers from the female data (see graph #2 above specifically) – look into the ranges as a whole between genders to find trends?
Code
num_sum = function(df) {
   data.frame(
    mean = mean(df$tot),
    sd = sd(df$tot),
    min = min(df$tot),
    Q1 = quantile(df$tot, 0.25),
    median = median(df$tot),
    Q3 = quantile(df$tot, 0.75),
    max = max(df$tot),
    IQR = IQR(df$tot),
    n = nrow(df)
    )
}
#numerical summaries for graph #2
bind_rows(
num_sum(filter(male_filtered, group == "NISM")),
num_sum(filter(female_filtered, group == "NISM")),

num_sum(filter(male_filtered, group == "NINSM")),
num_sum(filter(female_filtered, group == "NINSM")),

num_sum(filter(male_filtered, group == "NH")),
num_sum(filter(female_filtered, group == "NH")),

num_sum(filter(male_filtered, group == "ISM")),
num_sum(filter(female_filtered, group == "ISM")),

num_sum(filter(male_filtered, group == "INSM")),
num_sum(filter(female_filtered, group == "INSM"))
)
               mean       sd min    Q1 median  Q3 max  IQR  n
25%...1   1.6153846 2.218801  -3  1.00    2.0 3.0   5 2.00 13
25%...2   1.7222222 3.642972  -5  0.00    0.5 2.0  10 2.00 18
25%...3   0.7500000 1.388730  -1  0.00    0.0 2.0   3 2.00  8
25%...4   1.4583333 2.340181  -1  0.00    1.0 2.0  10 2.00 24
25%...5   0.0000000 0.500000  -1  0.00    0.0 0.0   1 0.00  9
25%...6  -0.3043478 3.110609 -13  0.00    0.0 0.5   5 0.50 23
25%...7   0.5555556 1.424001  -2  0.00    0.0 1.0   3 1.00  9
25%...8  -0.4090909 2.196514  -4 -1.75    0.0 1.0   4 2.75 22
25%...9  -1.2500000 1.982062  -6 -1.00   -1.0 0.0   0 1.00  8
25%...10  0.6086957 1.671666  -2  0.00    0.0 2.0   4 2.00 23

General Notes and Ideas

  • Using animation or plotly or whatever to continuously change between bgase and agase between groups and/or genders

  • do we want to consider the “other” variable in the data which is as stated: Composite of non-primary symptoms (exploratory generalization outcomedifference-scored).

  • We want to relate this data findings to the idea that (as seen from the data imo) that females have a higher susceptibility to symptom change reportings then males

  • Something to consider is that: if males/females underrate the severity of their symptoms -> could possible use background research and articles to support/deny

  • Remember this is a psychological based experiment so symptom measures are purely subjective to the participant which is why we’re specifically exploring the difference psychologically between male and female in their symptom reportings which we can then further research with articles etc

Symptom Change Analysis

notes:

Symptom Change Analysis Findings 

David [IMPORTANT]: It is necessary to acknowledge that Symptom Change is commonly associated with the nocebo effect, so we must consider whether the effect disproportionately affects men or women. [cited source] affirms/contradicts the hypothesis of unequal effect (lowk we can cherrypick a study/collection of studies), so then we can move onto social factors 

An analysis of the difference between participants’ GASE symptoms before and after intervention revealed that most participants experienced little to no symptom change, with male participants showing less symptom change (mean ≈ 0.47) than female participants (mean ≈ 0.58). We attribute this overall increase in GASE scores to the presence of the nocebo effect (1) 

Looking at the standard deviation of the data, we can see that females have a greater spread (s.d ≈ 2.72) than males (s.d. = 1.87). A further examination of the box plot reveals that the IQR of GASE change was higher in females (IQR = 2) than in males (1.5).  

We believe that this difference in symptom reporting arises due to biological differences between the two. (2) According to a Study on Somatic Symptom Reporting in Women and Men, “Women report more intense, more numerous, and more frequent bodily symptoms than men” due to several factors. The first being sex differences in peripheral afferent pathways that moderate the detection of physical and chemical stimuli (3). We attribute the second reason for this difference to the process of socialization, which causes boys to be less expressive about pain or discomfort as a sign of masculinity (4) 

We recognize that the presence and absence of social modelling and intervention may be a confounder; however, inspection of symptom change on a per-group basis reveals that females have a greater symptom change spread in all groups and  

GASE = general assessment of side effects

finalisation

Symptom Changes between Females and Males

Code
 p = ggplot(cleaned_data, aes(x = tot, fill = gender)) +
  geom_histogram(aes(y = after_stat(density)), position = "dodge", bins = 25) +
  labs(y = "Density", x = "Symptom Change", title = "Symptom Changes in Male vs Female", fill = "Gender")
ggplotly(p)
Code
box1 = ggplot(cleaned_data, aes(x = gender, y = tot)) +
  geom_boxplot() +
  labs(x = "Gender", y = "Symptom Change", title = "Symptom Changes in Male vs Female")
ggplotly(box1)
Code
mean(male_filtered$tot)
[1] 0.4680851
Code
sd(male_filtered$tot)
[1] 1.874904
Code
mean(female_filtered$tot)
[1] 0.5818182
Code
sd(female_filtered$tot)
[1] 2.72394

‘Figure 1’ displays a symmetrical distribution about 0 with a slight left skew indicating a near neutral symptom change between both genders; participants overall experienced little to no symptom change. The difference between participants’ GASE symptoms before and after certain interventions between genders revealed male participants showed slightly less symptom change (mean ≈ 0.47) than female participants (mean ≈ 0.58). The overall increase in GASE scores in attributed to the presence of the nocebo effect (1). Female participant’s also exhibited a higher standard deviation in their scores (s.d.≈ 2.72) compared to males (s.d. ≈ 1.87). This increase in spread between genders is affirmed in ‘Figure 2’ where females have an increased IQR and overall range (IQR = 2, range = 23) than males (IQR = 1.75, range = 11).

These differences in symptom reporting arises due to biological differences between genders. According to a Study on Somatic Symptom Reporting in Women and Men, “Women report more intense, more numerous, and more frequent bodily symptoms than men” (2) due to several factors. The first being sex differences in peripheral afferent pathways that moderate the detection of physical and chemical stimuli (3). The second reason attributes to the differences to the process of socialisation between genders, which causes males to be less expressive about pain or discomfort as a sign of masculinity (4).

Code
ggplot(cleaned_data, aes(x = tot, y = intervention_bin, colour = gender)) +
  geom_boxplot() +
  facet_wrap(~ SEM) +
  labs(x = "Symptom Change", y = "Positive Social Modelling", colour = "Gender", title = "PSM & SEM Between Gender")

Code
a = male_filtered %>% filter(SEM == "No SEM", intervention_bin == "No Int")
IQR(a$tot)
[1] 0
Code
b = male_filtered %>% filter(SEM == "No SEM", intervention_bin == "Int")
IQR(b$tot)
[1] 1
Code
c = male_filtered %>% filter(SEM == "SEM", intervention_bin == "No Int")
IQR(c$tot)
[1] 2
Code
d = male_filtered %>% filter(SEM == "SEM", intervention_bin == "Int")
IQR(d$tot)
[1] 1
Code
x = c(sd(a$tot), sd(b$tot), sd(c$tot), sd(d$tot))
mean(x)
[1] 1.670513
Code
e = female_filtered %>% filter(SEM == "No SEM", intervention_bin == "No Int")
mean(e$tot)
[1] 0.5957447
Code
f = female_filtered %>% filter(SEM == "No SEM", intervention_bin == "Int")
mean(f$tot)
[1] 0.6086957
Code
g = female_filtered %>% filter(SEM == "SEM", intervention_bin == "No Int")
mean(g$tot)
[1] 1.722222
Code
h = female_filtered %>% filter(SEM == "SEM", intervention_bin == "Int")
mean(h$tot)
[1] -0.4090909
Code
y = c(sd(e$tot), sd(f$tot), sd(g$tot), sd(h$tot))
mean(y)
[1] 2.591892

Due to the experimental process, the participants were eventually split into four groups that addresses multiple confounders with the assignments of positive social modelling (PSM) and side-effect modelling (SEM). ‘Figure 3’ shows that per confounder-group, females have greater symptom change variability with average standard deviation between groups ≈ 2.59 whereas males ≈ 1.67, which is consistent with previous findings.

(1) = cosette’s study

(2) = https://pmc.ncbi.nlm.nih.gov/articles/PMC1495200/#sec7

(3) = https://scholar.google.com/scholar_lookup?journal=Pain%20Forum&title=Gender%20differences%20in%20the%20response%20to%20noxious%20stimuli.&author=RB%20Fillingim&author=W%20Maixner&volume=4&publication_year=1995&pages=209-21&https://scholar.google.com/scholar_lookup?journal=Pain%20Forum&title=Gender%20differences%20in%20the%20response%20to%20noxious%20stimuli.&author=RB%20Fillingim&author=W%20Maixner&volume=4&publication_year=1995&pages=209-21&

(4) =