Resultaten

In dit RMarkdown bestand wordt er aan de hand van een script in R gewerkt met data die verkregen is op het lab. Met deze data willen we een antwoord krijgen op onderzoeksvraag: “Op welke manier kunnen watervlooien ingezet worden om het effect van hartmedicatie te onderzoeken?”

Om te beginnen moeten er verschillende packages gedownload en geïnstalleerd worden om de data te verwerken en de figuren op te stellen.

#install.packages("janitor")
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.4     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── 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
library(readxl)
library(dplyr)
library(ggplot2)
library(drc)
## Warning: package 'drc' was built under R version 4.4.3
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
## 
## 
## 'drc' has been loaded.
## 
## Please cite R and 'drc' if used for a publication,
## for references type 'citation()' and 'citation('drc')'.
## 
## 
## Attaching package: 'drc'
## 
## The following objects are masked from 'package:stats':
## 
##     gaussian, getInitial
library(janitor)
## Warning: package 'janitor' was built under R version 4.4.3
## 
## Attaching package: 'janitor'
## 
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test

Data klaarmaken voor gebruik

Na het voorbereiden van de packages wordt de data ingeladen om hiermee aan de slag te kunnen. Er zijn meerdere sheets in het Excel bestand, dus wordt sheet 5 geselecteerd om mee te werken. Hier staat namelijk de daadwerkelijke hartslag data.

hartslagen_daphnia <- read_xlsx("Hartslagen Daphnia data.xlsx", sheet = 5)

Bij het inladen van de data wordt er gekozen om te filteren voor alleen treatment 1 en 3 door treatment 2 weg te halen. Dit is gedaan omdat er eerst gewerkt werd met een andere bètablokker, nadolol als treatment 2. Echter deze gaf geen duidelijke en betrouwbare resultaten, dus is er gekozen om verder te gaan met metoprolol en Propranolol. Ook wordt er gefilterd op de concentraties die wij willen zien.

#Data 
## Experiment data inladen en laten zien
hartslagen_daphnia <- hartslagen_daphnia %>% filter(!Treatment == 2, !`concentratie_mg/ml` == 0,!`concentratie_mg/ml` == 1.2,  !Treatment == 0, na.rm = TRUE)
hartslagen_daphnia
## # A tibble: 200 × 5
##    watervlo Treatment `concentratie_mg/ml` hartslag hartslag_BPM
##       <dbl>     <dbl>                <dbl>    <dbl>        <dbl>
##  1       14         1                  1.5       48          288
##  2       14         1                  1.5       50          300
##  3       14         1                  1.5       48          288
##  4       14         1                  1.5       45          270
##  5       14         1                  1.5       50          300
##  6       16         1                  2         35          210
##  7       16         1                  2         35          210
##  8       16         1                  2         35          210
##  9       16         1                  2         33          198
## 10       16         1                  2         36          216
## # ℹ 190 more rows

Om te zorgen dat de titels die in Excel staan ook makkelijk te gebruiken zijn in R wordt de data opgeschoond.

# Opschonen dataset
clean_data <- hartslagen_daphnia |>
  janitor::clean_names()

# before :
hartslagen_daphnia
## # A tibble: 200 × 5
##    watervlo Treatment `concentratie_mg/ml` hartslag hartslag_BPM
##       <dbl>     <dbl>                <dbl>    <dbl>        <dbl>
##  1       14         1                  1.5       48          288
##  2       14         1                  1.5       50          300
##  3       14         1                  1.5       48          288
##  4       14         1                  1.5       45          270
##  5       14         1                  1.5       50          300
##  6       16         1                  2         35          210
##  7       16         1                  2         35          210
##  8       16         1                  2         35          210
##  9       16         1                  2         33          198
## 10       16         1                  2         36          216
## # ℹ 190 more rows
# after :
clean_data
## # A tibble: 200 × 5
##    watervlo treatment concentratie_mg_ml hartslag hartslag_bpm
##       <dbl>     <dbl>              <dbl>    <dbl>        <dbl>
##  1       14         1                1.5       48          288
##  2       14         1                1.5       50          300
##  3       14         1                1.5       48          288
##  4       14         1                1.5       45          270
##  5       14         1                1.5       50          300
##  6       16         1                2         35          210
##  7       16         1                2         35          210
##  8       16         1                2         35          210
##  9       16         1                2         33          198
## 10       16         1                2         36          216
## # ℹ 190 more rows

