做完转录组分析之后,一般都要求做qRT-PCR来验证二代测序得到的转录本表达是否可靠。荧光定量PCR是一种相对表达定量的方法,他的计算方法有很多,常用的相对定量数据分析方法有双标曲线法,ΔCt法,2-ΔΔCt法(Livak法): 数据分析:RT-qPCR计算及其可视化 - 图1 更多知识分享请到 https://zouhua.top/

qRT-PCR介绍及计算公式

该部分引用自下方参考链接1

qRT-PCR原理

以基因的cDNA为模板进行PCR扩增,在PCR扩增过程中,通过收集荧光信号,对PCR进程进行实时检测。由于在PCR扩增的指数时期,模板的Ct值和该模板的起始拷贝数存在线性关系,所以可以定量。

Ct值

Ct值的含义是:每个反应管内的荧光信号达到设定的域值时所经历的循环数 (cycle)。 qRT-PCR在扩增的时候都会有平台期,在平台期之前,PCR 扩增就是简单的指数增长,也就是 1 变 2,2 变 4,4 变 8 …扩增。数学形式就是 2 的 ct 次方,到了平台期所有基因扩增的数目是一致的,而唯一有区别的则是 ct 值的不同。所以不难推断出 ct 值越小,反应扩增到达平台期所需循环数越少,目的基因起始含量越高。这里可以得到公式:数据分析:RT-qPCR计算及其可视化 - 图2

计算 -ΔΔCt:内参基因分为对照组和处理组内参基因

  1. 先计算对照组和处理组的内参基因Ct的均值: $$Mean_{内参基因}=mean(对照组或处理组内参基因)$$
  2. 计算对照组待检测目的基因减去对照组内参基因的平均Ct值:$$ΔCt{对照组目的基因i} = Ct{对照组目的基因i} - Ct_{对照组内参基因的平均值}$$
  3. 计算处理组待检测目的基因减去处理组内参基因的平均Ct值:$$ΔCt{处理组目的基因i} = Ct{处理组目的基因i} - Ct_{处理组内参基因的平均值}$$
  4. 计算基于对照组的-ΔΔCt,处理组待检测目的基因的ΔCt减去对照组待检测基因的ΔCt的平均值:$$-ΔΔCt{处理组目的基因i} = ΔCt{处理组目的基因i} - ΔCt_{对照组目的基因i的平均值}$$
  5. 相对表达量计算,也就是相对于对照组: 2^-ΔΔct: $$2^{-(-ΔΔCt)}$$
  6. 条形图或相关性点图可视化结果

R代码

加载R包

  1. knitr::opts_chunk$set(warning = F, message = F)
  2. library(dplyr)
  3. library(tibble)
  4. library(ggplot2)
  5. library(xlsx)
  6. library(Rmisc)

