【问题标题】:Wilcoxon Test in a loop for a number of datasets at the same time同时对多个数据集进行 Wilcoxon 测试
【发布时间】:2020-09-13 23:40:34
【问题描述】:

我有一个问题,我是否可以在循环中对所有生成的表进行 Wilcoxon 测试。

基本上,我想在每个数据集的 2 个变量之间进行配对 Wilcoxon 检验,并且每个数据集的 2 个变量位于相同的位置(如第 x 列和第 y 列)。 (对于熟悉生物学的人来说,实际上这是一些重复元素的控制样本和处理样本之间的 RPKM 值)我希望我可以为每个数据集的 Wilcoxon 检验生成一个 p 值表。

我已准备好使用以下代码生成所有表/数据集/数据框,我想我想对每个数据集进行 Wilcoxon 测试,所以我认为我需要继续循环,但我不知道该怎么做:

data=sample_vs_norm
filter=unique(data$family)

for(i in 1:length(filter)){
  table_name=paste('table_', filter[i], sep="")
  print(table_name)
  assign(table_name, data[data$Subfamily == filter[i]])

这是单个数据集的结构: 所以基本上我想在变量“R009_initial_filter_rpkm”和“normal_filter_rpkm”之间做一个 Wilcoxon 测试

 Chr     Start       End Mappability Strand R009_initial_filter_NormalizedCounts
1: chr11 113086868 113087173           1      -                                        2
2:  chr2  24290845  24291132           1      -                                       11
3:  chr4  15854425  15854650           1      -                                        0
4:  chr6  43489623  43489676           1      +                                       11
   normal_filter_NormalizedCounts R009_initial_filter_rpkm
1:                                         14.569000                     0.169752
2:                                          1.000000                     0.992191
3:                                         14.815900                     0.000000
4:                                          0.864262                     5.372810
   normal_filter_rpkm FoldChange     p.value         FDR FoldChangeFPKM
1:                              1.236560   0.137278 0.999862671 1.000000000      0.1372776
2:                              0.000000  11.000000 0.003173828 0.008149271            Inf
3:                              1.704630   0.000000 1.000000000 1.000000000      0.0000000
4:                              0.422137  12.727600 0.003173828 0.008149271     12.7276453
   
structure(list(Chr = structure(1:4, .Label = c("chr11", "chr2", 
"chr4", "chr6"), class = "factor"), Start = c(113086868L, 24290845L, 
15854425L, 43489623L), End = c(113087173L, 24291132L, 15854650L, 
43489676L), Mappability = c(1L, 1L, 1L, 1L), Strand = structure(c(1L, 
1L, 1L, 2L), .Label = c("-", "+"), class = "factor"), R009_initial_filter_NormalizedCounts = c(2L, 
11L, 0L, 11L), normal_filter_NormalizedCounts = c(14.569, 
1, 14.8159, 0.864262), R009_initial_filter_rpkm = c(0.169752, 
0.992191, 0, 5.37281), normal_filter_rpkm = c(1.23656, 
0, 1.70463, 0.422137), FoldChange = c(0.137278, 11, 0, 12.7276
), p.value = c(0.999862671, 0.003173828, 1, 0.003173828), FDR = c(1, 
0.008149271, 1, 0.008149271), FoldChangeFPKM = c(0.1372776, Inf, 
0, 12.7276453), class = "data.frame", row.names = c(NA, 
-4L))

对不起,如果我使用了不正确的术语,因为我是 R 的新手,非常感谢您的帮助

【问题讨论】:

  • 请编辑您的帖子以制作一个可重复的最小示例。见stackoverflow.com/questions/5963269。您必须包含一些示例数据;通常 4-10 行就足够了。包括您希望输出看起来像的示例。意识到:您的听众中几乎没有人知道或关心 RPKM 或 WIlcox 测试,我们不想通过阅读来理解它们。我们希望帮助您了解如何迭代多个单一测试。
  • 将所有 Wilcox 代码封装在一个函数中,并确保它正确地进行了一次测试。然后编辑您的帖子,询问我们如何遍历所有案例。
  • 嗨郭,欢迎来到 Stack Overflow。我同意大卫的观点,你的问题应该浓缩成更短的内容,如果我们有一个可重复的例子,它会更容易提供帮助。但是,我不同意引入问题是没有用的。 how to ask a good question 帮助页面甚至谈到了介绍。
  • 非常感谢您的评论,我对问题的设置感到抱歉,因为我对编码/R 等真的很陌生,因为我以前通常做湿实验室,我不太清楚如何用程序员的语言进行交流。如果可以的话,我会尝试修复它... thx
  • 我已经对问题进行了更改,请随时发表任何评论/建议/批评,以便我可以向你们学习,非常感谢!!

标签: r loops statistics filtering rna-seq


【解决方案1】:

一种方法是在data.table 中使用by = 进行分组。

library(data.table)
setDT(data)
data[,wilcox.test(R009_initial_filter_rpkm,
                  normal_filter_rpkm)[c("statistic","p.value")],
     by = TE_Subfamily]
#   TE_Subfamily statistic p.value
#1:       AluYf4       7.5       1

您可以按任意数量的变量进行分组,例如TE_SubfamilyChr

data[TE_Subfamily %in% filter,
     wilcox.test(R009_initial_filter_rpkm,
                  normal_filter_rpkm)[c("statistic","p.value")],
     by = .(TE_Subfamily,Chr)]
#   TE_Subfamily   Chr statistic p.value
#1:       AluYf4 chr11         0       1
#2:       AluYf4  chr2         1       1
#3:       AluYf4  chr4         0       1
#4:       AluYf4  chr6         1       1

如果您只需要对某些TE_Subfamily 进行比较,您可以尝试以下操作:

filter <- c("AluYf4")
data[TE_Subfamily %in% filter,
     wilcox.test(R009_initial_filter_rpkm,
                  normal_filter_rpkm)[c("statistic","p.value")],
     by = TE_Subfamily]
#   TE_Subfamily statistic p.value
#1:       AluYf4       7.5       1

对于奖励积分,您可以进行多次测试:

data[TE_Subfamily %in% filter,
     wilcox.test(R009_initial_filter_rpkm,
                  normal_filter_rpkm)[c("statistic","p.value")],
     by = TE_Subfamily][,adjusted.p.value := p.adjust(p.value,method = "bonferroni")][]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2021-09-29
    • 2019-09-22
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多