require(tidyverse)
require(cowplot)
old = theme_set(theme_cowplot())
The goal of this analysis is to use qPCR to measure the gene induction time course after phosphate starvation in Saccharomyces cerevisiae in comparison with Candida glabrata. In particular, we would like to resolve a previous contradiction where oxidative stress response genes were found to be induced upon phosphate starvation in S. cerevisiae in one experiment but not in another. Here we repeat the time course experiment in S. cerevisiae and C. glabrata side by side to see if the induction of OSR genes upon phosphate starvation is species-specific.
Preparation: Cells were
grown to log phase in synthetic complete (SC) medium with replete
phosphate; Sample C1 was collected from this pre-stress
condition; Switch media: Log phase cultures were then
subjected to parallel media exchange via spin/filter procedure:
experimental cultures were transferred to phosphate-depleted SC medium
(-Pi), while control cultures were transferred to fresh
phosphate-replete SC medium to control for media switch effects. The
parallel phosphate-replete culture (+Pi) was then sampled and used as a
secondary control (C2). Following media exchange, a time course was
performed with samples collected at 30 minutes (E1 for -Pi condition)
and 60 minutes (E2 for -Pi condition); for the parallel +Pi culture, an
experimental sample was only taken at 30 minutes post-stress induction.
In a separate experiment for oxidative stress analysis, log phase cells
grown in SC medium were transferred via spin/filter to H2O2-treated
medium (1 mM for S. cerevisiae, and 10 mM for C.
glabrata). A positive control sample was collected immediately
post-transfer (C1 control), followed by experimental samples at 30
minutes (E1) and 60 minutes (E2) of H2O2 exposure. All samples underwent
total RNA isolation, cDNA synthesis, and RT-qPCR analysis.
Representative amplification curves show threshold determination for
calculating Ct values, with reactions performed in duplicate (2x).
The qPCR data file is a tab-delimited text file with the following columns: Well, Row, Col, Sample, Species, Task, Treatment, Timepoint, Replicate, Target, Cq, Amp Status
dat <- read_csv("../input/20251010-OSR-qPCR-Ct-raw-formatted.csv",
col_types = cols()) |>
mutate(Ct = na_if(Cq, "Undetermined") |> as.numeric())
Check to make sure the NTC are negative
dat %>% filter(Task %in% c("NTC", "NoRT")) |>
select(Well, Sample, Task, Target, Ct, `Amp Status`)
There was one NTC reaction for PHO84 that had extremely low Ct. Double check
dat %>%
filter(Task == "Unknown") %>%
mutate(label = paste(Species, Treatment, Timepoint, sep = "_")) %>%
ggplot(aes(x = label, Ct)) + geom_point(aes(color = Replicate), shape=5) +
facet_wrap( ~Target ) +
theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5, size = 10))
Looking at ACT1, we see that one sample, Cg_Pi_60m_b1, appears to have a problem (Ct value much higher than expected). We will examine this sample further
dat %>% filter(Sample == "Cg-Pi-60m-b1") %>%
select(Well, Sample, Task, Target, Ct, `Amp Status`)
This sample clearly failed. Will remove from further analyses
Also, we notice that ‘Cg-H2O2-30m-b2’ appears to be missing.
dat %>% filter(Sample == "Cg-H2O2-30m-b2") %>%
select(Well, Sample, Task, Target, Ct, `Amp Status`)
This sample failed as well. We will remove both failed samples from further analyses
filtered_dat <- dat %>% filter(!Sample %in% c("Cg-Pi-60m-b1", "Cg-H2O2-30m-b2"),
Task == "Unknown")
Check the experimental design and number of replicates per group after filtering
with(filtered_dat %>% mutate(Target = fct_recode(Target, CTT1 = "CTA1")),
table(Species, paste(Treatment, Timepoint, sep = "_"), Target))
, , Target = ACT1
Species CTRL_0m H2O2_30m H2O2_60m Pi_30m Pi_60m
Cg 3 3 6 6 3
Sc 3 6 6 6 6
, , Target = CTT1
Species CTRL_0m H2O2_30m H2O2_60m Pi_30m Pi_60m
Cg 3 3 6 6 3
Sc 3 6 6 6 6
, , Target = PHO84
Species CTRL_0m H2O2_30m H2O2_60m Pi_30m Pi_60m
Cg 3 3 6 6 3
Sc 3 6 6 6 6
, , Target = TRX2-p1
Species CTRL_0m H2O2_30m H2O2_60m Pi_30m Pi_60m
Cg 3 3 6 6 3
Sc 3 6 6 6 6
, , Target = TRX2-p2
Species CTRL_0m H2O2_30m H2O2_60m Pi_30m Pi_60m
Cg 0 3 6 6 3
Sc 0 6 6 6 6
- TRX2-p2 was not run on the reference sample.
- Cg_H2O2_30m only has one replicate after filtering.
- Cg_Pi_60m only has one replicate after filtering.
To calculate efficiency, use linear regression \[ n_t = D_i n_0 E^{C_{T,i}} \]
We don’t have standard curves in this experiment. Skip
Set the reference gene and reference condition
ref.target <- "ACT1"
ref.treat <- "CTRL"
dilute <- 100 # all samples diluted to 100 fold in this experiment
# Mean and sd
# ---
# all samples are diluted to the same 100 fold, hence no need to back calculate here
# data1$Ct1 <- data1$Ct - log2(data1$Dilution/dilute)
# ---
average_Ct <- filtered_dat %>%
group_by(Species, Treatment, Timepoint, Replicate, Target) %>%
summarize(Ct = Ct(Ct, na.rm=TRUE), sd = sd(Ct, na.rm=TRUE), .groups="drop")
Error in `summarize()`:
ℹ In argument: `Ct = Ct(Ct, na.rm = TRUE)`.
ℹ In group 1: `Species = "Cg"`, `Treatment = "CTRL"`, `Timepoint = "0m"`, `Replicate = "b1"`, `Target =
"ACT1"`.
Caused by error in `Ct()`:
! could not find function "Ct"
Backtrace:
1. ... %>% ...
3. dplyr:::summarise.grouped_df(., Ct = Ct(Ct, na.rm = TRUE), sd = sd(Ct, na.rm = TRUE), .groups = "drop")
4. dplyr:::summarise_cols(.data, dplyr_quosures(...), by, "summarise")
6. dplyr:::map(quosures, summarise_eval_one, mask = mask)
7. base::lapply(.x, .f, ...)
8. dplyr (local) FUN(X[[i]], ...)
9. mask$eval_all_summarise(quo)
10. dplyr (local) eval()
Next, we group the data by {Species, Treatment, Timepoint, and Replicate}, and calculate ddCt relative to the reference target and then the reference sample.
dCt calculation
ddCt calculation.
Note that only one control sample was run and will be used as the reference sample for both biological replicates; also, while two sets of primers were used for TRX2, only one of them, p1, was tested on the reference sample. p2 will be dropped as a result.