【问题标题】:R programming: Want to generate random frequenciesR编程:想要生成随机频率
【发布时间】:2014-06-02 07:40:45
【问题描述】:

我想使用 R 生成随机频率(即频率必须等于 1)来模拟群体中的基因频率。我的解决方案是:

freq<- function(x,y)  #random frequency generator, no defined distribution
    {rn<-sample(1:y,x)
    sum <- sum(rn)
    for(i in 1:x){
    RG[i]=rn[i]/sum}
    return(RG)
    }

关于如何在除法之前将总和限制为特定值(例如随机数必须等于 100)的任何建议?

【问题讨论】:

  • 选择 x-1 样本,然后选择 1 - sum(RG)。觉得这段代码看起来效率不高。
  • 您可以将现有函数重写为function(x, y) prop.table(sample(y, x))

标签: r random-sample frequency-distribution genetics


【解决方案1】:

不妨试试这个:

  1. 从均匀分布中生成样本
  2. 排序值
  3. 加0和1
  4. 使用值作为值的分界点

这可能不清楚,所以这里是示例!

set.seed(1)
x <- sort(runif(10))
x
## [1] 0.06178627 0.20168193 0.26550866 0.37212390 0.57285336 0.62911404 0.66079779 0.89838968 0.90820779 0.94467527
x <- c(0,x,1)
y <- diff(x)
y
## [1] 0.061786270 0.139895661 0.063826732 0.106615236 0.200729464 0.056260681 0.031683749 0.237591892 0.009818105 0.036467479 0.055324731
sum(y)
## [1] 1

【讨论】:

    【解决方案2】:

    试试这个:

     freq <- function(x,y)  #random frequency generator, no defined distribution
    { 
      ds <- 50             #desired sum
    
      # assuming an appropriate range and relation between ds, x and y
    
      for(i in 1:100) {
        rn0 <- sample(1:y,x-1)  
        if(sum(rn0) < ds) break()
      }
    
      rn <- c(rn0, ds - sum(rn0))             #desired freq
    
      sum <- sum(rn)
      RG <- 1:x
      for(i in 1:x){
        RG[i]=rn[i]/sum}
      return(RG)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2015-02-05
      • 2011-01-10
      • 2013-02-15
      • 2018-10-24
      • 2013-06-01
      相关资源
      最近更新 更多