##Scaterplot Er is een scatterplot gemaakt om in één oogopslag te zien hoe de data er ongeveer verdeeld per concentratie uit ziet. Wat meteen opvalt is dat er bij de concentratie van 2 mg/ml metoprolol er een hele hoge hartslag te zien is na incubatie, wat een uitschieter aan kan tonen. Van de treatment is een factor gemaakt, zodat er op de x-as punten van 0 tot 5 mg/ml bèta-blokker te zien zijn. Indien er geen factor gebruikt werd, zouden de punten niet correct weergegeven worden en werd de data dus foutief weergegeven. Position = jitter wordt gebruikt om te zorgen dat de treatments elk een eigen kleur krijgen en apart van elkaar staan weergegeven i.p.v. in een kleurgradiënt.

p1 <- clean_data |>
  mutate(treatment_fct = as_factor(treatment)) |>
  ggplot(aes(
    x = concentratie_mg_ml,
    y = hartslag_bpm
  )) + 
  geom_point(aes(colour = treatment_fct), position = "jitter") +
  theme_bw() +
  labs(
    title = "Scatterplot bètablokker concentratie mg/ml",
    subtitle = "Treatmen_fct waarbij 1 = metoprolol, 3 = propranolol",
    x = "Concentratie (mg/ml)",
    y = "Getelde hartslagen (per 60 seconde)"
  )
p1

##Overige plots

p2 <- clean_data |>
  mutate(treatment_fct = as_factor(treatment)) |>
  ggplot(aes(
    x = log10(concentratie_mg_ml+0.00001),
    y = hartslag_bpm
  )) + 
  geom_point(aes(colour = treatment_fct), position = "jitter") +
  theme_bw() +
  labs(
    title = "Scatterplot bètablokker concentratie mg/ml",
    subtitle = "Treatmen_fct waarbij 1 = metoprolol, 3 = propranolol",
    x = "Log 10 Concentratie (mg/ml)",
    y = "Getelde hartslagen (per 60 seconde)"
  )
p2

##panel
cowplot::plot_grid(p1, p2, labels = c("A", "B"))

In de figuren hierboven is te zien dat treatment 1, metroprolol, een klein verlagend effect heeft op de hartslag. Bij de concentraties 3, 4 en 5 mg/ml verlagen de verschillende punten die elk een meting aangeven langzaam aan naar hartslagen van ongeveer 90 BPM naar hartslagen van ongeveer 70 BPM. Treatment 3, propranolol, is wat lastiger af te lezen, maar wanneer er goed gekeken wordt, is er te zien dat er bij de concentraties 4 en 5 mg/ml geen hartslagen te zien waren op een enkele waarschijnlijke outlier na.

##visualisatie van data in ggplot

p <- clean_data |>
    mutate(treatment_fct = as_factor(treatment)) |>
   filter(!treatment_fct == 2) |>
  ggplot(aes(
    x = concentratie_mg_ml,
    y = hartslag_bpm, color = treatment_fct
  )) +
  geom_point( size = 3) +
  geom_line(aes(group = interaction(treatment_fct, watervlo)),
            linetype = 'dashed', alpha = 0.5) +
  geom_smooth(method = "loess", se = TRUE) +
  scale_x_log10() +
labs(title = "Dose-Response van watervlo hartslag ",
       x = "Concentratie (mg/ml, log scale)",
       y = "Heartslag (bpm)") +
  theme_minimal() 
p
## `geom_smooth()` using formula = 'y ~ x'

