将频率数据转换为样本数(整数)的最佳方法是什么?

时间:2016-03-18 21:01:26

标签: r excel rounding frequency

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

*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

1 个答案:

答案 0 :(得分:0)

随机数据集:

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(),您不需要对任何内容进行舍入。虽然,这可能是一个完全不同的主题,但我对此的了解有限。