17 Limma
17.1 Principle
Limma (Linear Model for Microarray Data) (G. Smyth et al., 2023) เป็นหนึ่งใน bioconductor package
ที่นิยมใช้อย่างแพร่หลายในการศึกษา ความแตกต่างของการแสดงออกของยีนระหว่างกลุ่มสองกลุ่ม (Differential gene expression; DGE) ในงานทดลอง Microarray
หลักการสำคัญของ limma คือการใช้สมการถดถอยเชิงเส้นในการหา DGE โดยมีสมมติฐานเบื้องต้นว่าค่าความเข้มพื้นหลังที่อ่านได้จาก Probe ของ Microarray นั้นมีการกระจายตัวแบบ Normal distribution ซึ่งหลักการนี้สามารถนำไปปรับใช้ในการหา Differential expression ในงานประเภทอื่นๆ ได้ด้วย เช่น RNA-seq, Proteomics
\(H_{0}\): ไม่มีความแตกต่างกันในการแสดงออกของยีน
\(H_{a}\): มีความแตกต่างกันในการแสดงออกของยีน
จากกราฟ เส้นประคือเส้นของ \(H_{0}\) หมายถึงการแสดงออกของยีนทั้งหมดสามารถหาได้โดยใช้ค่าเฉลี่ยโดยรวมของทั้งสองกลุ่ม \(\text{Intensity} = \theta_{0} + \epsilon\) และ เส้นทึบคือเส้นของ \(H_{a}\) หมายคือเส้นสมการถดถอยที่ลากผ่านค่าเฉลี่ยของแต่ละกลุ่ม \(\text{Intensity }= \theta_{0} + \theta_{1}*\text{Group} + \epsilon\) ซึ่งทั้งหมดนี้ ก็คือเส้นสมการถดถอยเชิงเส้นตามปกติโดยทั่วไปนั่นเอง โดย limma ซึ่งความแตกต่างตามสมมติฐานนั้น จะถูกทดสอบ โดย \(t\)-test (\(F\)-test ถ้ามากกว่าสองกลุ่ม)
คำถามคือ วิธีการของ limma แตกต่างอย่างไรกับการสร้างสมการถดถอยโดยทั่วไป? เนื่องจากงานประเภท Bioinformatics นั้นมักมีค่าใช้จ่ายในแต่ละการทดลองสูง จำนวนตัวอย่างที่นำมาใช้ในการทดลองนั้นมีไม่มากนัก เช่น 3-4 ตัวอย่างต่อกลุ่ม
\[ t = \frac{\theta_{1}-0}{SE} = \frac{\theta_{1}}{S/\sqrt{n}} \]
ซึ่งเมื่อพิจารณาจากสูตรแล้ว จะเห็นว่าจำนวนตัวอย่างที่ต่ำ ส่งผลให้ \(SE\) สูง มีค่า \(t\) ที่แกว่ง (ตาม \(S\)) และมี Power ที่ต่ำด้วย เนื่องจากมีกลุ่มตัวอย่างน้อย
ผู้นิพนธ์ limma นั้นได้แก้ปัญหานี้โดยใช้หลักการสถิติแบบ Empirical Bayes ชื่อว่า Moderated \(t\)-test โดยหลักการคือ เนื่องจากหลักการของการอ่านข้อมูลใน Microarray ในแต่ละยีนนั้นเป็นไปโดยพร้อมกัน อัตราส่วนความแปรปรวนของยีนแต่ละตัวที่อ่านค่าได้นั้นจะเท่าๆ กันตลอดทั้ง Array ดังนั้นจึงสามารถยืมข้อมูลของความแปรปรวนมาจากทุกยีนทั้งหมด มาสร้างเป็น ความน่าจะเป็นก่อนหน้า (Prior probability) เพื่อนำมาถ่วงน้ำหนักความเป็นไปได้กับยีนแต่ละตัว เกิดเป็นความน่าจะเป็นภายหลัง (Posterior probability)
cx_nc <- GSE63514 |>
as.data.frame() |>
dplyr::select(contains(c("Normal", "Cancer")))
cx_var <- apply(cx_nc, 1, var)
ggplot(data = NULL, aes(x = cx_var)) +
geom_density(fill = "skyblue") +
scale_x_continuous(breaks = seq(0,3,0.25), limits = c(0,3)) +
annotate("text", x = mean(cx_var)+0.35, y = 4, label= "Mean variance") +
labs(x = "Variance") +
geom_vline(xintercept = mean(cx_var), linetype = "dashed") +
theme_bw()
ค่า Mean variance นี้จะถูกนำไปถ่วงน้ำหนักความแปรปรวนเดิมของแต่ละยีน และจะถูกนำไปใช้ในการคำนวณใหม่ เรียกว่า Moderated \(t\) (G. K. Smyth, 2004)
\[ \tilde{t_{gj}} = \sqrt\frac{d_{0} + d_{g}}{d_{g}}\times\frac{\hat{\beta_{gj}}}{\sqrt{s^{2}_{*,g}/n_{gj}}} \]
\[ s^{2}_{*,g} = s^{2}_{g}+(\frac{d_{0}}{d_{g}})s_{0}^{2} \]
สังเกตว่า ค่า \(\tilde{t}\) นั้นจะถูก Moderated ให้เข้าสู่ \(d_{0}\) (Prior degree of freedom) และ \(s_{0}\) (Prior variance) ส่งผลให้
ถ้า \(s_{g}\) > \(s_{0}\): \(s_{*,g}\) จะเพิ่มขึ้นจาก \(s_{g}\) เล็กน้อย ทำให้ \(\tilde{t}\) ลดลงเล็กน้อย เมื่อเทียบกับ \(\tilde{t}\) ที่เพิ่มขึ้นจาก \(\sqrt{\frac{d_{0}+d_{g}}{d_{g}}}\)
ถ้า \(s_{g}\) < \(s_{0}\): \(s_{*,g}\) จะเพิ่มขึ้นจาก \(s_{g}\) เป็นอย่างมาก ทำให้ \(\tilde{t}\) ลดลงมาก เมื่อเทียบกับ \(\tilde{t}\) ที่เพิ่มขึ้นจาก \(\sqrt{\frac{d_{0}+d_{g}}{d_{g}}}\)
ถ้า \(s_{g}\) = \(s_{0}\): \(s_{*,g}\) การลดลงของ \(\tilde{t}\) จะหักล้างกับการเพิ่มขึ้นของ \(\tilde{t}\) จาก \(\sqrt{\frac{d_{0}+d_{g}}{d_{g}}}\) พอดี
ทั้งหมดนี้จะส่งผลให้ มี Moderate effect ของการคำนวณค่า \(\tilde{t}\) และมี Degree of freedom ที่เพิ่มขึ้นส่งผลให้ Power สูงขึ้น (เพราะการกระจายตัวแคบลง)
17.2 Example
ต่อจากนี้จะยกตัวอย่างการคำนวณ DGE ระหว่างกลุ่มโดยใช้ limma ต่อจาก GSE63514 ซึ่งครั้งนี้จะเทียบทุกกลุ่ม และเทียบทุกยีน
ก่อนอื่นจะต้องสร้างสมการเชิงเส้นของกลุ่มแต่ละกลุ่มขึ้นมาก่อน
pData <- GSE63514_meta |>
select(title) |>
mutate(group = gsub("-\\d+", "", title))
unique(pData$group)
## [1] "Normal" "CIN1" "CIN2" "CIN3" "Cancer"
cx_mod <- model.matrix(~ 0 + group, data = pData)
as.data.frame(cx_mod) # Display as dataframe
แมทริกซ์ที่เห็นนี้ ข้อมูลของ Sample แต่ละคน โดยแต่ละคอลัมน์จะเป็นตัวแทนของกลุ่มของ Sample นั้น เช่น คนที่ 1 จะมีตัวเลข [0 0 0 0 1]
บ่งบอกว่าเป็นชิ้นเนื้อประเภท Cancer
และคนสุดท้ายเป็น [1 0 0 0 0]
บ่งบอกว่าชิ้นเนื้อประเภท Normal
ต่อจากนั้นเราจะสร้าง contrast matrix ขึ้นมาเพื่อนำไปใช้อ้างอิงในการเทียบ DEG
library(limma)
contrasts <- apply(combn(colnames(cx_mod),2)[2:1,], 2, paste, collapse = "-")
contrasts
## [1] "groupCIN1-groupCancer" "groupCIN2-groupCancer" "groupCIN3-groupCancer"
## [4] "groupNormal-groupCancer" "groupCIN2-groupCIN1" "groupCIN3-groupCIN1"
## [7] "groupNormal-groupCIN1" "groupCIN3-groupCIN2" "groupNormal-groupCIN2"
## [10] "groupNormal-groupCIN3"
contrasts.matrix <- makeContrasts(contrasts = contrasts, levels = colnames(cx_mod))
contrasts.matrix
## Contrasts
## Levels groupCIN1-groupCancer groupCIN2-groupCancer groupCIN3-groupCancer groupNormal-groupCancer
## groupCancer -1 -1 -1 -1
## groupCIN1 1 0 0 0
## groupCIN2 0 1 0 0
## groupCIN3 0 0 1 0
## groupNormal 0 0 0 1
## Contrasts
## Levels groupCIN2-groupCIN1 groupCIN3-groupCIN1 groupNormal-groupCIN1 groupCIN3-groupCIN2
## groupCancer 0 0 0 0
## groupCIN1 -1 -1 -1 0
## groupCIN2 1 0 0 -1
## groupCIN3 0 1 0 1
## groupNormal 0 0 1 0
## Contrasts
## Levels groupNormal-groupCIN2 groupNormal-groupCIN3
## groupCancer 0 0
## groupCIN1 0 0
## groupCIN2 -1 0
## groupCIN3 0 -1
## groupNormal 1 1
สังเกตว่าแต่ละคอลัมน์ผลรวมจะเท่ากับ 0 เนื่องจาก \(H_{0}\) ว่าไม่มีความแตกต่างกันในการแสดงออกของยีน (= 0) นั่นเอง
เมื่อได้ design matrix ต่อไปคือการ fit linear regression ตาม model โดยข้อมูลจะต้องอยู่ในรูปตัวเลขทั้งหมด ดังนั้นจะต้องปรับแต่ง ข้อมูล expression เริ่มต้นเล็กน้อย
GSE63514_fixed <- GSE63514 |>
column_to_rownames("prob")
ต่อจากนั้นจะ fit model ด้วย lmFit()
และเทียบแต่ละกลุ่มด้วย contrasts.fit()
cx_fit <- lmFit(GSE63514_fixed, design = cx_mod)
cx_fit_contrasts <- contrasts.fit(cx_fit, contrasts.matrix)
สุดท้ายเราจะทำการคำนวณ Moderated t-test โดยใช้ eBayes()
cx_fit_contrasts_eB <- eBayes(cx_fit_contrasts)
สุดท้ายคือการแสดงผล DGE จากการคำนวณทั้งหมดโดยใช้ topTable()
ซึ่งจะแสดง Moderated \(F\)-test (ANOVA) และ \(p\)-value, Adjusted \(p\)-value
topTable(cx_fit_contrasts_eB, n = 100) # First 100 genes
และสามารถเรียกดู \(t\)-test แต่ละกลุ่มได้โดยการระบุ coef
topTable(cx_fit_contrasts_eB, coef = 1, n = 100) # เรียงตาม contrasts.matrix
โดย logFC
คือ Log2 fold-change ของ Gene expression แต่ละตัว
map(1:length(colnames(contrasts.matrix)),
~topTable(cx_fit_contrasts_eB, coef = .x)) |>
set_names(colnames(contrasts.matrix))
## $`groupCIN1-groupCancer`
## logFC AveExpr t P.Value adj.P.Val B
## 206025_s_at -1.2599869 6.600127 -7.954562 8.906110e-13 4.869415e-08 18.36296
## 222835_at 2.7037467 11.390512 7.656871 4.369597e-12 9.910994e-08 16.87732
## 232855_at 1.9511837 7.464893 7.581694 6.508984e-12 9.910994e-08 16.50502
## 220090_at 5.1219007 11.675811 7.561290 7.250842e-12 9.910994e-08 16.40418
## 205185_at 3.6701214 12.344023 7.312213 2.685207e-11 2.682614e-07 15.18098
## 235651_at 2.5105300 11.627430 7.294601 2.943884e-11 2.682614e-07 15.09504
## 203857_s_at -1.3379967 8.865472 -7.135465 6.732460e-11 5.258532e-07 14.32218
## 226506_at 2.2236684 10.612391 6.929967 1.938536e-10 1.324868e-06 13.33417
## 207821_s_at -0.8531452 7.215208 -6.723744 5.531008e-10 3.360087e-06 12.35491
## 40016_g_at 1.6956215 11.063432 6.637076 8.558517e-10 4.077549e-06 11.94725
##
## $`groupCIN2-groupCancer`
## logFC AveExpr t P.Value adj.P.Val B
## 206025_s_at -1.380196 6.600127 -10.011010 1.030733e-17 5.635535e-13 29.24779
## 210495_x_at -2.715234 10.074149 -8.851861 6.668495e-15 1.617849e-10 23.13848
## 216442_x_at -2.764813 9.747865 -8.800039 8.877086e-15 1.617849e-10 22.86809
## 205464_at 2.458379 9.030410 8.665389 1.863583e-14 2.435352e-10 22.16703
## 218468_s_at -2.659120 5.349137 -8.625147 2.324822e-14 2.435352e-10 21.95795
## 219597_s_at 1.847612 10.636695 8.599759 2.672540e-14 2.435352e-10 21.82616
## 211719_x_at -2.978875 9.677495 -8.468114 5.497177e-14 3.537199e-10 21.14420
## 227140_at -3.349588 6.795510 -8.460792 5.721706e-14 3.537199e-10 21.10635
## 212464_s_at -2.941674 9.149103 -8.457596 5.822549e-14 3.537199e-10 21.08983
## 220090_at 4.972371 11.675811 8.433644 6.636766e-14 3.628652e-10 20.96605
##
## $`groupCIN3-groupCancer`
## logFC AveExpr t P.Value adj.P.Val B
## 206025_s_at -1.3149204 6.600127 -11.027724 3.311442e-20 1.810531e-15 34.44112
## 218468_s_at -2.5804213 5.349137 -9.677614 6.709207e-17 1.834129e-12 27.33557
## 227566_at -1.2024603 6.615340 -8.972807 3.415686e-15 5.539439e-11 23.65417
## 206026_s_at -1.3312089 6.219060 -8.941927 4.052630e-15 5.539439e-11 23.49384
## 219597_s_at 1.6246901 10.636695 8.743700 1.211057e-14 1.324291e-10 22.46704
## 210495_x_at -2.2247812 10.074149 -8.386172 8.599897e-14 7.836656e-10 20.62733
## 205464_at 2.0342073 9.030410 8.290557 1.447645e-13 1.130714e-09 20.13838
## 216442_x_at -2.2269918 9.747865 -8.195711 2.422825e-13 1.655849e-09 19.65479
## 212464_s_at -2.4481475 9.149103 -8.138402 3.304613e-13 1.950668e-09 19.36330
## 213434_at -0.7553377 8.747262 -8.124238 3.567751e-13 1.950668e-09 19.29135
##
## $`groupNormal-groupCancer`
## logFC AveExpr t P.Value adj.P.Val B
## 232855_at 2.353804 7.464893 10.762249 1.485735e-19 8.123254e-15 33.65727
## 206025_s_at -1.407391 6.600127 -10.455133 8.425180e-19 2.303233e-14 31.99032
## 207802_at 6.508949 7.727577 10.008609 1.044759e-17 1.904073e-13 29.57022
## 205464_at 2.730049 9.030410 9.855695 2.468951e-17 2.847392e-13 28.74320
## 212621_at -1.668245 9.041825 -9.816828 3.071485e-17 2.847392e-13 28.53318
## 226506_at 2.672522 10.612391 9.800471 3.367040e-17 2.847392e-13 28.44482
## 210262_at 3.001186 6.730272 9.786321 3.645495e-17 2.847392e-13 28.36840
## 214431_at -1.402298 10.718458 -9.638181 8.369057e-17 5.086653e-13 27.56901
## 202055_at -1.184061 9.912045 -9.638095 8.373092e-17 5.086653e-13 27.56855
## 222835_at 2.873757 11.390512 9.576350 1.183340e-16 6.469909e-13 27.23578
##
## $`groupCIN2-groupCIN1`
## logFC AveExpr t P.Value adj.P.Val B
## 217575_s_at -0.2603589 4.108856 -4.119514 6.827838e-05 0.9999659 -1.555995
## 219450_at 1.3974047 8.021937 4.108238 7.128229e-05 0.9999659 -1.572421
## 204779_s_at 1.0783374 9.084288 3.979722 1.157851e-04 0.9999659 -1.757629
## 214611_at -0.3799563 5.371863 -3.974482 1.180717e-04 0.9999659 -1.765101
## 219358_s_at -0.5104374 7.798451 -3.972613 1.188977e-04 0.9999659 -1.767765
## 216973_s_at 0.9522317 9.119675 3.794046 2.290469e-04 0.9999659 -2.018449
## 242979_at -1.3010652 7.799901 -3.791582 2.310954e-04 0.9999659 -2.021855
## 228152_s_at -1.1207177 8.651740 -3.777430 2.431998e-04 0.9999659 -2.041386
## 235350_at 1.5458201 7.528341 3.714830 3.043333e-04 0.9999659 -2.127184
## 238175_at -0.3896401 4.538269 -3.696149 3.252317e-04 0.9999659 -2.152598
##
## $`groupCIN3-groupCIN1`
## logFC AveExpr t P.Value adj.P.Val B
## 204603_at 0.7024178 8.164955 5.356714 3.887100e-07 0.01455424 5.999781
## 204775_at 0.6352418 7.355724 5.222561 7.081541e-07 0.01455424 5.472794
## 202954_at 0.8500242 10.181699 5.147294 9.876396e-07 0.01455424 5.180686
## 209054_s_at 0.7012696 9.439562 5.130188 1.064782e-06 0.01455424 5.114663
## 225784_s_at -0.5082652 7.521747 -5.022461 1.703992e-06 0.01765170 4.702034
## 226308_at 0.8984545 7.797713 4.964062 2.193210e-06 0.01765170 4.480667
## 209053_s_at 0.7712176 8.902046 4.936377 2.470436e-06 0.01765170 4.376302
## 219490_s_at 0.5818629 8.117920 4.926008 2.582782e-06 0.01765170 4.337314
## 202183_s_at 0.8829252 8.037612 4.885240 3.074616e-06 0.01867829 4.184526
## 226456_at 1.0098740 10.334927 4.802377 4.369883e-06 0.02274771 3.876535
##
## $`groupNormal-groupCIN1`
## logFC AveExpr t P.Value adj.P.Val B
## 210262_at 1.8942513 6.730272 5.109272 1.167105e-06 0.06381149 0.1414762
## 226702_at -1.8232496 9.133420 -4.447203 1.888683e-05 0.51631880 -0.9456764
## 219258_at -0.9936006 8.488497 -4.236185 4.353151e-05 0.59048057 -1.2746881
## 217905_at -0.5415615 8.950872 -4.227458 4.503515e-05 0.59048057 -1.2880906
## 229450_at -1.6129526 9.183332 -4.170784 5.608285e-05 0.59048057 -1.3747156
## 209969_s_at -1.4138293 10.354201 -4.133184 6.479897e-05 0.59048057 -1.4317897
## 204510_at -1.0598884 9.627055 -4.069143 8.270786e-05 0.64600748 -1.5282574
## 227609_at -1.1735956 9.637705 -4.001474 1.067367e-04 0.70559370 -1.6291527
## 210766_s_at -0.6423773 11.534705 -3.978886 1.161471e-04 0.70559370 -1.6625908
## 204994_at -1.1295418 10.139366 -3.914339 1.475994e-04 0.80699981 -1.7574641
##
## $`groupCIN3-groupCIN2`
## logFC AveExpr t P.Value adj.P.Val B
## 31845_at 0.5943656 9.673283 4.745089 5.560039e-06 0.1145089 1.57530720
## 214858_at -0.8133322 5.396801 -4.732526 5.860234e-06 0.1145089 1.54352542
## 232222_at 0.3363060 6.001814 4.715848 6.283067e-06 0.1145089 1.50141268
## 241014_at -1.1644315 6.254372 -4.243388 4.232694e-05 0.5785564 0.34663636
## 205968_at 0.8210918 9.169976 4.159667 5.853537e-05 0.6236596 0.15019705
## 220040_x_at -0.3462818 7.659149 -4.061818 8.503499e-05 0.6236596 -0.07605645
## 229782_at -0.7239349 6.901729 -3.981172 1.151596e-04 0.6236596 -0.25975588
## 1563881_at -0.7137692 4.397457 -3.971422 1.194271e-04 0.6236596 -0.28179416
## 200060_s_at 0.3245884 11.538188 3.970706 1.197462e-04 0.6236596 -0.28341066
## 236010_at -0.5131600 5.533651 -3.936483 1.359910e-04 0.6236596 -0.36045186
##
## $`groupNormal-groupCIN2`
## logFC AveExpr t P.Value adj.P.Val B
## 223556_at -1.445308 9.156569 -7.093800 8.350796e-11 4.565797e-06 13.83546
## 235609_at -1.432506 9.066440 -6.867548 2.666254e-10 7.288873e-06 12.78063
## 201930_at -1.280896 11.792626 -6.667073 7.360367e-10 1.262858e-05 11.85781
## 218039_at -1.450594 11.879667 -6.597757 1.042446e-09 1.262858e-05 11.54149
## 218585_s_at -1.642935 10.431612 -6.577297 1.154877e-09 1.262858e-05 11.44841
## 205909_at -1.310771 9.479550 -6.532028 1.447888e-09 1.319388e-05 11.24291
## 225655_at -1.473806 10.563237 -6.484394 1.835405e-09 1.366560e-05 11.02737
## 226456_at -1.292656 10.334927 -6.467152 1.999539e-09 1.366560e-05 10.94953
## 204026_s_at -1.136500 11.876375 -6.437869 2.312056e-09 1.404574e-05 10.81756
## 228273_at -1.497697 9.925345 -6.403594 2.739372e-09 1.497751e-05 10.66344
##
## $`groupNormal-groupCIN3`
## logFC AveExpr t P.Value adj.P.Val B
## 218585_s_at -2.1455228 10.431612 -9.819011 3.034047e-17 9.812847e-13 28.38863
## 204510_at -1.9576326 9.627055 -9.789077 3.589519e-17 9.812847e-13 28.22861
## 221521_s_at -1.7711864 10.294773 -9.687331 6.353396e-17 1.157906e-12 27.68508
## 222680_s_at -1.8101779 8.533391 -9.265312 6.725115e-16 6.884628e-12 25.43791
## 225655_at -1.8399722 10.563237 -9.254393 7.146915e-16 6.884628e-12 25.37995
## 226456_at -1.6163749 10.334927 -9.244420 7.555147e-16 6.884628e-12 25.32702
## 235609_at -1.6711061 9.066440 -9.158340 1.219785e-15 9.527392e-12 24.87058
## 205339_at -1.8494642 9.227739 -9.117800 1.528068e-15 1.044339e-11 24.65586
## 204603_at -0.9813232 8.164955 -9.000435 2.930854e-15 1.649719e-11 24.03517
## 218039_at -1.7300249 11.879667 -8.995189 3.017319e-15 1.649719e-11 24.00746
ท่านสามารถสรุปข้อมูล DGE ได้โดยใช้ decideTests()
results <- decideTests(cx_fit_contrasts_eB, fc=log2(1.5))
summary(results)
## groupCIN1-groupCancer groupCIN2-groupCancer groupCIN3-groupCancer groupNormal-groupCancer
## Down 2221 3818 2402 6317
## NotSig 50408 47570 50026 40811
## Up 2046 3287 2247 7547
## groupCIN2-groupCIN1 groupCIN3-groupCIN1 groupNormal-groupCIN1 groupCIN3-groupCIN2
## Down 0 34 0 0
## NotSig 54675 54548 54675 54675
## Up 0 93 0 0
## groupNormal-groupCIN2 groupNormal-groupCIN3
## Down 311 2214
## NotSig 54333 50612
## Up 31 1849
vennDiagram(results[,1:5]) # max 5 groups
17.3 Mean-variance relationship
ในบางข้อมูลนั้นมีความสัมพันธ์ระหว่างค่าเฉลี่ยและความแปรปรวน ซึ่งสามารถตรวจสอบได้โดยใช้ plotSA()
plotSA(cx_fit_contrasts_eB)
จากกราฟจะพบความสัมพันธ์ระหว่าง Average log-expression
และ sqrt(sigma)
แปลว่ามีความสัมพันธ์ระหว่างค่าเฉลี่ยและความแปรปรวน เนื่องจาก Linear model นั้นมีสมมติฐานว่า ความแปรปรวนนั้นคงที่ตลอด (Homoscedasticity) การสร้างสมการแบบธรรมดาอาจจะทำให้เกิด False positive มากกว่าปกติ ซึ่ง limma นั้นมีฟังก์ชันที่ปรับสมการตามแนวโน้มของความแปรปรวนด้วย eBayes(..., trend = TRUE)
cx_fit_contrasts_eB_trend <- eBayes(cx_fit_contrasts, trend = TRUE)
results_trend <- decideTests(cx_fit_contrasts_eB, fc = log2(1.5))
summary(results_trend)
## groupCIN1-groupCancer groupCIN2-groupCancer groupCIN3-groupCancer groupNormal-groupCancer
## Down 2221 3818 2402 6317
## NotSig 50408 47570 50026 40811
## Up 2046 3287 2247 7547
## groupCIN2-groupCIN1 groupCIN3-groupCIN1 groupNormal-groupCIN1 groupCIN3-groupCIN2
## Down 0 34 0 0
## NotSig 54675 54548 54675 54675
## Up 0 93 0 0
## groupNormal-groupCIN2 groupNormal-groupCIN3
## Down 311 2214
## NotSig 54333 50612
## Up 31 1849
เมื่อทำการพล็อตความสัมพันธ์ระหว่างค่าเฉลี่ยและความแปรปรวนอีกครั้ง จะพบว่าโมเดลนั้นถูกปรับตามความแปรปรวนแล้ว
plotSA(cx_fit_contrasts_eB_trend)
การใช้ trend = TRUE
นี้มีความสำคัญมากในการประยุกต์ใช้ limma ในการวิเคราะห์ข้อมูลแบบอื่นๆ ที่ไม่ใช่ Microarray เช่น RNA-seq, Proteomics เนื่องจากข้อมูลมักจะมีความสัมพันธ์ระหว่างค่าเฉลี่ยกับตัวแปรสูง (Heteroscedasticity)