R函数

  1. get_qPCR <- function(dataset=dat,
  2. ref_gene="GAPDH",
  3. control_group="6H NC",
  4. grp=c("6H M1")){
  5. # dataset=dat # 初始数据
  6. # ref_gene="GAPDH" # 内参基因名字
  7. # control_group="6H NC" # 对照组
  8. # grp=c("6H M1") # 实验组排序
  9. if(!any(is.element(colnames(dataset), c("Sample_Name", "Target_Name", "CT")))){
  10. stop("Check the sheet's colnames")
  11. }
  12. sampleid <- c("Sample_Name", "Target_Name", "CT")
  13. dat <- dataset %>% select(sampleid)
  14. # step1: 计算对照组和处理组的内参基因平均值
  15. dat_ref_gene <- dat %>% filter(Target_Name == ref_gene)
  16. ref_gene_mean <- dat_ref_gene %>% group_by(Sample_Name) %>%
  17. dplyr::summarise(CT_ref_mean = mean(CT))
  18. # step2: 计算对照组和处理组待检测目的基因减去对应分组的内参基因的平均Ct值
  19. dat_gene <- dat %>% filter(Target_Name != ref_gene)
  20. dat_gene_merge <- dat_gene %>% inner_join(ref_gene_mean, by = "Sample_Name")
  21. dat_gene_merge$CT_delta <- with(dat_gene_merge, CT - CT_ref_mean)
  22. dat_control <- dat_gene_merge %>% filter(Sample_Name == control_group) %>%
  23. group_by(Sample_Name, Target_Name) %>%
  24. dplyr::summarise(Delta_CT_control_mean=mean(CT_delta)) %>%
  25. dplyr::rename(Sample_Name_control=Sample_Name)
  26. dat_treat <- dat_gene_merge %>% filter(Sample_Name != control_group) %>%
  27. # group_by(Sample_Name, Target_Name) %>%
  28. # dplyr::summarise(Delta_CT_treat_mean=mean(CT_delta)) %>%
  29. dplyr::rename(Sample_Name_treat=Sample_Name)
  30. # step3: 计算对照组检测基因的平均Δ值
  31. dat_double_delta <- inner_join(dat_treat, dat_control,
  32. by = "Target_Name")
  33. dat_double_delta$CT_delta_delta <- with(dat_double_delta, CT_delta - Delta_CT_control_mean)
  34. # step4: 基于对照组检测基因的平均Δ值,计算实验组的2-ΔΔCt值
  35. dat_double_delta$qPCR <- 2^-(dat_double_delta$CT_delta_delta)
  36. # step5: 条形图或相关性散点图可视化
  37. dat_plot <- dat_double_delta %>%
  38. dplyr::rename(Sample_Name=Sample_Name_treat) %>%
  39. dplyr::select(Sample_Name, Target_Name, qPCR)
  40. dat_plot_bar <- Rmisc::summarySE(dat_plot, measurevar = "qPCR",
  41. groupvars = c("Sample_Name", "Target_Name")) %>%
  42. mutate(Sample_Name=factor(Sample_Name, levels = grp),
  43. Target_Name=factor(Target_Name)) %>%
  44. group_by(Sample_Name, Target_Name) %>%
  45. mutate(ylimit=(qPCR+sd)) %>%
  46. ungroup()
  47. dat_plot_bar_ymax <- dat_plot_bar %>%
  48. group_by(Target_Name) %>%
  49. summarise_at(vars(ylimit), max)
  50. # dat_plot_range <- dat_plot %>% group_by(Sample_Name, Target_Name) %>%
  51. # summarise(ymin=min(qPCR), ymax=max(qPCR))
  52. # setting y axis scale
  53. y_group <- c()
  54. y_scale <- c()
  55. for(i in 1:nrow(dat_plot_bar_ymax)){
  56. y_group <- c(y_group, rep(as.character(dat_plot_bar_ymax$Target_Name[i]), 2))
  57. y_scale <- c(y_scale, c(0, ceiling(dat_plot_bar_ymax$ylimit[i])))
  58. }
  59. blank_data <- data.frame(Target_Name = y_group,
  60. Sample_Name = 1,
  61. qPCR = y_scale)
  62. # step6: visualization
  63. pl <- ggplot(dat_plot_bar, aes(x=Sample_Name, weight=qPCR))+
  64. geom_hline(aes(yintercept = qPCR), color = "gray")+
  65. geom_bar(color = "black", width = .4, position = "dodge")+
  66. geom_errorbar(aes(ymin = qPCR, ymax = qPCR + se),
  67. width = 0.25, size = 0.5, position = position_dodge(0.7))+
  68. labs(x="", y=expression(paste(log[2], " fold change in expression")))+
  69. geom_blank(data = blank_data, aes(x = Sample_Name, y = qPCR))+
  70. expand_limits(y = 0)+
  71. scale_y_continuous(expand = c(0, 0))+
  72. facet_wrap(. ~ Target_Name, scales = "free")+
  73. theme_bw()+
  74. theme(axis.title = element_text(face = "bold", color = "black", size = 14),
  75. axis.text = element_text(color = "black", size = 10),
  76. axis.text.x = element_text(angle = 60, hjust = 1, face = "bold"),
  77. text = element_text(size = 10, color = "black", family="serif"),
  78. panel.grid = element_blank(),
  79. legend.position = "right",
  80. legend.key.height = unit(0.6, "cm"),
  81. legend.text = element_text(face = "bold", color = "black", size = 10),
  82. strip.text = element_text(face = "bold", size = 14))
  83. res <- list(dat=dat_double_delta, plot=pl)
  84. return(res)
  85. }

读取数据

单个样本三个技术重复,检验不同的目的基因扩增效率

  1. dat <- read.xlsx("qPCR.xlsx", sheetIndex = 1)
  2. head(dat)

数据分析:RT-qPCR计算及其可视化 - 图3

计算结果

  1. qPCR_res <- get_qPCR(dataset=dat,
  2. ref_gene="GAPDH",
  3. control_group="6H NC",
  4. grp=c("6H M1"))
  5. DT::datatable(qPCR_res$dat)

数据分析:RT-qPCR计算及其可视化 - 图4

可视化结果

  1. qPCR_res$plot

数据分析:RT-qPCR计算及其可视化 - 图5

结果: IL-1B 和INOS基因相比NC组而言,其含量越多