In de figuur hierboven is goed te zien wat het effect was van de individuele treatments of de watervlooien. Er is wederom een grote uitschieter te zien bij de concentratie 2 mg/ml van metroprolol. Er zijn meerdere metingen te zien voor propranolol onder de 1 mg/ml dan voor de metoprolol. Dit omdat er bleek dat de originele range niet helemaal toepasselijk was voor propranolol. Ook is er in deze figuur te zien dat er vrijwel geen groot verschil zat in de metingen bij de propranolol wanneer er een lijn getrokken wordt door de gemiddeldes van de metingen heen.

##Voorbereiden voor het maken van de dose response curve

De dose-response modellen gebruiken een 4 parameter Log-Logistics functie (LL.4). Voor elke treatment, wordt de helling, laagste limit, hoogste limit en de ED50 berekend. De ED50 is belangrijk om te weten wat de dosis van het medicijn is waarbij de bèta-blokker effect heeft op 50% van de watervlooien.

data_metoprolol <- clean_data |>
  filter(treatment == "1")
model_stim1 <- drm(hartslag_bpm ~ concentratie_mg_ml, data = data_metoprolol,
                   fct = LL.4(names = c("Slope", "Lower",  "Upper", "ED50")))
summary(model_stim1)
## 
## Model fitted: Log-logistic (ED50 as parameter) (4 parms)
## 
## Parameter estimates:
## 
##                   Estimate Std. Error t-value   p-value    
## Slope:(Intercept)  37.0975   259.6558  0.1429   0.88677    
## Lower:(Intercept)  75.3953    10.3660  7.2733 2.673e-10 ***
## Upper:(Intercept) 154.6282     9.6012 16.1050 < 2.2e-16 ***
## ED50:(Intercept)    2.7594     1.6435  1.6790   0.09726 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error:
## 
##  56.8014 (76 degrees of freedom)
data_propranolol <- clean_data |>
  filter(treatment == "3")
model_stim2 <- drm(hartslag_bpm ~ concentratie_mg_ml, data = data_propranolol,
                   fct = LL.4(names = c("Slope", "Lower","Upper","ED50")))
summary(model_stim2)
## Warning in sqrt(diag(varMat)): NaNs produced
## 
## Model fitted: Log-logistic (ED50 as parameter) (4 parms)
## 
## Parameter estimates:
## 
##                    Estimate Std. Error t-value p-value
## Slope:(Intercept)   0.30309        NaN     NaN     NaN
## Lower:(Intercept) -25.51751        NaN     NaN     NaN
## Upper:(Intercept)  77.98777        NaN     NaN     NaN
## ED50:(Intercept)    0.94603        NaN     NaN     NaN
## 
## Residual standard error:
## 
##  28.53817 (116 degrees of freedom)

In de bovenstaande code gaat er bij de propranolol iets niet goed. Er worden NA waarden berekend voor vrijwel alles. Helaas weet we op het moment van verwerken niet wat deze NA waarden inhouden. Bij de metroprolol is te zien dat er een ED50 waarde van 2,6 mg/ml metoprolol wordt berekend om een effect te zien bij 50% van onze Daphnia.

model_stim1 |>
  broom :: tidy() |>
  dplyr::select(term, estimate) |>
  filter(term == "ED50") -> ED50_stim1

model_stim2 |>
  broom::tidy() |>
  dplyr::select(term, estimate) |>
  filter(term == "ED50") -> ED50_stim2
## Warning in sqrt(diag(varMat)): NaNs produced
plot(model_stim1,
     type = "all",
     main = "Metoprolol",
     xlab = "Concentratie (mg/ml)",
     ylab = "Hartslag (BPM)")

plot(model_stim2,
       type = "all",
     main = "Propranolol",
     xlab = "Concentratie (mg/ml)",
     ylab = "Hartslag (BPM)")

In de dose-response curve van de metoprolol is er daadwerkelijk ook een curve te zien. Er is ook een afname van hartslagen te zien na de concentratie van ongeveer 2,6 mg/ml, wat dus ook overeen komt met de eerder benoemde berekende ED50. In de dose-response curve van de propranolol is er onduidelijk lijn te zien waar verder ook niks over gezegd kan worden.