【问题标题】:What is a best way to convert frequency data to samples numbers (integers)将频率数据转换为样本数(整数)的最佳方法是什么
【发布时间】:2016-03-18 21:01:26
【问题描述】:

我有一个基因不同等位基因的频率数据和样本总数(1242890)。要进行统计检验(卡方、费舍尔等),我需要看到等位基因的次数。将频率数据转换为每个等位基因(整数)的最准确计数的最佳方法是什么。 R中有什么功能吗?在 excel 中,我尝试过roundup、rounddown 和round:

*Allele*    *Frequency*
Allele1     0.228
Allele2     0.195
Allele3     0.099
Allele4     0.04
Allele5     0.00167
Allele6     0.00127
Allele7     0.027
Allele8     0.117
Allele9     0.016
Allele10    0.027
Allele11    0.00031
Allele12    0.00725
Allele13    0.134
Allele14    0.058
Allele15    0.036
Allele16    0.012

【问题讨论】:

  • 基于此示例的预期输出是什么?
  • 我猜你只是想四舍五入频率和 1242890 的乘积?在 R 中,round(1242890 * Frequency) 这将给出一个整数。您已经尝试过的方法有什么问题?你能举出具体的问题例子吗?
  • 我在 excel 中试过了,但问题是在四舍五入后总计数永远不会等于 1242890,这可能没问题,因为频率值不会加到 1。我认为可能有更好的方法考虑到总数,这改进了舍入

标签: r excel rounding frequency


【解决方案1】:

随机数据集:

category <- letters[1:10]
freq <- runif(10, 0.1, 0.9)
df <- data.frame(category, freq)

   category      freq
1         a 0.3631365
2         b 0.7180477
3         c 0.2827611
4         d 0.8640651
5         e 0.7192371
6         f 0.5747942
7         g 0.3487860
8         h 0.4138134
9         i 0.3984429
10        j 0.1522889

您可以使用 mapply 跨列应用函数:

freqCount <- function(freq, sampleSize){
  result <- freq * sampleSize

  return(result)
}

round(mapply(freqCount, df$freq, sampleSize = nrow(df)))

例如会返回;

  [1] 4 7 3 9 7 6 3 4 4 2

您永远不会得到等于 1242890 的总计数(来自您的评论),因为唯一的方法是将每个频率计数四舍五入为 1。这意味着每个等位基因只会被看到一次.考虑到您要乘以较大的样本量,即使是非常小的频率也会非常大。即使您的样本数据集中的最小频率也是round(1242890*0.00033) = 410。即使数据集中的所有频率都是 0.00001,它也会导致计数为 round(1242890*0.00001)*1242890 = 14914680

说了这么多,你为什么要四舍五入?这意味着您会失去一些准确性。虽然我当然不是统计学专家,但对不准确的数据进行统计测试似乎……很奇怪。据我所知,要在 R 中运行 chisq.test()fisher.test(),您不需要四舍五入。不过,这可能是一个完全不同的话题,我对此的了解有限。

【讨论】:

  • 我之前考虑过这个,但我认为四舍五入是更好的选择,因为这是个人数据,应该谨慎。所以你不能让我们说 9999.7231 个具有特定等位基因的个体,它应该是 9999 或 10000。
猜你喜欢
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多