同一基因多分组结果图

  1. get_qPCR <- function(dataset=dat,
  2. ref_gene="Gadph",
  3. control_group="2d_Control",
  4. grp=c("2d_100uM")){
  5. # dataset=dat # 初始数据
  6. # ref_gene="Gadph" # 内参基因名字
  7. # control_group="2d_Control" # 对照组
  8. # grp=c("2d_100uM") # 实验组排序
  9. if(!any(is.element(colnames(dataset), c("Sample_Name", "Target_Name", "CT")))){
  10. stop("Check the sheet's colnames")
  11. }
  12. sampleid <- c("Sample_Name", "Target_Name", "CT")
  13. dat <- dataset %>% select(sampleid)
  14. # step1: 计算对照组和处理组的内参基因平均值
  15. dat_ref_gene <- dat %>% filter(Target_Name == ref_gene)
  16. ref_gene_mean <- dat_ref_gene %>% group_by(Sample_Name) %>%
  17. dplyr::summarise(CT_ref_mean = mean(CT))
  18. # step2: 计算对照组和处理组待检测目的基因减去对应分组的内参基因的平均Ct值
  19. dat_gene <- dat %>% filter(Target_Name != ref_gene)
  20. dat_gene_merge <- dat_gene %>% inner_join(ref_gene_mean, by = "Sample_Name")
  21. dat_gene_merge$CT_delta <- with(dat_gene_merge, CT - CT_ref_mean)
  22. dat_control <- dat_gene_merge %>% filter(Sample_Name == control_group) %>%
  23. group_by(Sample_Name, Target_Name) %>%
  24. dplyr::summarise(Delta_CT_control_mean=mean(CT_delta)) %>%
  25. dplyr::rename(Sample_Name_control=Sample_Name)
  26. dat_treat <- dat_gene_merge %>% filter(Sample_Name != control_group) %>%
  27. # group_by(Sample_Name, Target_Name) %>%
  28. # dplyr::summarise(Delta_CT_treat_mean=mean(CT_delta)) %>%
  29. dplyr::rename(Sample_Name_treat=Sample_Name)
  30. # step3: 计算对照组检测基因的平均Δ值
  31. dat_double_delta <- inner_join(dat_treat, dat_control,
  32. by = "Target_Name")
  33. dat_double_delta$CT_delta_delta <- with(dat_double_delta, CT_delta - Delta_CT_control_mean)
  34. # step4: 基于对照组检测基因的平均Δ值,计算实验组的2-ΔΔCt值
  35. dat_double_delta$qPCR <- 2^-(dat_double_delta$CT_delta_delta)
  36. # step5: 条形图或相关性散点图可视化
  37. dat_plot <- dat_double_delta %>%
  38. dplyr::rename(Sample_Name=Sample_Name_treat) %>%
  39. dplyr::select(Sample_Name, Target_Name, qPCR)
  40. dat_plot_bar <- Rmisc::summarySE(dat_plot, measurevar = "qPCR",
  41. groupvars = c("Sample_Name", "Target_Name")) %>%
  42. mutate(Sample_Name=factor(Sample_Name, levels = grp))
  43. # step6: visualization
  44. pl <- ggplot(dat_plot_bar, aes(x=Sample_Name, weight=qPCR))+
  45. geom_hline(yintercept = seq(0, round(max(dat_plot_bar$qPCR), 1), 0.2), color = "gray")+
  46. geom_bar(color = "black", width = .4, position = "dodge")+
  47. geom_errorbar(aes(ymin = qPCR, ymax = qPCR + se),
  48. width = 0.25, size = 0.5, position = position_dodge(0.7))+
  49. labs(x="", y=expression(paste(log[2], " fold change in expression")))+
  50. scale_y_continuous(breaks = seq(0, round(max(dat_plot_bar$qPCR), 1), 0.2),
  51. expand = c(0, 0),
  52. limits = c(0, round(max(dat_plot_bar$qPCR), 1)+round(max(dat_plot_bar$sd), 1)))+
  53. facet_wrap(. ~ Target_Name, scales = "free")+
  54. theme_bw()+
  55. theme(axis.title = element_text(face = "bold", color = "black", size = 14),
  56. axis.text = element_text(color = "black", size = 10),
  57. axis.text.x = element_text(angle = 60, hjust = 1, face = "bold"),
  58. text = element_text(size = 10, color = "black", family="serif"),
  59. panel.grid = element_blank(),
  60. legend.position = "right",
  61. legend.key.height = unit(0.6, "cm"),
  62. legend.text = element_text(face = "bold", color = "black", size = 10),
  63. strip.text = element_text(face = "bold", size = 14))
  64. res <- list(dat=dat_double_delta, plot=pl)
  65. return(res)
  66. }
  67. dat <- read.xlsx("qPCR.xlsx", sheetName = "6d")
  68. # 6 days
  69. qPCR_res <- get_qPCR(dataset=dat,
  70. ref_gene="Gapdh",
  71. control_group="6d_control",
  72. grp=c("6d_100", "6d_300", "6d_1000"))
  73. # 计算结果
  74. DT::datatable(qPCR_res$dat)
  75. # 可视化结果
  76. qPCR_res$plot

数据分析:RT-qPCR计算及其可视化 - 图6

参考

  1. qRT-PCR相对定量计算详解
  2. geom_lines in different facet

参考文章如引起任何侵权问题,可以与我联系,谢谢。